EUnit未能测试私人功能

时间:2011-11-13 00:19:53

标签: unit-testing erlang private-functions 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 个答案:

答案 0 :(得分:8)

我使用的一般方法是将所有单元测试包含在同一个文件中并将它们分开:

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

%% Functions
[...]


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

这应该允许您在公共职能部门旁边测试您的私人功能。

答案 1 :(得分:5)

您可以使用指令-compile(export_all)仅有条件地导出所有函数when compiling for testing

%% Export all functions for unit tests
-ifdef(TEST).
-compile(export_all).
-endif.

答案 2 :(得分:4)

好的,所以在这里:

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编译运行测试,普通编译只导出所需的函数。