http://search.cpan.org/perldoc?Devel%3A%3ACover unit test 時に Devel::Cover を利用すると、
$ perl Makefile.PL $ make $ HARNESS_PERL_SWITCHES=-MDevel::Cover make test $ cover
または
$ env PERL5OPT='-MDevel::Cover' make test
を実行することで、statement , branch , cond 等のcoverage を計測できます。
ただ、自動testに対応しておらず、手作業(操作)でtestを実施するケースもあり、 更に手作業test時のcoverageも計測したい。
amon2 + Starlet + Supervisor による PSGI/Plack 環境下では、例えば、以下の手順で実施できそうです。
STEP1 /etc/bashrc に perl起動時のoption(PERL5OPT)を設定
# vi /etc/bashrc export PERL5OPT='-MDevel::Cover=-db,/home/endo/tmp/cover_db,-ignore,^\/usr\/local'
STEP2 amon2 + Starlet + Supervisor を起動し、手動test
# cat /etc/supervisord.conf : [program:sample-starlet] directory=/home/endo/dev/Sample/script command=/usr/local/bin/start_server --port=5000 --interval=10 -- \ /usr/local/bin/plackup -E development --no-default-middleware \ -s Starlet --max-workers=5 --timeout=1800 --keepalive-timeout=0 \ --max-reqs-per-child=700 --min-reqs-per-child=1000 \ /home/endo/dev/Sample/script/sample-server numprocs=1 autostart=true autorestart=true user=endo redirect_stderr=true stdout_logfile=/home/endo/local/apache22/logs/starlet_error_log : # /etc/rc.d/init.d/supervisord start ...ここで手動test...
STEP3 Supervisor を停止すると、coverage dataがメモリから書出されます
# /etc/rc.d/init.d/supervisord stop $ ls -l /home/endo/tmp/cover_db total 76 -rw-rw-r-- 1 endo endo 57511 May 21 20:26 cover.14 -rw-r--r-- 1 endo endo 7914 May 21 20:22 digests drwxr-xr-x 2 endo endo 4096 May 21 20:26 runs drwxr-xr-x 2 endo endo 4096 May 21 20:26 structure
STEP4 cover コマンドで coverage dataをhtml化
# vi /etc/bashrc # export PERL5OPT='-MDevel::Cover=-db,/home/endo/tmp/cover_db,-ignore,^\/usr\/local'
上記のようにcomment outしないと、cover実行時に 「/usr/local/bin/cover shouldn't be run with coverage turned on.」 とエラーになります。
$ cd /home/endo/tmp $ cover $ less /home/endo/tmp/cover_db/coverage.html
おまけ 複数のcoverage database を後からmerge
$ cover -outputdir cover_merged cover_db_1 cover_db_2 $ less cover_merged/coverage.html
/etc/bashrc へ PERL5OPT の設定って、どうなの?...とも思いますが、とりあえず、動いているっぽい。