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

私の prob_list モジュールで probability/2 をエクスポートすると、すべてが正常です。

プライベート機能をテストする方法はありますか?

7

3 答え

私がこれに使用する一般的なアプローチは、すべての単体テストを同じファイルに含め、それらを別々にすることです:

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

%% Functions
[...]


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

これにより、あなたのパブリック関数と一緒にプライベート関数をテストすることができます。

8
追加された
私はあなたが書いたことをすべてやったが、私は同じ結果を得る。私はコンパイルするために erlc -DTEST * .erl を実行します。私はまだプライベート関数から:: undefを取得します。
追加された 著者 Uko,
わかりました、私のせいで、テスト中の関数呼び出しからモジュール名を削除するのを忘れました。
追加された 著者 Uko,

-compile(export_all)ディレクティブを使用して、すべての関数を条件付きでエクスポートできます。テスト用にコンパイルする場合

%% Export all functions for unit tests
-ifdef(TEST).
-compile(export_all).
-endif.
5
追加された

さて、ここに行く:

dclements gave me a nice hint of how can I accomplish what I've asked. I don't want to put all my tests in source module, you can see a nice example of keeping the apart here: 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 でコンパイルし、必要な機能だけをエクスポートするために通常のコンパイルを行います。

4
追加された
すべてをテストモジュールに公開するには、 "-compile(export_all)"を使うことができます。大規模なエクスポートステートメントを維持する代わりに。
追加された 著者 goertzenator,
これは妥当なアプローチです(複数のエクスポートラインを持つことができますが、これは少し面白いかもしれません)。特にユニットテストを別々のファイルに分けてプライベート関数をテストしたい場合は特にそうです。このアプローチの欠点は、テストに合格するコードにつながりますが、誤ってテストファイルの外にあるプライベートメソッドを使用した場合には実行されないということです。
追加された 著者 David H. Clements,