【问题标题】:EUnit fails to test private functionsEUnit 无法测试私有函数
【发布时间】:2011-12-27 20:39:50
【问题描述】:

我正在为 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

但是当我在 prob_list 模块中导出 probability/2 时,一切正常。

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

【问题讨论】:

    标签: unit-testing erlang private-functions eunit


    【解决方案1】:

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

    -ifdef(测试)。 -include_lib("eunit/include/eunit.hrl")。 -万一。 %% 职能 [...] -ifdef(测试)。 %% 单元测试在这里。 -万一。

    这应该允许您在测试公共函数的同时测试您的私有函数。

    【讨论】:

    • 我已经完成了你所写的一切,但我得到了相同的结果。我运行 erlc -DTEST *.erl 进行编译,我仍然从私有函数中获得 ::undef。
    • 好吧,我的错,我忘了从测试中的函数调用中删除模块名称。
    • 这使得保持 erlang 文件清晰易读变得非常困难。始终建议将测试用例保存在单独的文件中,并采用 Phil 建议的方法。
    【解决方案2】:

    好的,那就这样吧:

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

    【讨论】:

    • 这是一种合理的方法(尽管值得注意的是,您可以有多个导出行,这可能会清理一些东西),特别是如果您想将单元测试分离到单独的文件中并进行测试你的私人功能。这种方法的一个缺点是,如果您不小心使用了测试文件之外的私有方法,这可能会导致代码通过测试但不会运行。
    • 要将所有内容暴露给测试模块,您可以使用“-compile(export_all)”。而不是维护一个大的导出语句。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-06
      • 1970-01-01
      • 2016-07-14
      • 2013-08-04
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 2012-02-28
      相关资源
      最近更新 更多