到目前为止,最常见的方法是每个应用程序模块一个测试模块。如果您正确命名模块,EUnit 会为您找到并运行所有测试,无需创建运行测试的全局模块。例如,给定:
- 源/
- 测试/
- meck_tests.erl
- meck_mod_tests.erl
如果您运行eunit:test(meck),它将检测(如果在您的路径上)模块meck_tests 并运行meck_tests:test()。当您包含eunit.hrl 时,EUnit 会自动将test() 函数插入到模块中。
至于命名约定,我通常会以这样的方式结束:
-module(my_tests).
-export([functiona_should_do_this/0]).
-export([functionb_should_do_that/0]).
-export([functionb_should_not_crash/0]).
% etc
如果您希望在测试运行中出现好的名称,请使用 EUnit 的测试生成器功能:
all_my_test_() ->
[{"Should not break X", fun first_test/0},
{"Should perform Y", fun other_test/0}].
任何以test_ 结尾的函数都会告诉EUnit 它应该返回一个测试列表(这称为测试生成器)。测试列表可以只包含一个有趣的列表、一个元组列表,其中第一个元素是测试的字符串描述,或者更复杂的设置:
advanced_test_() ->
{foreach, fun setup/0, fun teardown/1,
[{"Assert X", fun test1/0}]}.
这将在每个测试用例之前运行setup/0,在每个测试用例之后运行teardown/1。 teardown/1 的参数是来自 setup/0 的返回值。您可以随意命名这些函数。
有关于如何使用 EUnit available here 的综合文档。
这是我的测试模块的样子:https://github.com/eproxus/meck/blob/master/test/meck_tests.erl