EUnit与普通测试

时间:2013-08-03 09:14:55

标签: erlang

我是Erlang的新手。它有2个测试框架:EUnit和Common Test。我很困惑何时使用一个而不是另一个。有人可以向我解释一下EUnit相对于Common Test的优点是什么,反之亦然。似乎Common Test可以完成EUnit可以做的所有事情以及更多,不确定我应该使用EUnit。谢谢!

3 个答案:

答案 0 :(得分:13)

Learn you some erlang(除了官方文档之外,erlang最好的在线资源之一)很好地解释了这两种方法:

正如Pascal所指出的,EUnit最适用于白盒测试,更像是内部功能单元测试,轻集成测试。

普通测试可以解决更为繁重的问题:集成和扩展系统测试,黑盒子的东西。当然,它也更复杂,也更强大。

虽然您正在使用它,但您可以尝试使用Dialyzer,这是Erlang / OTP中的另一个集成测试工具,它非常适合查找无法访问或无法访问的代码,逻辑&类型错误(它是一个静态类型分析器)。再次,了解一些erlang 提供了一个很好的介绍:Dialyzer

哦,顺便说一句,如果您选择将EUnit测试放在单独的文件中(这是完全可能的),您将无法测试未导出的功能(这是预期的)。还期望Common Test不测试未导出的功能:否则它不会是一个黑盒测试工具(可能是作弊的)。

答案 1 :(得分:6)

Eunit非常简单,非常适合白盒级别的模块测试或库测试。它被整合到钢筋中。

Common Test更适用于黑盒测试和应用程序测试系统。它非常容易提供测试覆盖率。

编辑(在安迪评论之后):

您可以使用通用测试进行单一的白盒测试,并且您可以使用灯具将eunit用于某些应用测试。

然而,eUnit对于简单的单一测试非常方便:你编写了一个函数myFun,你在测试模块中添加了一个测试函数myFun_test或一个测试生成器myFun_test_(用于测试许多模式,甚至是中间的一些测试失败)而已。您可以根据需要随时运行它(没有测试历史记录)。

通用测试要求您在all函数或组中列出每个测试用例。据我所知,它没有测试生成器,因此不太容易通过每个函数的所有测试模式。这就是为什么我认为它不太适合单一的白盒测试。另一方面,init_per_testcase,init_per_group ...比eunit fixtures更灵活,以便在需要运行某些应用程序上下文时组织测试。 Common Test还保留了在日志目录中完成的所有测试的历史记录,这很好,但我建议限制运行次数以保持其有用。

修改

为了避免未导出函数的问题,对于eunit和common测试,都可以使用define。例如在rebar.config中(因为我使用单独的文件进行eunit测试):

{eunit_compile_opts, [{d,'EUNIT_TEST',true}]}.
{erl_opts, [debug_info, warn_export_all]}.

并在模块中,如果有必要:

%% export all functions when used in eunit context
-ifdef(EUNIT_TEST).
-compile(export_all).
-endif.

您可以验证它是否仅修改了eunit的编译代码

D:\git\helper>rebar clean eunit compile
==> helper (clean)
==> helper (eunit)
Compiled test/help_list_tests.erl
Compiled test/help_ets_tests.erl
Compiled test/help_num_tests.erl
Compiled src/help_ets.erl
Compiled src/help_list.erl
Compiled src/helper.erl
src/help_num.erl:6: Warning: export_all flag enabled - all functions will be exported
Compiled src/help_num.erl
Compiled src/help_code.erl
  All 31 tests passed.
Cover analysis: d:/git/helper/.eunit/index.html
==> helper (compile)
Compiled src/help_ets.erl
Compiled src/help_list.erl
Compiled src/helper.erl
Compiled src/help_num.erl
Compiled src/help_code.erl

答案 2 :(得分:0)

来自http://www.erlang.org/doc/apps/common_test/basics_chapter.html

Common Test也是用于白盒测试Erlang代码(例如模块测试)的非常有用的工具,因为测试程序可以直接调用导出的Erlang函数,并且实现基本测试套件和执行简单测试所需的开销非常小。对于黑盒测试Erlang软件,可以使用Erlang RPC以及标准的O& M接口。