Erlang ct:run_test 依赖项
Erlang ct:run_test dependencies
我尝试 运行 来自 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 中正确地 运行 它?
我发现问题不在依赖关系中。
我编写了重现问题的示例 code。
当 运行 ct:run_test/1 来自 erlang shell.[=37= 时,应该始终设置 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
不再导出!
我尝试 运行 来自 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 中正确地 运行 它?
我发现问题不在依赖关系中。 我编写了重现问题的示例 code。
当 运行 ct:run_test/1 来自 erlang shell.[=37= 时,应该始终设置 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
不再导出!