EUnitによるユニットテスト


良い製品を書くためには、必ず完璧なテストが欠かせない.
最近プロジェクトを計画し始めたので、ユニットテストは欠かせません.必ず最初にテストをして、下から上まで製品をもっと丈夫にすることができます.
EUnitを使用してユニットテストを行うことを選択しました.Eunitを使用するメリット:コードの変更を減らす;開発速度を高める.インタフェースと分離を実現するのに有利である.システム統合に有利である.また、テスト自体はドキュメントとして使用できます.
1,初めてhttp://support.process-one.net/doc/display/CONTRIBS/EUnit 対応するSVN checkoutパスを取得し、http://svn.process-one.net/contribs/trunk/eunit、svnでダウンロードします.
2、eunitディレクトリ全体をerlangインストールディレクトリの下のlibディレクトリに配置します.code:add_を使用することもできます.path/1または他のコンパイルオプションはeunitのパスを示しますが、便利ではありません.
3、moduleに追加:-include_lib("eunit/include/eunit.hrl").これによりeunitのヘッダファイルが導入され、moduleには「_test」で終わる関数を自動的にテスト関数とする特性があります.あなたのmoduleにtest/0関数を追加してエクスポートしました.豊富なtest macroを提供してくれました.(test関数の自動エクスポートは、compileインジケータのparse_transformオプションで処理されます)
この時、私たちのmoduleはすでにeunitが与えたすべての権利を持っています.svnからダウンロードしたコードに注意して、コンパイルしていません.コンパイルしてbeamファイルを生成する必要があります.本人はwindowsで働いているので、コンパイルが不便なので、私は直接ここからeunitのbeamファイルをダウンロードして、eunit/ebin/ディレクトリの下に置きました.
テストするmoduleに関数を追加します.

basic_test() ->
     ?assert(1 == 1).

では、moduleをコンパイルし、M:test()を実行し、ユニットテストを行います.
Test successful.
に表示されます.テストOK.
ここでbsic_test/0はtest/0を実行するときに呼び出されます.basic_test/0は別の形式で書かれています.

basic_test_() ->
    fun() -> ?assert(1 == 1) end.

「_test_」で終わる関数は、EUnitでは「test generation function」と呼ばれ、生成関数をテストします.
1つまたは1つの関数リストを返し、EUnitは各関数を順次実行します.コードをよりコンパクトに簡潔にするために、
もう一つのmacro:_testがあります.このようにして、上のtestはこのようになります.
basic_test_() ->
    ?_test(?assert(1 == 1)).

コードが少なくなったのではないでしょうか.では、もう一つのmacro:_assertを使用します.

basic_test_() ->
    ?_assert(1 == 1).

どうですか.簡単でしょう.はい、例えば、私は一連の内容をテストしなければなりません.私は簡単にこのように書くことができます.

basic_test_() ->
    [?_assert(1 == 1),
     ?_assert(2 == 2),
     ?_assertEqual(3, 3),
     ?_assertMatch(4,  4),
     ?_assertException(throw, a, throw(a))].

ある式がtrueであるかどうか,ある2つの値がassertEqualであるかどうかを簡単にテストした.
(注:ここでは=:=を用いて判断するのでassertEqual(3,3.0)はテストに合格しません)、
式が一致するかどうか、指定した例外が発生するかどうかなど.
では、しばらくこれらの基本的なものについて、EUnitの助けをもっと見てみましょう.
http://svn.process-one.net/contribs/trunk/eunit/doc/overview-summary.html
Update:
R 12 B-5には、eunitが標準的なlibとして組み込まれており、eunitには以下のような有用なMacroが提供されています.
LET(Var,Arg,Expr)
(fun(Var)->end(Arg)に等しい
使用法:L=?LET(L 1,[1,2,3],lists:reverse(L 1))
IF(Cond,TrueCase,FalseCase)
使用法:G=?IF(A>=B,A,B)
_test()のような関数をtestユニットとして使用します.
_test_()のような形をした関数はtest generatorとして使用され、testユニットを生成するために使用され、その末尾式は以下のようにすることができる.
単一の形は?_xxxのテストのようで、1つのtestユニットを表します
1つのList(Deep Listであってもよい)であってもよく、Listがflattenを行った後、長さ表示testユニット数は以下のコードのように5つのテストユニットを表す.
basic_test() ->
    ?assert([1, 2] = lists:reverse([2, 1]).

basic_test_() ->
    [?_assert(true),
     ?_assertNot(false),
     [ ?_assert(1 == 1.0),
       ?_assert(true)
     ]
    ].