単体テストを行うために Erlang と EUnit を使用しています。単体テストの実行を自動化するテスト ランナーを作成したいと考えています。問題は、eunit:test/1 が「エラー」または「OK」のみを返すように見え、テストのリストと、何が成功したか失敗したかという観点からそれらが返したものではないことです。
テストを実行し、実行されたテストとその成功/失敗状態の何らかの形式のデータ構造を取得する方法はありますか?
Rebar を使用している場合、独自のランナーを実装する必要はありません。あなたは単に実行することができます:
rebar eunit
Rebarは、ディレクトリ内のすべてのテストをコンパイルして実行しtest
ます (モジュール内の eunit テストも同様です)。さらに、rebar ではrebar.config
、シェルと同じオプションを設定できます。
{eunit_opts, [verbose, {report,{eunit_surefire,[{dir,"."}]}}]}.
これらのオプションは、シェルでも使用できます。
> eunit:test([foo], [verbose, {report,{eunit_surefire,[{dir,"."}]}}]).
詳細オプションと構造化レポートのドキュメントも参照してください。
別のオプションは、Eunit の代わりに Common Test を使用することです。Common Test にはランナー (ct_run
コマンド ) が付属しており、テスト設定の柔軟性が向上しますが、使用が少し複雑になります。Common Test には利用可能なマクロがありませんが、非常にわかりやすい HTML レポートを生成します。
簡単な方法や文書化された方法はありませんが、現在これを行う方法は 2 つあります。1 つは、テストを実行するときに「event_log」オプションを指定することです。
eunit:test(my_module, [event_log])
(これは文書化されておらず、実際にはデバッグのみを目的としていました)。結果のファイル「eunit-events.log」は、Erlang で file:consult(Filename) を使用して読み取ることができるテキスト ファイルです。
より強力な方法 (そしてそれほど難しいことではありません) は、カスタム イベント リスナーを実装し、それを eunit のオプションとして提供することです。
eunit:test(my_module, [{report, my_listener_module}])
これはまだ文書化されていませんが、文書化されているはずです。リスナー モジュールは、eunit_listener の動作を実装します (src/eunit_listener.erl を参照)。実装するコールバック関数は 5 つだけです。例として src/eunit_tty.erl と src/eunit_surefire.erl を見てください。
EUnitの結果をDETSテーブルに格納する非常に簡単なリスナーをGitHubにプッシュしました。これらのデータはDETSテーブルにErlang用語として保存されるため、これらのデータをさらに処理する必要がある場合、これは便利です。
https://github.com/prof3ta/eunit_terms
使用例:
> eunit:test([fact_test], [{report,{eunit_terms,[]}}]).
All 3 tests passed.
ok
> {ok, Ref} = dets:open_file(results).
{ok,#Ref<0.0.0.114>}
> dets:lookup(Ref, testsuite).
[{testsuite,<<"module 'fact_test'">>,8,<<>>,3,0,0,0,
[{testcase,{fact_test,fact_zero_test,0,0},[],ok,0,<<>>},
{testcase,{fact_test,fact_neg_test,0,0},[],ok,0,<<>>},
{testcase,{fact_test,fact_pos_test,0,0},[],ok,0,<<>>}]}]
お役に立てれば。