Функция тестирования Erlang (Non Exported / Private) модуля с использованием общего теста

У меня есть модуль в Erlang, который имеет функции, которые не экспортируются Erlang. Как я могу тестировать / вызывать эти функции с помощью общей тестовой среды?

4 ответов


невозможно. Вы можете использовать -ifdef(TEST). условие препроцессора для экспорта этих функций только при компиляции для тестирования.

в зависимости от вашего инструментария вам может потребоваться явно указать, что TEST макрос при компиляции модулей. Это можно сделать с помощью параметра компилятора {d,'TEST'} или флага компиляции-DTEST.


это сложно с общим тестом, но можно использовать embedded EUnit тестовые примеры для тестирования частных функций в модуле. Затем можно протестировать открытый интерфейс с помощью Common Test. арматура будет автоматически обнаруживать встроенные тестовые случаи при запуске rebar test.

вот пример:

-module(example).

-export([public/1]).

-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").
-endif.

%% This function will be tested externally using Common Test
public(Foo) ->
    private(Foo + 42).

%% This function is not reachable to CT, so it will be tested using EUnit.
private(Bar) ->
    Bar * 2.

%%% Tests
-ifdef(TEST).

private_test() ->
    ?assertEqual(10, private(5)),
    ?assertEqual(0, private(0)).

-endif.

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

для нежного введения в EUnit, см. Learn You Some Erlang глава.


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


на всякий случай, если кто-то столкнется с этим. В том числе eunit.hrl-файл определяет тест, если NOTEST не определен перед включением. - include_lib ("eunit.hrl"). ref:http://www.erlang.org/download/eunit.hrl