Perlのテスト実行するときproveとかやると何か結果が出るけど,これの出力するのをプログラムから操作したいと思って,TAP::Harness読んでた.
TAP::Harnessのコンストラクタに自作のformatter_class(これはテストが終わったときに結果を整形するクラス)を渡して,formatte_classのopen_testの返り値で自作のSessionクラス(これは一行ずつ呼ばれるやつ)を渡すと,Sessionクラスのresultに各行のオブジェクトがやってくることが分かった.merge => 1すると テスト失敗したときに構造化されずに出てくる# Failed test みたいなのもSessionで受け取れる.必要な分だけ書きたいのでデフォルトのクラスを継承してちょっとだけ書く.
意味ないけど,とりあえず,出力が左右判定するproveみたいなの作っておいた.これ自体には意味ないけど,こういう感じでできる.
意味ない実行例.普段は左にokって出るのが右にkoって出る.
% perl ~/tmp/sketch-tap-harness-reverse-output.pl t/Plack-HTTPParser-PP/simple.t teg elpmis - 1 ko / TEG fo tluser - 2 ko TSOP - 3 ko sredaeh htiw TEG fo tluser - 4 ko redaeh enilitlum - 5 ko enilitlum - 6 ko tnemgarf IRU - 7 ko 8 ko #\ >- 32% - 9 ko 01 ko gnirts yreuq retfa tnemgarf IRU - 11 ko 21 ko 31 ko 31..1 t/Plack-HTTPParser-PP/simple.t .. ok All tests successful. Files=1, Tests=13, 0 wallclock secs ( 0.03 usr 0.01 sys + 0.02 cusr 0.00 csys = 0.06 CPU) Result: PASS
なんとか.tみたいなテストファイルを実際に実行するのは,TAP::Parser::SourceHandler::以下にいろんなハンドラが定義されていて,TAP::Parser::SourceHandler::Perl から TAP::Parser::SourceHandler::Executableを実行している.各ファイルは別々のプロセスで実行される.テスト中にメソッド壊しても次のテストでは戻ってるということになる.これまでどうなってるかよく分かってなかった.もうちょっと低レベルなところで操作すると,クラスだけ先に読んでおいてforkしたら速くなるかもしれない.