6

我正在为 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,一切都很好。

有什么方法可以测试私有函数吗?

4

3 回答 3

6

您只能在编译测试时使用该指令-compile(export_all)有条件地导出所有函数:

%% Export all functions for unit tests
-ifdef(TEST).
-compile(export_all).
-endif.
于 2013-05-30T16:23:08.880 回答
6

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

-ifdef(测试)。
-include_lib("eunit/include/eunit.hrl")。
-万一。

%% 功能
[...]


-ifdef(测试)。
%% 单元测试放在这里。
-万一。

这应该允许您与公共功能一起测试您的私人功能。

于 2011-11-13T02:37:39.337 回答
3

好的,就这样吧:

dclements给了我一个很好的提示,告诉我如何完成我所要求的。我不想把我所有的测试都放在源模块中,你可以在这里看到一个很好的例子:Erlang EUnit – 介绍

现在我的解决方案是在 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运行测试,普通编译只导出需要的函数。

于 2011-11-13T11:01:52.210 回答