Erlang でエクスポートされない関数を含む Erlang のモジュールがあります。一般的なテスト フレームワークを使用してこれらの関数をテスト/呼び出すにはどうすればよいですか?
4 に答える
それは無理だ。プリプロセッサ条件を使用-ifdef(TEST).
して、テスト用にコンパイルする場合にのみ、これらの関数をエクスポートできます。
ツールによってはTEST
、モジュールのコンパイル時にそのマクロを明示的に指定する必要がある場合があります。これを行うには、{d、'TEST'}コンパイラオプションまたは-DTESTコンパイルフラグを使用します。
Common Test では扱いにくいですが、埋め込まれたEUnitテスト ケースを使用してモジュール内のプライベート関数をテストすることは可能です。その後、Common Test を使用してパブリック インターフェイスをテストできます。を実行すると、 Rebarは埋め込まれたテスト ケースを自動的に検出しますrebar test
。
次に例を示します。
-module(example).
-export([public/1]).
-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").
-endif.
%% This function will be tested externally using Common Test
public(Foo) ->
private(Foo + 42).
%% This function is not reachable to CT, so it will be tested using EUnit.
private(Bar) ->
Bar * 2.
%%% Tests
-ifdef(TEST).
private_test() ->
?assertEqual(10, private(5)),
?assertEqual(0, private(0)).
-endif.
余談ですが、EUnit でテストするときにモジュール (またはその一部) をモックする必要がある場合は、 Meckが好みに合うかもしれません。
EUnit の簡単な紹介については、Learn You Some Erlang の章を参照してください。
プライベート関数を独自のモジュールに配置して、それらすべてをエクスポートできます。元のモジュールはそれらをインポートでき、それらは非公開のままであり、テスト フレームワークは非公開モジュールのインポートを直接呼び出すことができます。