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 #省略