EUnit未能测试私人功能

Uko*_*Uko 6 erlang unit-testing 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.
...
...
...
Run Code Online (Sandbox Code Playgroud)

和单元测试模块:

-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)).
...
...
...
Run Code Online (Sandbox Code Playgroud)

我跑的 eunit:test(prob_list,[verbose])时候说:

 prob_list_tests: probability_test...*failed*
::undef
Run Code Online (Sandbox Code Playgroud)

但是当我probability/2在我的prob_list模块中导出时,一切都很好.

有没有办法测试私人功能?

Dav*_*nts 7

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

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

%% Functions
[...]


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

这应该允许您在公共功能旁边测试您的私人功能.


Phi*_*vin 5

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

%% Export all functions for unit tests
-ifdef(TEST).
-compile(export_all).
-endif.
Run Code Online (Sandbox Code Playgroud)


Uko*_*Uko 3

好的,就这样:

\n\n

dclements给了我一个很好的提示,告诉我如何才能完成我所要求的任务。我不想将所有测试放在源模块中,您可以在此处看到一个保持分离的好示例:Erlang EUnit \xe2\x80\x93 简介

\n\n

现在我的解决方案是导出 TEST 编译上的所有函数。所以你把:

\n\n
-define(NOTEST, true).\n\n-export([intersection/2,union/2]).\n-ifdef(TEST).\n-export([intersection/2,union/2,contains/2,probability/2,lesslist/2]).\n-endif.\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n