Функция тестирования 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