EUnit не может проверить частные функции - PullRequest
7 голосов
/ 13 ноября 2011

Я пишу тесты EUnit для кода Эрланга.

У меня есть исходный модуль:

-module(prob_list).
-export([intersection/2,union/2]).

probability([], _Item) -> false;
probability([{First,Probability}|Rest], Item) ->
    if
        First == Item -> Probability;
        true          -> probability(Rest, Item)
    end.
...
...
...

и модуль юнит-теста:

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

-define(TEST_LIST,[{3,0.2},{4,0.6},{5,1.0},{6,0.5}]).
-define(TEST_LIST1,[{2,0.9},{3,0.6},{6,0.1},{8,0.5}]).
-define(TEST_UNO_LIST,[{2,0.5}]).

probability_test() -> ?assertNot(prob_list:probability([],3)),
                      ?assertEqual(0.5,prob_list:probability(?TEST_UNO_LIST,2)),
                      ?assertNot(prob_list:probability(?TEST_UNO_LIST,3)),
                      ?assertEqual(0.2,prob_list:probability(?TEST_LIST,3)),
                      ?assertEqual(1.0,prob_list:probability(?TEST_LIST,5)),
                      ?assertNot(prob_list:probability(?TEST_LIST,7)).
...
...
...

Когда я запускаю eunit:test(prob_list,[verbose]), он говорит:

 prob_list_tests: probability_test...*failed*
::undef

но когда я экспортирую probability/2 в моем модуле prob_list, все в порядке.

Есть ли способ проверить частные функции?

Ответы [ 3 ]

8 голосов
/ 13 ноября 2011

Общий подход, который я использую для этого, состоит в том, чтобы включить все модульные тесты в один файл и разделить их:

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

%% Functions
[...]


-ifdef(TEST).
%% Unit tests go here.
-endif.

Это должно позволить вам протестировать ваши личные функции наряду с вашими общими функциями.

5 голосов
/ 30 мая 2013

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

%% Export all functions for unit tests
-ifdef(TEST).
-compile(export_all).
-endif.
4 голосов
/ 13 ноября 2011

Хорошо, вот так:

dclements дал мне хороший намек на то, как я могу выполнить то, что я просил.Я не хочу помещать все свои тесты в исходный модуль, вы можете увидеть хороший пример разграничения здесь: Erlang EUnit - введение

Теперь мое решение - экспортировать все функциина тестовой компиляции.Таким образом, вы кладете:

-define(NOTEST, true).

-export([intersection/2,union/2]).
-ifdef(TEST).
-export([intersection/2,union/2,contains/2,probability/2,lesslist/2]).
-endif.

И затем компилируете с erlc -DTEST *.erl для запуска тестов, а обычную компилируете для экспорта только необходимых функций.

...