Factorトラックでのテスト

ExercismでFactorの演習をテストする方法を学びます。


演習をダウンロードすると、Exercismはそれを自己完結した1つのフォルダーとして保存します。たとえば~/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が実行するテストと同じものです。ですから、ローカルですべてパスすれば、提出する準備はできています。

テストは1つずつ

各演習では、最初は最初のテストだけが有効になっています。残りのテストは、<exercise>-tests.factorファイルの中のSTOP-HEREという行で止められており、テストランナーはそれより下をすべて無視します。

"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を使って書きます。unit-testは、クォーテーションを実行したあとにスタックがどうなっているべきかを表す配列を受け取ります。

{ 3 } [ 1 2 + ] unit-test

これは[ 1 2 + ]を実行し、スタックに3が残ることを確かめます。空の配列{ }は、クォーテーションがスタックを空のままにすることを意味します。テストの上にある省略可能なdescriptionの行は、テストに読みやすい名前を付けるだけのものです。

さらに詳しく知りたい場合は、Factorの単体テストに関するドキュメントを見てください。