Unit testing EUnit无法测试私有函数

Unit testing EUnit无法测试私有函数,unit-testing,erlang,private-functions,eunit,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 ->

我正在为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\u list,[verbose])
时,它会显示:

 prob_list_tests: probability_test...*failed*
::undef
但是当我在
prob\u列表
模块中导出
probability/2
时,一切都正常


有没有办法测试私有函数?

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

-ifdef(TEST). -include_lib("eunit/include/eunit.hrl"). -endif. %% Functions [...] -ifdef(TEST). %% Unit tests go here. -endif. -ifdef(测试)。 -include_lib(“eunit/include/eunit.hrl”)。 -恩迪夫。 %%功能 [...] -ifdef(测试)。 %%单元测试在这里进行。 -恩迪夫。 这将允许您在测试公共函数的同时测试您的私有函数。

好的,下面是:

d元素给了我一个很好的提示,告诉我如何完成我的要求。我不想把所有的测试都放在源代码模块中,您可以在这里看到一个很好的例子:

现在,我的解决方案是在测试编译时导出所有函数。所以你说:

-定义(NOTEST,true)。
-导出([交叉点/2,并集/2])。
-ifdef(测试)。
-导出([交集/2,并集/2,包含/2,概率/2,lesslist/2])。
-恩迪夫。

然后使用
erlc-DTEST*.erl
编译以运行测试,使用普通编译仅导出所需的函数。

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

%%导出单元测试的所有函数
-ifdef(测试)。
-编译(全部导出)。
-恩迪夫。

我已经完成了您编写的所有工作,但我得到了相同的结果。我运行
erlc-DTEST*.erl
进行编译,但仍然从私有函数中获得::unde。好吧,是我的错,我忘了从测试中的函数调用中删除模块名。这使得保持erlang文件清晰易读非常困难。我们总是建议将测试用例保存在单独的文件中,并采用Phil建议的方法。这是一种合理的方法(尽管值得注意的是,您可以有多个导出行,这可能会稍微清理一下),特别是如果您想将单元测试分离到单独的文件中并测试您的私有函数。这种方法的一个缺点是,如果您意外地在测试文件之外使用私有方法,这可能会导致代码通过测试,但在其他情况下不会运行。要向测试模块公开所有内容,您可以使用“-compile(export_all)”,而不是维护一个大的export语句。