2011-11-13 4 views
7

Я пишу тесты EUnit для кода Erlang.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

Итак, вот он идет:

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

Теперь мое решение - экспортировать все функции в TEST-компиляцию. Так вы положили:

-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 для выполнения тестов, и обычные компиляции экспортировать только необходимые функции.

+1

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

+1

Чтобы выставить все на тестовый модуль, вы можете использовать «-compile (export_all)». вместо сохранения большого экспортного заявления. – goertzenator

8

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

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

%% Functions 
[...] 


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

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

+0

Я сделал все, что вы написали, но я получаю тот же результат. Я запускаю 'erlc -DTEST * .erl' для компиляции, и я до сих пор получаю :: undef от частных функций. – Uko

+0

Хорошо, я виноват, я забыл удалить имя модуля из вызова функции в тестах. – Uko

5

Вы можете использовать директиву -compile(export_all) условно экспортировать все функции только when compiling for testing:

%% Export all functions for unit tests 
-ifdef(TEST). 
-compile(export_all). 
-endif. 
Смежные вопросы