Erlang ct:run_test зависимости

Я пытаюсь запустить общие тестовые наборы из оболочки erl с помощью команды:

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

Набор тестов завершается с ошибкой:

undefined function eredis:start_link/3

Но если я наберу в оболочке это:

> eredis:module_info().

Я вижу, что зависимый модуль eredis был загружен:

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

Почему ct:run_test не видит зависимые модули и как правильно запустить его из оболочки erl?

1 ответ

Решение

Я обнаружил, что проблема не в зависимостях. Я написал пример кода, который воспроизводит проблему.

При запуске ct:run_test/1 из оболочки erlang всегда следует указывать абсолютный путь к каталогу ebin (с параметром -pa).

В противном случае общие тесты запускаются из оболочки erlang с помощью команды:

$ ./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 больше не экспортируется!

Другие вопросы по тегам