Happy Testing Perl

第4回 Test::Perl::Critic, Test::Pod, Test::Pod::Coverage, Test::Exception, Test::Warn, Devel::Coverの紹介

この記事を読むのに必要な時間:およそ 3 分

Test::Warn

このモジュールもTest::Declareで利用しているモジュールで,Text::Exceptionと異なり,warningsが発生したことをテストするモジュールです。

たとえば,先ほどのSomeModuleのfooメソッド呼び出しの際,dieするのではなく,以下のようにwarnを出すとします。

package SomeModule;
use strict;
use warnings;

sub foo {
   my ($class, $args) = @_;
   unless ($args) {
       warn 'no args!';
   }
   return $args;
}

1;

この場合ではTest::ExceptionではなくTest::Warnを利用します。利用方法は以下のようになります。

use SomeModule;
use Test::More;
use Test::Warn;
plan tests => 1;

warning_like { SomeModule->foo } qr/no args!/ ;

このモジュールを利用しなくてもテストする方法はもちろんあります。一例としては以下のようなテストです。

use SomeModule;
use Test::More;
plan tests => 1;

my $warnings;
local $SIG{__WARN__} = sub {
   $warnings = shift;
};

SomeModule->foo;

like $warnings, qr/no args/ ;

Test::Warnを利用したテストコードのほうが,何をテストしたいのかがはっきりしています。テストコードを書く際にはこのコードでどのようなテストをしたいのかがわかるように書くと,全体として見通しの良いテストコードとなりメンテナンスしやすくなることでしょう。

Devel::Cover

このモジュール自体が何かをテストしてくれるわけではありませんが,テストコードのカバレッジ率を調べるのに役立つモジュールです。

使い方は簡単で,Devel::Coverモジュールをインストールしたら以下のように実行するだけです。

$ perl Makefile.PL
$ cover -test -ignore_re "^inc/"

実行後に結果のHTMLが生成されるので,それを見れば,どのメソッドのテストケースが不足しているのかが一目瞭然となります。

 Devel::Coverの実行結果例

図 Devel::Coverの実行結果例

Devel::Coverでは以下の網羅率を調べることができます。

命令 ステートメント(文)を網羅しているか
分岐 if文などの分岐を網羅しているか
条件 $a and $b and $cなどのパターンを網羅しているか
サブルーチン テストでサブルーチンがcallされているか
ドキュメント サブルーチンはPODにかかれているか

テストコードはただ量を増やせばいいのではなく,さまざまな条件をカバーするテストを書く必要があります。このモジュールを利用することによって,どれだけのコードがテストによってカバーされているかを視覚的に判断することができるのが魅力です。

ただ,このモジュールを利用してテストを実行すると,テスト全体の実行時間が通常よりもかかってしまうので,通常の開発時にはチェックせず,一通りのテストが用意できた段階で,カバレッジ率を見るように実行したほうが良いでしょう。

まとめ

Perlには本当にたくさんのテスト用モジュールが存在します。これらのモジュールを利用して,快適なテスト生活を送れるよう頑張ってください。

Happy testing!

著者プロフィール

小林篤(こばやしあつし)

株式会社モバイルファクトリー システム開発部所属。

携帯公式サイト構築をはじめ,公式サイトで利用する楽曲を管理するプロジェクト開発を担当。インフラ関係ではメールサーバを構築運用したりもしている。

ネコが大好きだが,ネコアレルギーなこまったぷろぐらま。

ブログはhttp://d.hatena.ne.jp/nekokak/など。

バックナンバー

Happy Testing Perl