在 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 文档中关于单元测试的部分。