我已经阅读了关于EUnit的documentation,但我仍然不知道测试生成器的用途是什么。
我也读过一个很好的教程here,但还是没有运气(有点太高级了)。
我有点理解测试生成器函数返回一组测试,然后由EUnit执行这些测试。(是这样吗?)
不幸的是,我现在唯一有信心的事情是我可以像这样写一个测试:
myfun_test() ->
assertEqual(myresult,mymod:myfun()).问题是: EUnit中的测试生成器是用来做什么的,它们与简单的测试对象有什么关系?
附注:我知道有一个奇妙的单元测试世界(example),它是在各种自动化工具和概念的帮助下完成的,但我不知道如何进入它。
发布于 2012-05-17 06:53:10
我认为如果你已经尝试为你的项目编写了许多单元测试,你会在实践中发现测试生成器的价值。
如果使用测试生成器,您不需要花费时间来创建许多不同的测试函数名称,并且用于创建测试生成器的代码比标准函数更短。
例如,以下代码来自用于测试生成器的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())
]}.发布于 2012-05-17 15:47:56
从你的问题中链接的页面上阅读:
简单测试函数的一个缺点是您必须为每个测试用例编写一个单独的函数(具有单独的名称)。编写测试的一种更紧凑的方法(正如我们将看到的,也更加灵活)是编写返回测试的函数,而不是测试。
名称以...test() (注意最后一个下划线)结尾的函数被EUnit识别为测试生成器函数。测试生成器返回将由EUnit执行的一组测试的表示。
考虑测试生成器对测试分组的可能性。除了拥有更紧凑的代码之外,您还可以为您的测试提供高级功能。例如,测试集的状态、初始化函数等等。
如果您的应用程序只需要一组断言,那么您可能不需要测试集。你甚至可以避免使用EUnit作为一个整体。Erlang中的模式匹配(=)操作符本身就是一个出色的测试操作符。比较:
assertEqual(myresult,mymod:myfun()).通过以下方式:
myresult = mymod:myfun()https://stackoverflow.com/questions/10627563
复制相似问题