Причина: undef при запуске общих тестов в консоли erl [Erlang]

У меня запущено приложение, и в интерактивной консоли я пытаюсь запустить общие наборы тестов, расположенные в каталоге test/common:

ct:run("test/common").

Но получаю кучу ошибок:

Reason: undef

и все тесты проваливаются. Я пытался запустить их из оболочки Linux

ct_run -dir test/common

или вот так:

ct_run -boot start_sasl -spec test/common/app_ct.spec -erl_args -config env/dev.config

с тем же результатом.

Но когда я запускаю их с помощью rebar (вторая версия, а не rebar3)

rebar ct

Все работает, тесты проходят. Но для компиляции приложения и его запуска требуется слишком много времени.

В rebar.config у меня есть:

{ct_dir,"test/common"}.
{ct_log_dir,"test/logs"}.
{ct_extra_params,"-boot start_sasl -pa deps/*/ebin -pa ebin -spec test/common/app_ct.spec -erl_args -config env/dev.config"}.

и в test/common/app_ct.spec у меня есть:

{verbosity, 100}.
{init, {eval, [{application, ensure_all_started, [app]}, {timer, sleep, [30000]}]}}.
{alias, common, "./test/common/"}.
{suites, "", [app_srv_SUITE, app_client_SUITE]}.

Что я могу сделать, чтобы запустить тесты из консоли erl, используя ct:run(test/common)?

Моя цель - иметь возможность перекомпилировать отдельные тестовые файлы по отдельности и запускать тесты из рабочей консоли приложения без остановки и перекомпиляции всего приложения.

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

c("test/common/new_mod_SUITE.erl", [{i, "include"}, {i, "deps"}, {outdir, "test/common"}]). 

Но я все еще не могу запускать тесты после этого.


person AndreyKo    schedule 11.02.2021    source источник


Ответы (2)


Прежде всего, нужно убедиться, что все тесты скомпилированы и находятся внутри папки, которая указана в качестве аргумента в ct:run/1. Если нужно запустить только один тест из определенной папки, можно использовать ct:run/ 2. Если нужно запустить конкретный тестовый пример из определенной папки, можно использовать конкретную папку ct: бег/3. Примеры:

1> ct:run("test/common").
2> ct:run("test/common", "some_SUITE").

Однако я бы рекомендовал использовать rebar3, в rebar3 была добавлена ​​опция типа --dir и тесты из конкретных папку можно запустить так:

$ ./rebar3 ct --dir="test/common"
person Viacheslav    schedule 13.02.2021
comment
Спасибо, я проверил, и файлы .beam находятся в указанном каталоге, я могу без проблем скомпилировать их в этот каталог: c(test/common/new_mod_SUITE.erl, [{i, include}, {i, deps }, {outdir, test/common}]). Но когда я пытаюсь запустить тесты ct:run(test/common, new_mod_SUITE). Я все еще получаю сообщение об ошибке Причина: undef. - person AndreyKo; 13.02.2021
comment
Кстати, после того, как я скомпилирую модуль SUITE, я могу вызывать из него все тест-кейсы в терминале erlang вручную, но это слишком утомительно и занимает слишком много времени. - person AndreyKo; 13.02.2021
comment
Видите ли, модули Erlang должны быть скомпилированы, см. документацию - erlang.org/doc/reference_manual/ code_loading.html. Если вы попытаетесь использовать rebar3, как я писал выше, вы сможете запускать тесты в определенной папке, например: rebar3 ct --dir="test/common". Но неважно, хотите ли вы запускать вручную или с помощью инструментов — все модули должны быть скомпилированы перед вызовом или прогоны общими тестами. - person Viacheslav; 14.02.2021
comment
Прошу прощения за недопонимание, очевидно, я был недостаточно ясен. Что я действительно пытаюсь сказать, так это то, что я без проблем компилирую и перекомпилирую свой набор тестов из консоли erlang, открытой после того, как я запустил приложение. И в этой консоли я могу вызывать свои тестовые примеры вручную, например my_SUITE:first_test_case(). Чего я не могу заставить работать, так это вызова ct:run(test/common, my_SUITE). из консоли erlang, потому что, когда я запускаю эту команду, я получаю сообщение Reason: undef error, и я понятия не имею, что мне не хватает. Но это не имеет никакого отношения к версии арматуры. - person AndreyKo; 15.02.2021
comment
Ошибка появляется после компиляции модуля my_SUITE. Файл .beam на месте, проверил. Без скомпилированного модуля я бы не смог запускать тестовые примеры из модуля вручную. Я предполагаю, что причина: ошибка undef возникает из-за того, что какой-то пропущенный шаг необходимо выполнить перед вызовом команды ct:run() (может быть запуск приложения ct или вызов какой-либо функции перед запуском ct:run()). Просто сама ошибка для меня не очень информативна. - person AndreyKo; 15.02.2021

Это, вероятно, не поможет, но вот что происходит со мной при использовании rebar3:

~/erlang_programs/myrebar/myapp$ ls
LICENSE     _build      rebar.lock  test
README.md   rebar.config    src

~/erlang_programs/myrebar/myapp$ cd src
~/erlang_programs/myrebar/myapp/src$ ls
a.erl       myapp_app.erl   rebar.lock
myapp.app.src   myapp_sup.erl

~/erlang_programs/myrebar/myapp/src$ cat a.erl
-module(a).
-compile(export_all).
%%-include("eunit.hrl").


hello() -> io:format("hello").

~/erlang_programs/myrebar/myapp/src$ cd ../test
~/erlang_programs/myrebar/myapp/test$ ls
a_SUITE.erl

~/erlang_programs/myrebar/myapp/test$ cat a_SUITE.erl 
-module(a_SUITE).
-compile(export_all).

all() -> [go].

go(_Config) ->
   1 = 1. 

~/erlang_programs/myrebar/myapp/test$ cd ..
~/erlang_programs/myrebar/myapp$ rebar3 compile
===> Verifying dependencies...
===> Compiling myapp
~/erlang_programs/myrebar/myapp$ rebar3 shell
===> Verifying dependencies...
===> Compiling myapp
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [kernel-poll:false]

Eshell V9.3  (abort with ^G)
1> ===> The rebar3 shell is a development tool; to deploy applications in production, consider using releases (http://www.rebar3.org/docs/releases)
===> Booted myapp
 
1> ct:run("test").

Common Test: Running make in test directories...
Recompile: a_SUITE
a_SUITE.erl:2: Warning: export_all flag enabled - all functions will be exported

CWD set to: "/Users/7stud/erlang_programs/myrebar/myapp/[email protected]_14.26.08"

TEST INFO: 1 test(s), 1 case(s) in 1 suite(s)

Testing myrebar.myapp: Starting test, 1 test cases
Testing myrebar.myapp: TEST COMPLETE, 1 ok, 0 failed of 1 test cases

Updating /Users/7stud/erlang_programs/myrebar/myapp/index.html ... done
Updating /Users/7stud/erlang_programs/myrebar/myapp/all_runs.html ... done
{1,0,{0,0}}
2> 

Затем после выхода из оболочки:

~/erlang_programs/myrebar/myapp$ 

~/erlang_programs/myrebar/myapp$ rebar3 ct
===> Verifying dependencies...
===> Compiling myapp
test/a_SUITE.erl:2: Warning: export_all flag enabled - all functions will be exported

===> Running Common Test suites...
%%% a_SUITE: .
All 1 tests passed.

~/erlang_programs/myrebar/myapp$ 

Я не трогал rebar.config, он создается rebar3 по умолчанию:

{erl_opts, [debug_info]}.
{deps, [{eleveldb, "2.2.20"}]
}.

{shell, [
  % {config, "config/sys.config"},
    {apps, [myapp]}
]}.

Я бы попробовал распечатать ваш текущий рабочий каталог, когда вы находитесь в оболочке:

2> pwd().
/Users/7stud/erlang_programs/myrebar/myapp
ok

Затем попробуйте использовать полный или относительный путь из этого каталога, например:

"./test/common"
"Users/../../test/common"

Затем я бы переместил все ваши *_SUITE.erl файлы, кроме одного, в каталог за пределами вашего приложения и просто работал с одним тестовым файлом. Затем я избавился бы от всего этого конфигурационного файла и попробовал еще раз.

person 7stud    schedule 14.02.2021
comment
Я проверил pwd(). и это дало мне корневой каталог проекта /home/andr/projects/my_proj. Пробовал запускать тесты обоими способами ct:run(./test/common) и ct:run(/home/andr/projects/my_proj/test/common). Причина ошибки: undef все еще сохраняется, тесты не пройдены. - person AndreyKo; 15.02.2021
comment
@AndreyKo, Хорошо, теперь попробуй избавиться от материала rebar.config. - person 7stud; 15.02.2021
comment
@AndreyKo, после этого я бы попробовал создать совершенно новое приложение всего с одним тестовым файлом и посмотреть, сможете ли вы запустить этот тест. Или просто используйте свое текущее приложение и переместите все файлы src из каталога src и переместите все тестовые файлы из каталога test, и посмотрите, сможете ли вы запустить один тест, помещенный в каталог ./test. Относится ли ct_dir к тестовому каталогу, так что вы должны указать общий? - person 7stud; 15.02.2021
comment
Ага, попробую, спасибо! - person AndreyKo; 15.02.2021
comment
@AndreyKo, немного информации здесь: github.com/erlang/rebar3/issues/415 - person 7stud; 15.02.2021
comment
@AndreyKo, Подробнее: stackoverflow.com/questions/20265672/ - person 7stud; 15.02.2021