我是 Erlang 的新手。它有 2 个测试框架:EUnit 和 Common Test。我很困惑何时使用一个而不是另一个。有人可以向我解释 EUnit 相对于 Common Test 的优势是什么,反之亦然。似乎 Common Test 可以做 EUnit 可以做的所有事情,甚至更多,不确定我应该使用 EUnit。谢谢!
3 回答
向你学习一些 erlang(除了官方文档之外,erlang 最好的在线资源之一)很好地解释了这两种方法:
正如 Pascal 指出的那样,EUnit 最适合用于白盒测试,更像是内部逐个功能的单元测试、轻量级集成测试。
Common Test 做了更繁重的工作:集成和系统测试,黑盒之类的东西。当然,它也更复杂,也更强大。
当您使用它时,您可能会尝试 Dialyzer,这是 Erlang/OTP 中的另一个集成测试工具,它非常适合定位死代码或无法访问的代码、逻辑和类型错误(它是一个静态类型分析器)。再次,学习一些 erlang提供了一个很好的介绍:Dialyzer。
哦,顺便说一句,如果您选择将 EUnit 测试放在单独的文件中(这是完全可能的),您将无法测试未导出的函数(这是预期的)。还可以预料的是,Common Test 不会测试未导出的函数:否则它就不是黑盒测试工具(可能是作弊工具)。
Eunit 非常简单,非常适合白盒级别的模块测试或库测试。它与钢筋集成。
Common Test 更面向黑盒测试和应用程序测试系统。它很容易带有测试覆盖率。
编辑(在安迪评论之后):
您可以使用 Common test 进行单一白盒测试是正确的,并且您可以使用 eunit 使用夹具进行某些应用程序测试也是正确的。
然而,eUnit 对于简单的单一测试非常方便:你编写一个函数 myFun,在你的测试模块中添加一个测试函数 myFun_test 或一个测试生成器 myFun_test_(对测试许多模式很有用,即使中间有一些测试失败),就是这样。您可以随心所欲地运行它(没有测试历史记录)。
通用测试要求您列出所有功能或组中的每个测试用例。据我所知,它没有测试生成器,因此不太容易通过每个功能的所有测试模式。这就是为什么我认为它不太适合单一的白盒测试。另一方面,init_per_testcase、init_per_group ... 比 eunit 固定装置更灵活,可以在需要一些应用程序上下文运行时组织测试。Common Test 还在日志目录中保留了所有测试的历史记录,这很好,但我建议限制运行次数以保持有用。
编辑:
为了避免函数没有导出的问题,对于eunit和common test,都可以使用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
来自http://www.erlang.org/doc/apps/common_test/basics_chapter.html:
Common Test 也是白盒测试 Erlang 代码(例如模块测试)的一个非常有用的工具,因为测试程序可以直接调用导出的 Erlang 函数,并且实现基本测试套件和执行简单测试所需的开销非常小。对于 Erlang 软件的黑盒测试,例如可以使用 Erlang RPC 以及标准的 O&M 接口。