тестирование неэкспортированных функций - PullRequest
3 голосов
/ 01 марта 2011

Я хотел бы протестировать некоторые неэкспортированные функции, используя rebar и common_test.Какой простой и эффективный способ сделать это?

Я бы хотел установить макрос во время компиляции / тестирования и таким образом включить / выключить export_all в модулях, в зависимости от того, производственный ли он илитестовая сборка.Я хочу, чтобы это было легко - например, я не хочу редактировать файл конфигурации перед переключением с производственного процесса на тестовый и наоборот.Однако я не вижу способа передать аргументы в компилятор erl, используя rebar.Я пропустил это?

Я знаю, что eunit может легко тестировать неэкспортированные функции, но у меня уже есть хорошо работающая инфраструктура для common_test, и я не хочу сейчас менять свой рабочий процесс.

Ответы [ 3 ]

2 голосов
/ 01 марта 2011

Вы можете просто добавить +export_all к вашим erlc опциям при сборке модулей для тестового запуска. Вы можете сделать это с помощью {erl_opts, [export_all]}. в вашем файле rebar.config. Я не думаю, что вы можете передать дополнительные erlc аргументы арматуре во время выполнения (например, вы не можете rebar compile +export_all).

1 голос
/ 09 сентября 2013

Вы можете добавить дополнительные параметры компиляции, которые используются арматурой при компиляции для eunit. Как отметил архел, вам нужно указать +export_all для erlc. Добавьте строку

{eunit_compile_opts, [export_all]}.

в ваш rebar.config файл. Это упоминается в файле rebar.config.sample .

1 голос
/ 02 марта 2011

РЕДАКТИРОВАТЬ: Просто понял, что вы использовали common_test. Пожалуйста, игнорируйте этот ответ, если он не применяется!

У меня есть немного более продвинутый способ тестирования неэкспортированных функций, который имеет преимущество в том, что не экспортирует их, таким образом сохраняя производственный код как можно более неповрежденным (возможны сбои, которые возникают, только если некоторые функции не экспортируются, но не обнаруживается во время тестирования, если все функции экспортированы).

Вот как это работает, используя Rebar и EUnit.

В исходный файл добавьте следующие строки:

-ifdef(TEST).
-include("yourmodule_tests.hrl").
-endif.

В папке test добавьте файл с именем yourmodule_tests.hrl (в отличие, например, yourmodule_tests.erl в обычном случае) и добавьте следующее содержимое:

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

some_test() ->
    ?assertEqual(ok, internal_function()).

Добавьте следующую конфигурацию в rebar.config (если у вас уже есть erl_opts, просто добавьте новый кортеж в этот список):

{erl_opts, [{i, "test"}]}.

Когда вы запустите rebar eunit Rebar определит переменную окружения TEST, и ваш код будет «скомпилирован». То есть, включая ваши тесты в ваш модуль и тесты смогут получить доступ к внутренним функциям.

Если вы используете что-то кроме Rebar, просто убедитесь, что вы компилируете свой код с erlc -DTEST ... при компиляции для тестов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...