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/2prob_listモジュールにエクスポートすると、すべて問題ありません。

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

4

3 に答える 3

6

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

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

%% 関数
[...]


-ifdef(TEST)。
%%ユニットテストはここにあります。
-endif。

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

于 2011-11-13T02:37:39.337 に答える
6

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

%% Export all functions for unit tests
-ifdef(TEST).
-compile(export_all).
-endif.
于 2013-05-30T16:23:08.880 に答える
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 に答える