使用Erlang EUnit测试更人性化的消息?

使用Erlang EUnit测试更人性化的消息?,erlang,eunit,Erlang,Eunit,我习惯于JavaScript测试,尤其是它的BDD框架和库,比如我可以用人性化的方式描述测试,并用字符串命名测试,例如“UserProfile->updatefirstname”,然后在运行测试时将这些消息作为输出 是否可以以更自然的方式编写Erlang测试,或者至少将描述集成到测试运行过程中,而不只是将它们作为注释,而是查看失败测试的名称?是的。要向测试添加描述,测试需要是“测试对象”,而不是普通测试。例如,更改此测试: foo_test() -> run_foo(),

我习惯于JavaScript测试,尤其是它的BDD框架和库,比如我可以用人性化的方式描述测试,并用字符串命名测试,例如“UserProfile->updatefirstname”,然后在运行测试时将这些消息作为输出


是否可以以更自然的方式编写Erlang测试,或者至少将描述集成到测试运行过程中,而不只是将它们作为注释,而是查看失败测试的名称?

是的。要向测试添加描述,测试需要是“测试对象”,而不是普通测试。例如,更改此测试:

foo_test() ->
    run_foo(),
    ensure_foo_works().
为此:

foo_test_() ->
    ?_test(
      begin
        run_foo(),
        ensure_foo_works()
      end).
也就是说,函数的名称应该以
\u test\u
结尾,测试的主体应该包装在
?\u test
宏中。还有其他以下划线开头的“包装宏”;例如,一个简单的断言可以这样重写:

%% before
check_foo_test() ->
    ?assertEqual(ok, foo()).

%% after
check_foo_test_() ->
    ?_assertEqual(ok, foo()).
一旦有了“测试对象”,就可以将其包装在元组中,其中第一个元素是字符串:

foo_test_() ->
    {"Ensure that foo works",
     ?_test(
       begin
         run_foo(),
         ensure_foo_works()
       end)}.

check_foo_test_() ->
    {"Check that foo is ok", ?_assertEqual(ok, foo())}.
测试失败时,将打印这些说明。如果在详细模式下运行eunit,则在测试执行时也会打印它们