end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転します

Devel::NYTProf::Apacheによるmod_perl2の(実行≠テスト)カバレッジ計測

Devel::NYTProf::Apache - search.cpan.org

perlでtest coverageというとDevel::Coverですが、周りでは(自動)単体テストを採用していないアプリが殆ど。そこでDevel::NYTProf::Apacheを使ってmod_perl2(cgi)の(実行)カバレッジ計測を試してみた。

step1/2) httpd.conf

次の行を追加して下さい。
Devel::NYTProf::ApacheのドキュメントにはMaxClients=1でclient(worker?)を制限するよう記載されていますが、テスト実行時の動作が余りに遅かったので、私の場合、この制限は行なっていません。

PerlPassEnv NYTPROF
#MaxClients 1
PerlModule Devel::NYTProf::Apache
PerlSetEnv NYTPROF file=/home/endo/dev_data/nytprof/nytprof.out:addpid=1:endatexit=1

step2/2) nytprof.out.$$ のマージとhtml化

先程のhttpd.confの設定で nytprof.out.プロセスID のファイルが複数生成されるので、nytprofmerge でマージし、nytprofhtmlでhtmlに変換します。

$ cd /home/endo/dev_data/nytprof
# nytprof-merged.out というファイルが生成されます
$ nytprofmerge nytprof.out.*
# nytprofhtmlを実行したdirにnytprofがmkdirされ、大量のhtml等が生成されます
$ nytprofhtml -f nytprof-merged.out 

生成されたhtmlの一覧

$ cd /home/endo/dev_data/nytprof/nytprof
$ ls -l *XXXX*html*
-rw-rw-r-- 1 endo endo  55082 Sep  7 19:20 home-endo-dev-XXXX-lib-XXXX-Config-pm-56-block.html
-rw-rw-r-- 1 endo endo  55142 Sep  7 19:21 home-endo-dev-XXXX-lib-XXXX-Config-pm-56-line.html
-rw-rw-r-- 1 endo endo  54672 Sep  7 19:19 home-endo-dev-XXXX-lib-XXXX-Config-pm-56-sub.html
-rw-rw-r-- 1 endo endo  29944 Sep  7 19:20 home-endo-dev-XXXX-lib-XXXX-CtrlPage-AnkenList-pm-198-block.html
-rw-rw-r-- 1 endo endo  30435 Sep  7 19:21 home-endo-dev-XXXX-lib-XXXX-CtrlPage-AnkenList-pm-198-line.html
-rw-rw-r-- 1 endo endo  29866 Sep  7 19:19 home-endo-dev-XXXX-lib-XXXX-CtrlPage-AnkenList-pm-198-sub.html
-rw-rw-r-- 1 endo endo 314303 Sep  7 19:20 home-endo-dev-XXXX-lib-XXXX-CtrlPage-Juchuu-pm-746-block.html
-rw-rw-r-- 1 endo endo 318289 Sep  7 19:22 home-endo-dev-XXXX-lib-XXXX-CtrlPage-Juchuu-pm-746-line.html
-rw-rw-r-- 1 endo endo 313751 Sep  7 19:19 home-endo-dev-XXXX-lib-XXXX-CtrlPage-Juchuu-pm-746-sub.html
   :

生成されたhtmlの一例


Devel::NYTProf::Apacheはパフォーマンス改善の為、遅いmodule, subroutineを特定に使われることが多いようですが、テスト漏れの検知にも使える気がします。

NYTProfをコマンドラインアプリで利用する

$ /usr/local/bin/perl -d:NYTProf foo.pl
$ /usr/local/bin/nytprofhtml

で、上記と同様に nytprof/index.html が生成されます。