0

EUnitに関するドキュメントを読みましたが、テスト ジェネレーターの目的がわかりません。

ここで素敵なチュートリアルも読みましたが、まだ運がありません(少し高度すぎます)。

テスト ジェネレーター関数が一連のテストを返し、それが EUnit によって実行されることをある程度理解しています。(そうですか?)

残念ながら、私が現在自信を持っている唯一のことは、次のようなテストを書くことができるということです:

myfun_test() ->
assertEqual(myresult,mymod:myfun()).

問題は、EUnit のテスト ジェネレーターは何のために必要であり、単純なテスト オブジェクトとどのような関係があるのか​​ということです。

PSさまざまな自動化ツールと概念の助けを借りて作成された単体テストの素晴らしい世界(例)があることは知っていますが、その世界に入る方法がわかりません。

4

2 に答える 2

2

あなたがあなたの質問でリンクしたまさにそのページから読む:

単純なテスト関数の欠点は、テストケースごとに個別の関数(個別の名前)を作成する必要があることです。テストを作成するためのよりコンパクトな方法(そして、これから説明するように、はるかに柔軟な方法)は、テストではなく、テストを返す関数を作成することです。

名前が... test()で終わる関数(最後のアンダースコアに注意)は、EUnitによってテストジェネレーター関数として認識されます。テストジェネレータは、EUnitによって実行される一連のテストの表現を返します。

テストをグループ化する可能性については、ジェネレーターをテストすることを検討してください。よりコンパクトなコードを使用するだけでなく、テスト用の高度な機能を使用できます。たとえば、一連のテストの状態、初期化関数などです。

アプリケーションに必要なのがアサーションのセットだけである場合は、おそらくテストセットは必要ありません。EUnit全体の使用を避けることもできます。Erlangのパターンマッチング(=)演算子は、それ自体が優れたテスト演算子です。比較:

assertEqual(myresult,mymod:myfun()).

と:

myresult = mymod:myfun()
于 2012-05-17T07:47:55.557 に答える
2

プロジェクトで多くの単体テストを作成しようとした場合は、実際にテスト ジェネレーターの価値を見つけることができると思います。

テストジェネレーターを使えば、テスト関数名の作成だけに時間を費やす必要がなく、テストジェネレーターを作成するためのコードは標準関数よりも短くなります。

たとえば、次のコードはgprocテスト ジェネレーターのオープン ソース プロジェクトからのものであり、参照用にテスト ジェネレーターを使用しており、ファイルは次の場所にあります。github.

reg_test_() ->
    {setup,
     fun() ->
             application:start(gproc),
         application:start(mnesia)
     end,
     fun(_) ->
             application:stop(gproc),
         application:stop(mnesia)
     end,
     [
      {spawn, ?_test(?debugVal(t_simple_reg()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_simple_counter()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_simple_aggr_counter()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_update_counters()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_simple_prop()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_await()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_await_self()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_await_crash()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_simple_mreg()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_gproc_crash()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_cancel_wait_and_register()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_give_away_to_pid()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_give_away_to_self()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_give_away_badarg()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_give_away_to_unknown()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_give_away_and_back()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_select()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_select_count()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_qlc()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_get_env()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_get_set_env()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_set_env()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_get_env_inherit()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_monitor()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_monitor_give_away()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_subscribe()))}
      , ?_test(t_is_clean())
      , {spawn, ?_test(?debugVal(t_gproc_info()))}
      , ?_test(t_is_clean())
     ]}.
于 2012-05-16T22:53:10.163 に答える