在 Factor 軌道上測試

了解如何在 Exercism 上測試你的 Factor 練習


當你下載一個練習時,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 所執行的同一批測試,所以只要它們在本地全部通過,你就可以提交了。

一次一個測試

每個練習在一開始都只啟用第一個測試。其餘的測試會被 <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 寫成的,它會接收一個陣列,描述在執行一段 quotation 之後,堆疊應該會是什麼樣子:

{ 3 } [ 1 2 + ] unit-test

這會執行 [ 1 2 + ],並檢查它在堆疊上留下 3。空陣列 { } 表示這段 quotation 應該讓堆疊維持空的。測試上方那行選用的 description 只是給它一個好讀的名稱。

想了解更多細節,請參閱 Factor 關於單元測試的說明文件。