【问题标题】:EUnit vs. Common TestEUnit 与通用测试
【发布时间】:2013-08-04 13:42:48
【问题描述】:

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

【问题讨论】:

    标签: erlang


    【解决方案1】:

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

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

    Common Test 完成了更繁重的工作:集成和系统测试,黑盒之类的东西。当然,它也更复杂,也更强大。

    当您使用它时,您可以尝试 Dialyzer,这是 Erlang/OTP 中的另一个集成测试工具,它非常适合定位死代码或无法访问的代码、逻辑和类型错误(它是一个静态类型分析器)。同样,Learn you some erlang 提供了一个很好的介绍:Dialyzer

    哦,顺便说一句,如果您选择将 EUnit 测试放在单独的文件中(这是完全可能的),您将无法测试未导出的函数(这是意料之中的)。同样值得期待的是,Common Test 不会测试未导出的函数:否则它就不是黑盒测试工具(可能是作弊工具)。

    【讨论】:

    • 您可以在测试上下文中导出所有函数,但更重要的是区分黑盒测试(不允许 export_all)和白盒测试(做你想做的)。见编辑。
    • 我确认网站 Learn you some erlang 是最适合 erlang 的网站之一。
    【解决方案2】:

    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
    

    【讨论】:

    • 感谢帕斯卡。我和一些 Erlang 工程师谈过,我得到的唯一原因是 common_test 无法测试未导出的函数。
    • 这不是真的,你在源模块中嵌入了测试,所以你可以测试任何你想要的。
    • 我在安迪评论后编辑了我的答案。我不知道这种使用普通测试的方式,我在 test_SUITE.erl 模块中编写测试用例
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-06
      • 2012-02-28
      • 2011-12-27
      • 2012-05-24
      • 1970-01-01
      • 2014-12-19
      • 2015-01-21
      • 2016-06-03
      • 2015-06-13
      相关资源
      最近更新 更多