Дізнаймося, як тестувати свої вправи з Factor на Exercism
Коли ми завантажуємо вправу, Exercism зберігає її як самодостатню теку, наприклад ~/exercism/factor/hello-world. У цій теці є підтека з нашим рішенням і ще одна із засобом запуску тестів:
hello-world/
├── hello-world/
│ ├── hello-world.factor <- your solution
│ └── hello-world-tests.factor <- the tests
└── exercism-tools/ <- the bundled test runner
Перейдіть командою cd до кореня цієї теки та запустіть тести так:
factor -roots=. -run=exercism-tools <exercise>
Замініть <exercise> на назву вправи (ту саму, що й назва теки). Наприклад, щоб протестувати hello-world:
cd ~/exercism/factor/hello-world
factor -roots=. -run=exercism-tools hello-world
Запускайте команду з кореня теки вправи, тобто з каталогу, у якому лежать обидві підтеки: <exercise> і exercism-tools.
Це ті самі тести, які Exercism запускає, коли ми подаємо рішення, тож щойно всі вони проходять локально, ми готові подавати.
Кожна вправа починається з того, що активний лише її перший тест. Решту тестів стримує рядок STOP-HERE у файлі <exercise>-tests.factor; засіб запуску ігнорує все, що нижче за нього.
"year not divisible by 4 in common year" description
{ f } [ 2015 leap-year? ] unit-test
STOP-HERE
"year divisible by 2, not divisible by 4 in common year" description
{ f } [ 1970 leap-year? ] unit-test
Домагайтеся, щоб перший тест проходив, потім перемістіть STOP-HERE нижче наступного тесту (або видаліть його, щоб увімкнути всі) і знову запустіть тести. Просувайтеся файлом у такий спосіб, доки всі тести не почнуть проходити.
Коли ми подаємо рішення, засіб запуску Exercism ігнорує STOP-HERE і запускає кожен тест, тож переконайтеся, що всі вони проходять, перш ніж подавати.
Засіб запуску друкує кожен тест, який він виконав, і тихо завершує роботу:
Unit Test: { { f } [ 2015 leap-year? ] }
Засіб запуску показує тест, а потім очікуване значення поряд зі значенням, яке видав наш код:
Unit Test: { { f } [ 2015 leap-year? ] }
--> test failed!
###FAIL_BEGIN###
leap/leap-tests.factor: 5
=== Expected:
f
=== Got:
t
###FAIL_END###
Тут тест виконав 2015 leap-year? і очікував побачити f на стеку, але отримав t.
Тести пишуть за допомогою unit-test, який приймає масив, що описує, як має мати вигляд стек після виконання quotation:
{ 3 } [ 1 2 + ] unit-test
Це запускає [ 1 2 + ] і перевіряє, що він залишає 3 на стеку. Порожній масив, { }, означає, що quotation має залишити стек порожнім. Необовʼязковий рядок description над тестом просто дає йому зрозумілу назву.
Докладніше про це можна прочитати в документації Factor про модульне тестування.