Подтвердить что ты не робот

Запустить тест eunit с консоли, используя erl -noshell

Я хотел запустить следующую команду проверки eunit с консоли

eunit:test([test_module, [verbose]).

Я пробовал это, но, похоже, не работает erl -noshell -pa./ebin -s eunit test test_module verbose -init stop

~/uid_server$erl -noshell -pa ./ebin -s eunit test test_module verbose -init stop
undefined
*** test module not found ***
::test_module

=======================================================
  Failed: 0.  Skipped: 0.  Passed: 0.
One or more tests were cancelled.

Вы знаете, как правильно передать из консоли не простые аргументы?

4b9b3361

Ответ 1

Ваши параметры выглядят неправильно. Это должно работать:

erl -noshell -pa ebin -eval "eunit:test(test_module, [verbose])" -s init stop

-s может запускать только функции без аргументов, указывая имя модуля и функции (например, init и stop для выполнения init:stop()).

Вы также можете передать один список функции arity 1 следующим образом:

-s foo bar a b c

будет вызывать

foo:bar([a,b,c])

Все параметры передаются только как список атомов (даже если вы пытаетесь использовать некоторые другие символы, например числа, они преобразуются в атомы).

Итак, поскольку вы хотите передать два параметра, а не только атомы, если вы хотите запустить eunit:test/2, вам нужно будет использовать -eval, который берет строку, содержащую код Erlang, в качестве аргумента. Все функции -eval и -s выполняются последовательно в том порядке, в котором они определены.

Кроме того, убедитесь, что у вас есть свой тестовый код. /ebin (иначе напишите -pa ebin test_ebin где test_ebin где ваш тестовый код).

Ответ 2

Вы также можете использовать арматуру...

  • Получить арматуру cd'ing в каталог проекта и ввести следующее:

    curl http://cloud.github.com/downloads/basho/rebar/rebar -o rebar

    chmod u+x rebar

  • Добавьте следующий код в тестируемый модуль сразу после последнего экспорта:

    -ifdef(TEST).

    -include_lib("eunit/include/eunit.hrl").

    -endif.

  • Затем добавьте свои тесты в нижней части вашего модуля, завернутые в ifdef, например:

    -ifdef(TEST).

    simple_test() ->

        ?assertNot(true).

    -endif.

  • Наконец, запустите арматуру из вашей оболочки следующим образом:

    ./rebar compile eunit

Ответ 3

вы можете попробовать параметры котировки вместо листинга. erl -noshell -pa./ebin -s eunit test "test_module verbose" -init stop

Ответ 4

Я использую этот script: https://github.com/lafka/dotconfig/blob/master/bin/eunit-module для запуска eunit на определенных модулях.

Пример:

eunit-module <module> src ebin -I deps   

Это сделает несколько вещей:

  • Arg # 2 - это каталог, в котором находится .erl
  • Arg # 3 - это каталог для вывода скомпилированного .beam
  • Arg # 4 ++ - все дополнительные пути для добавления в ваш путь к коду
  • Использование -I указывает дополнительные пути кода И где искать файлы, на которые ссылается -include_lib

Ответ 5

С момента вопроса прошло более восьми лет, но все же есть хорошее решение, не упомянутое в предыдущих ответах.

Как только вы используете EUnit, вы можете использовать некоторые из его "автоматических" функций. Одним из них является автоматический экспорт функции test/0, содержащей все тесты для модуля.

Итак, если вы пишете свои тесты вместе с исходным кодом в том же модуле, все, что вам нужно сделать, это:

$ erl -noshell -run your_module test -run init stop

Если вы пишете тесты в отдельном, зависимом модуле (как следует), вы должны указать на этот модуль:

$ erl -noshell -run your_module_tests test -run init stop

Все это будет работать нормально, но тест не будет запускаться в подробном режиме, так как требуется OP, но это EUNIT решить с помощью переменной среды EUNIT установленной в verbose.

Окончательный вариант:

$ EUNIT=verbose erl -noshell -run your_module_tests test -run init stop

Веселитесь вместе с Erlang и EUnit!