【问题标题】:Best practices/conventions for writing Erlang unit tests using eunit使用 eunit 编写 Erlang 单元测试的最佳实践/约定
【发布时间】:2011-09-20 22:29:41
【问题描述】:

我目前正在学习 Erlang,想知道单元测试有哪些好的实践或约定?我目前正在使用eunit。

提出这个问题:

  • 我目前正在为每个函数编写一个单元测试模块,这样我的测试名称就非常简单,并且采用 should_do_desired_behaviour_test() 的形式。

  • 我开始为我编写的每个模块使用一个模块,但感觉不对,因为命名测试变得越来越笨拙,并且测试模块感觉杂乱无章。

  • 我预见到的问题是我所采取的方法最终会产生许多需要执行的模块。然后我需要某种全局模块来运行每个测试模块中的所有测试。

所以我想我不太确定要采取什么方法,或者我是否在这方面遥遥领先。您通常如何管理单元测试?

干杯。

【问题讨论】:

    标签: unit-testing erlang


    【解决方案1】:

    到目前为止,最常见的方法是每个应用程序模块一个测试模块。如果您正确命名模块,EUnit 会为您找到并运行所有测试,无需创建运行测试的全局模块。例如,给定:

    • 源/
      • meck.erl
      • meck_mod.erl
    • 测试/
      • 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/1teardown/1 的参数是来自 setup/0 的返回值。您可以随意命名这些函数。

    有关于如何使用 EUnit available here 的综合文档。

    这是我的测试模块的样子:https://github.com/eproxus/meck/blob/master/test/meck_tests.erl

    【讨论】:

      【解决方案2】:

      亚当给了你一种方法。另一种方法(在我有限的经验中更常见的一种)是将单元测试放在每个模块的末尾,like this。这样你就可以将模块和它的测试代码组合在同一个文件中。如果您的测试函数的名称以“_test”结尾,EUnit 会在您调用 eunit:test(module) 或 module:test() 时自动识别它们(您不必自己编写 module:test() 函数,EUnit为您导出)。

      至于多个测试功能:如果您不想这样做,则不必这样做。如果您愿意,可以将所有测试用例堆叠在同一个函数中,例如:

      whatever_test() ->
          234 = foo(bar),
          345 = foo(baz),
          [...]
          foobar = quux(baz).
      

      就是这样。有些人喜欢将每个测试放在自己的函数中,有些人喜欢将它堆叠在一个函数中。我通常将类似的测试分组到一个函数中,最终得到 3-4-5 个测试函数。看看哪个适合你。

      关于“全局测试模块”,Adam 再次给了你一个很好的建议。而且,还有另一种选择:rebar。它是一个可以帮助您测试 erlang 应用程序(以及更多)的工具。请参阅此处获取教程:http://vimeo.com/8311407 Rebar 将简单地自动检测模块内的测试函数并为您运行这些函数。

      【讨论】:

      • 是的,rebar 真的让这变得容易多了。强烈推荐。
      • rebar3 继续帮助启动 EUnit 测试:rebar3 eunit 和通用测试:rebar3 ct
      猜你喜欢
      • 2016-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      • 2016-02-20
      相关资源
      最近更新 更多