【问题标题】:What are EUnit test generators?什么是 EUnit 测试生成器?
【发布时间】:2012-05-24 13:09:39
【问题描述】:

我已经阅读了关于 EUnit 的 documentation,但我仍然不知道测试生成器的用途是什么。

我还阅读了一篇不错的教程here,但仍然没有运气(有点太高级了)。

我有点理解测试生成器函数返回一组测试,然后由 EUnit 执行。 (对吗?)

不幸的是,我现在唯一有信心的是我可以编写这样的测试:

myfun_test() ->
assertEqual(myresult,mymod:myfun()).

问题是: EUnit 中需要哪些测试生成器,它们与简单测试对象有什么关系?

附:我知道有一个很棒的世界 (example) 是借助各种自动化工具和概念制作的单元测试,但我不知道如何进入。

【问题讨论】:

    标签: unit-testing erlang generator eunit


    【解决方案1】:

    我想如果你尝试为你的项目写过很多单元测试,你会在实践中发现测试生成器的价值。

    如果使用测试生成器,您不需要花费时间来创建许多不同的测试函数名称,并且创建测试生成器的代码比标准函数短。

    例如,以下代码来自gproc测试生成器开源项目,它使用测试生成器供您参考,文件可以在github.找到

    reg_test_() ->
        {setup,
         fun() ->
                 application:start(gproc),
             application:start(mnesia)
         end,
         fun(_) ->
                 application:stop(gproc),
             application:stop(mnesia)
         end,
         [
          {spawn, ?_test(?debugVal(t_simple_reg()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_simple_counter()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_simple_aggr_counter()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_update_counters()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_simple_prop()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_await()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_await_self()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_await_crash()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_simple_mreg()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_gproc_crash()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_cancel_wait_and_register()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_give_away_to_pid()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_give_away_to_self()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_give_away_badarg()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_give_away_to_unknown()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_give_away_and_back()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_select()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_select_count()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_qlc()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_get_env()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_get_set_env()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_set_env()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_get_env_inherit()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_monitor()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_monitor_give_away()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_subscribe()))}
          , ?_test(t_is_clean())
          , {spawn, ?_test(?debugVal(t_gproc_info()))}
          , ?_test(t_is_clean())
         ]}.
    

    【讨论】:

      【解决方案2】:

      从您在问题中链接的页面阅读:

      简单测试函数的一个缺点是您必须编写一个单独的 每个测试用例的函数(具有单独的名称)。更紧凑的方式 编写测试(并且更灵活,正如我们将看到的)是 编写返回测试的函数,而不是测试。

      名称以 ...test() 结尾的函数(注意最后 underscore) 被 EUnit 识别为测试生成器函数。测试 生成器返回要执行的一组测试的表示 EUnit。

      考虑对生成器进行分组测试的可能性。除了拥有更紧凑的代码之外,您还可以为您的测试提供高级功能。例如,您的一组测试的状态、初始化函数等等。

      如果您的应用程序只需要一组断言,那么您可能不需要测试集。你甚至可以避免使用整个 EUnit。 Erlang 中的模式匹配 (=) 运算符本身就是一个出色的测试运算符。比较:

      assertEqual(myresult,mymod:myfun()).
      

      与:

      myresult = mymod:myfun()
      

      【讨论】:

        猜你喜欢
        • 2017-09-06
        • 2012-05-26
        • 2016-07-14
        • 2012-04-06
        • 1970-01-01
        • 1970-01-01
        • 2019-05-20
        • 2013-08-04
        • 2012-02-28
        相关资源
        最近更新 更多