end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

amon2 + Starlet + Supervisor による PSGI/Plack 環境下での Devel::Cover

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 の設定って、どうなの?...とも思いますが、とりあえず、動いているっぽい。