notebook

都内でWEB系エンジニアやってます。

jenkinsでコードメトリクス、カバレッジレポートの表示

jenkinsを使って自動テストをまわせるようにしたので、もう少し色々やってみます

今回もperlのプロジェクトでの話

テスト結果の集計

  • テスト結果の推移を表示する

TAP::Formatter::JUnitを用いてJUnit互換のテストスイートを作成

prove -Ilib -It/lib -lvr $WORKSPACE/t --formatter TAP::Formatter::JUnit > test_results.xml
  • ビルド後の処理の追加

JUnitテスト結果の集計」を追加する

テスト結果XMLシェルスクリプトで出力したファイルを指定する(test_results.xml)

テスト結果が表示されるようになったが、日本語がうまく表示してくれない。。。

f:id:swfz:20160412035458p:plain

TAP::Formatter::JUnitで、subtestに設定した日本語が16進数コードになる現象についての対応

なので、↑の記事から拝借してつなげた

prove -Ilib -It/lib -lvr $WORKSPACE/t --formatter TAP::Formatter::JUnit | perl -i -ple 's/\[\\x([a-f0-9]{2})\]/pack("H*", $1)/egx' > test_result.xml

プロジェクトトップに遷移のグラフが出力される

f:id:swfz:20160412035507p:plain

これで成功テストと失敗テストの推移をグラフ化できる

どのくらいテストケースが実行されているかの推移がわかる

地味にやる気出そうですね

カバレッジレポートの表示

下記参考に Devel::Coverのの出力をCloverで扱えるように変換する

PerlプロジェクトでテストカバレッジのCIをする方法

perlではDevel::Coverでコードのカバレッジを取得することが出来る

jenkinsではコードカバレッジClover というものと連携して表示させるようにしている

なので、Cloverで使えるようなフォーマット変換が出来ればOK

使うプラグイン

プラグインをインストールして「ビルド手順の追加」で設定

f:id:swfz:20160412035519p:plain

カバレッジ閾値とcoverコマンドで出力されるclover.xmlを指定する

f:id:swfz:20160412035526p:plain

f:id:swfz:20160412035535p:plain

するとこんな感じでレポートが表示される

  • Coverageレポートの表示

「ビルド後の処理の追加」からPublisher Pluginの設定を行う

f:id:swfz:20160412035551p:plain

cover -report htmlで出力したレポートの場所を指定する

  • cover_db
  • coverage.html
  • cover_db

という風に設定

下図のようにリンクが追加される

f:id:swfz:20160412035608p:plain

押下すると画像のようにカバレッジレポートが出力されるようになった

f:id:swfz:20160412035614p:plain

クローバーのアイコンとプロジェクトトップの画像をクリックして遷移するはずの画面はNotFound...一旦無視

ここまででのシェルスクリプトの内容

cover -delete

cd $WORKSPACE
HARNESS_PERL_SWITCHES="-MDevel::Cover=+ignore,.*,+ignore,inc,+ignore,local,+select,^lib/App,-silent,1" \
prove --formatter TAP::Formatter::JUnit \
 -Ilib -It/lib -lvr $WORKSPACE/t \
| perl -i -ple 's/\[\\x([a-f0-9]{2})\]/pack("H*", $1)/egx'  > test_results.xml

cover -report clover
cover -report html

前後にcoverのコマンドを入れたのとHARNESS_PERL_SWITCHES環境変数を追加しました

静的コード解析

measureperl-checkstyleを使ってコードメトリクスを表示するようにする

関数の複雑度、関数の行数共に閾値で与えた数値を超えたものを出力してくれる

  • Perl::Metrics::Liteをインストール
cpanm Perl::Metrics::Lite

普通に実行してみる

measureperl-checkstyle --max_sub_lines 60 --max_sub_mccabe_complexity 20 --directory lib

xmlが出力されるのでこれをファイルに出力させてpluginで扱うようにする

f:id:swfz:20160412035623p:plain

これを設定に含める

Checkstyle Plug-inを入れて解析結果をレポーティングできるようにする

ビルドを実行すると新たに「Checkstyle警告」というものとグラフが出てくるようになる

f:id:swfz:20160412035630p:plain

f:id:swfz:20160412035638p:plain

追ってくとソースコードのどこが複雑で長い関数があるなどの情報がわかる

Perl コードのメトリクス測定

上記サイトを参考にして閾値を設定してみた

見たところ黒歴史が沢山あった.....

徐々に改修して行けたらいいな...という感じ

最終的に下記のようなシェルスクリプトになった

source ~/perl5/perlbrew/etc/bashrc

cover -delete

HARNESS_PERL_SWITCHES="-MDevel::Cover=+ignore,.*,+ignore,inc,+ignore,local,+select,^lib,-silent,1" \
prove --formatter TAP::Formatter::JUnit \
-Ilib -It/lib -lvr $WORKSPACE/t \
| perl -i -ple 's/\[\\x([a-f0-9]{2})\]/pack("H*", $1)/egx'  > test_results.xml

cover -report clover
cover -report html

measureperl-checkstyle --max_sub_lines 60 --max_sub_mccabe_complexity 20 --directory lib > checkstyle-result.xml

今後のリファクタリングなり改善の指標にできたら良いなと思うところです