erlang でテストの自動化ってどうやるのだろうか?

memcached の代替えを作った際、Mnesia の I/F と TCP の I/F を分けて作ったので、割とテストは楽なのだが・・・手動では、やってらんないなーと思った。
そこで、yaws ではどうやっているのだろうかと思ったら、そんな事はやってなかった orz (勘違いだと良いなー)
自前で作るしかないのかな?

ついでなので、yaws_debug.erl を追ってみた

yaws_debug.erl に下記のコードがあった。

assert(equal,X,Y,_) when X==Y ->
    ok;
assert(neq,X,Y,_) when X/=Y ->
    ok;

% assert が続くので省略

assert(_,_,_,Failure) ->
    fail(Failure).

fail({assert,File,Line,Message}) ->
    io:format(user, "Assertion FAILED ~p:~p, pid ~w exiting: ~p~n",
	      [File, Line, self(), Message]),
    erlang:fault(assertion_failed);
fail({alert,File,Line,Message}) ->
    io:format(user, "Assert WARNING ~p:~p, pid ~w: ~p~n",
	      [File, Line, self(), Message]),
    ok;
fail({{debug,Fstr}, File,Line,Fmt, Args}) ->
    Str = lists:flatten(
	    io_lib:format("~s <~p> ~s:~p, pid ~w: ~n",
			  [Fstr, node(), filename:basename(File), 
			   Line, self()])),
    
    case io:format(user, Str ++ Fmt ++ "~n", Args) of
	ok -> ok;
	_ -> io:format(user, "ERROR ~p:~p: Pid ~w: (bad format)~n~p,~p~n",
		      [File, Line, self(), Fmt, Args]),
	    
	    ok
    end;

fail({format, File,Line,Fmt,Args}) ->
    case io:format(user, Fmt,Args) of
	ok -> ok;
	_ ->
	    io:format(user, "ERROR ~p:~p: Pid ~w: (bad format)~n~p,~p~n",
		      [File, Line, self(), Fmt, Args]),
	    
	    ok
    end.

erlang 用の UnitTest の Module みたいなのは無いのかな?
んで、yaws_debug.hrl に下記の define 宣言がある。

-ifdef(debug).
% 省略
-define(Debug(F, A),
    yaws_debug:assert([],0,0,{{debug,"DEBUG"}, ?FILE,?LINE,F, A})).
% 省略
-else. %% not debug_mode
% 省略
-define(Debug(F, A),debug_disabled).
% 省略
-endif. %% debug defined

yaws の source 内で Dassert を使っている箇所は存在せず、Debug を使っている箇所が多く存在している。
Makefile 内に下記の記述があるので make debug でコンパイルすると、io:format/3 で諸々表示してくれるようになる。

#省略
ifeq ($(TYPE),debug)
    DEBUG_FLAGS = -Ddebug +debug_info
else
    DEBUG_FLAGS =
endif
#省略
debug:
    $(MAKE) TYPE=debug
#省略