2012年1月14日土曜日

Erlang Eunit の 簡単な勉強

Eunitでテスト駆動開発したくて、勉強した。
参考:
shibu.jp: EUnitユーザーズガイド : http://articles.shibu.jp/category/777978-1.html

まず、上記サイトを参考にして、プログラム書いてみた。

【ソース】
----- ここから -----

-module(test_eunit).
-include_lib("eunit/include/eunit.hrl").
%-export([start/0]).
-define(TEST(X),reverse_X_test()).

-ifdef(debug).
%start() ->
%        reverse_test(),
%        ?TEST(nil),
%        reverse_one_test(),
%        reverse_two_test(),
%        reverse_ng_test().

% 任意の値を返すとテストは成功とみなされる。
% なんらかの例外を投げる場合には失敗したとみなされる。
reverse_test() -> lists:reverse([1,2,3]).

?TEST(nil) -> [] = lists:reverse([]).
reverse_one_test() -> [1] = lists:reverse([1]).
reverse_two_test() -> [2,1] = lists:reverse([1,2]).
reverse_ng_test() -> [1,1] = lists:reverse([1,2]).

-endif.
----- ここまで -----

これをコマンドプロンプト上から実行した。
【コマンドプロンプト】
$> C:\Users\andre\ework>erlc -Ddebug test_eunit.erl

$> C:\Users\andre\ework>erl -noshell -run test_eunit test -run init stop
test_eunit: reverse_ng_test...*failed*
::error:{badmatch,[2,1]}
  in function test_eunit:reverse_ng_test/0


=======================================================
  Failed: 1.  Skipped: 0.  Passed: 4.


ソース上はコメントアウトされているが、start()から全テストプログラムを実行しなくていい。それが素晴らしい!

単に、xx_test()と関数名の最後にtestと付けただけで、Eunitはテスト関数だと認識してくれて、実行し、実行結果を出してくれる。いい!

defineは気にしないでX-(