読者です 読者をやめる 読者になる 読者になる

end0tknr's kipple - 新web写経開発

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

Devel::NYTProf による plack(psgi, starlet)アプリの(実行≠テスト)カバレッジ計測

以前も、Devel::NYTProf::Apache + mod_perl2 で同様のことを行っていますが、今回は、Devel::NYTProf + plack(psgi, starlet)版です。 http://end0tknr.hateblo.jp/entry/20120907/1347015223

Devel::NYTProfは、元々、処理の遅い部分を見つける為のプロファイラの為、Devel::Coverのように、きちんとカバレッジ値は表示できませんが、Devel::Coverをplack下で動作させる方法が分かりませんでしたので、とりあえず、次のようにしました。

といっても、gihyo.jp のまんまです。 http://gihyo.jp/dev/serial/01/perl-hackers-hub/001702

STEP1/2 - require Devel::NYTProf 等の記載

*.psgiファイル(Amon2であれば、$AppName/script/$app-name-server )に対し、次のように記載します。

#!perl
use strict;
 :
use File::Path ();

use POSIX::AtFork qw/:all/;
my @opts = qw( addpid=1 start=no sigexit=int
               forkdepth=0 file=/home/endo/tmp/nytprof.out );
$ENV{"NYTPROF"} = join ":", @opts;
require Devel::NYTProf;
pthread_atfork(
    undef,
    undef,
    sub {
        DB::enable_profile() if $$ % 1 == 0;
    },
);

my $app = builder {
  :

STEP2/2 - nytprof.out.* のマージとhtmlの作成

以下のように実行し、作成されたindex.htmlを見ればOK。何となく、処理が通過した行を確認できます。

$ cd /home/endo/tmp
$ ls nytprof.out.*
$ nytprofmerge nytprof.out.*
$ nytprofhtml --file=nytprof-merged.out
$ ls -l nytprof/index.html 

その他 - Plack::Middleware::Profiler::NYTProf でも可能かも知れませんが...

*.psgi に以下のように記載して、動くようには見えましたが...

Plack::Middleware::Profiler::NYTProf はぶっこわれてるそうなので、つかわないのがいいとおもいます。」という記事があったので、利用していません。

my $app = builder {
    my $conf = Ean->load_config();
    enable 'Plack::Middleware::Static',
        path => qr{^(?:/static/)},
        root => File::Spec->catdir(dirname(__FILE__), '..');
        :
    enable 'Profiler::NYTProf',
         enable_profile       => sub { $$ % 1 == 0 },
         env_nytprof          => 'start=no:addpid=0:file=/dev/null',
         profiling_result_dir => sub { '/home/endo/tmp/ean_nytpro_file' },
         enable_reporting     => 1,
         nytprofhtml_path     => '/usr/local/bin/nytprofhtml';

    Ean::Web->to_app();
};