【问题标题】:Erlang ct:run_test dependenciesErlang ct:run_test 依赖项
【发布时间】:2016-08-01 08:00:36
【问题描述】:

我尝试使用命令从 erl shell 运行常用测试套件:

> ct:run_test([{spec,"test/spec"}]).

测试套件因错误而失败:

undefined function eredis:start_link/3

但是如果我在 shell 中输入这个:

> eredis:module_info().

我可以看到依赖模块 eredis 已加载:

[{exports,[{start_link,0},
{start_link,2},
...
{start_link,6},
...

为什么 ct:run_test 看不到依赖模块以及如何从 erl shell 正确运行它?

【问题讨论】:

  • erediseredis_client 是两个独立的模块。
  • 谢谢Amiramix。这是我的错字。实际上 eredis_client 是 eredis 的一部分,它也被加载:> eredis:module_info(). [{exports,[{start_link,0}, {start_link,2}, ... {start_link,6} ct:run_test 两次不同的测试运行给了我两个不同的错误,但现在我想弄清楚为什么 ct:run_test 命令因任何依赖而失败。
  • 您的问题现在没有在导出列表中列出start_link/3,该错误抱怨它不存在。您确定 start_link/3 已导出吗?如果是这样,请适当地编辑问题。

标签: erlang common-test


【解决方案1】:

我发现问题不在于依赖项。 我写了重现问题的示例code

从 erlang shell 运行 ct:run_test/1 时,应始终设置 ebin 目录的绝对路径(使用 -pa 选项)。

其他常见测试从 erlang shell 开始,命令如下:

$ ./rebar3.1 compile && erl -pa _build/default/lib/ct_fail/ebin/
> ct:run_test([{spec,"test/spec"}]).

将因错误而失败:

=== ERROR! init_per_testcase crashed!
    Location: [{ct_fail,start_link},
 {fail_SUITE,init_per_testcase,16},
 {test_server,do_init_per_testcase,1191},
 {test_server,run_test_case_eval1,955},
 {test_server,run_test_case_eval,926}]
    Reason: {undef,[{ct_fail,start_link,[1,2],[]},
                        {fail_SUITE,init_per_testcase,2,
                                    [{file,"fail_SUITE.erl"},{line,16}]},
                        {test_server,do_init_per_testcase,2,
                                     [{file,"test_server.erl"},{line,1191}]},
                        {test_server,run_test_case_eval1,6,
                                     [{file,"test_server.erl"},{line,955}]},
                        {test_server,run_test_case_eval,9,
                                     [{file,"test_server.erl"},{line,926}]}]}

最有趣的部分是在测试运行之前执行module_info命令时:

$ ./rebar3.1 compile && erl -pa _build/default/lib/ct_fail/ebin/
> ct_fail:module_info().
ct_fail:module_info().
[{module,ct_fail},
 {exports,[{start_link,0},
           {start_link,1},
           {start_link,2},
           {start_link,3},
           {start_link,4},
           {init,1},
           ...

> ct:run_test([{spec,"test/spec"}]).

那么测试就会成功!

顺便说一下测试失败的时候:

$ ./rebar3.1 compile && erl -pa _build/default/lib/ct_fail/ebin/
> ct:run_test([{spec,"test/spec"}]).
...

导致测试失败的函数调用从模块导出列表中消失:

> ct_fail:module_info().
[{module,ct_fail},
 {exports,[{start_link,0},
           {start_link,1},
           {start_link,3},
           {start_link,4},
           {init,1},
           ...

ct_fail:start_link/2 不再导出!

【讨论】:

    猜你喜欢
    • 2017-07-29
    • 1970-01-01
    • 2014-10-11
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2014-09-18
    • 2014-07-19
    相关资源
    最近更新 更多