Perl のテストに関するモジュールをまとめてみる

掲題の通り、Perl におけるテストに関するモジュールの情報をまとめてみました。

既に類似の記事もありましたが(後述)、自分が最近使ったモジュールの情報がなかったりしたので、自分なりにまとめ直すことにしました。

そこそこ書いてみたつもりですが、そんなに網羅性は高くないと思います。
ここで紹介しきれていないモジュールについては、末尾の参考記事等をご参照下さい。

他に抑えておいた方がいい、よく使われるモジュールもあると思います。
何かありましたら、コメントや編集リクエストをお待ちしています。

## フレームワーク系モジュール

`Test::Xxx` なモジュールは数多あるのですが、Perl でテストを書くために必要十分なモジュールをここでは「フレームワーク系モジュール」と称することにします。

### [Test::More](https://metacpan.org/pod/Test::More)

Perl におけるテストのためのデファクトスタンダードといえるモジュールでしょう。

こだわらない人はとりあえずこれを使っておけばいいと思います。
機能に不足を感じたら別のモジュールで補うということもできます。

- [perl でテストを始めよう！！ - Perl Advent Calendar Japan 2011 Test Track](http://perl-users.jp/articles/advent-calendar/2011/test/1)

### [Test::Simple](https://metacpan.org/pod/Test::Simple)

Test::More よりも機能を絞った簡素なモジュールのようです。
筆者は使ったことがありません。
ふつうは Test::More を使えばいいと思います。

敢えて Test::Simple を使うのは Yet Another な `Test::Xxx` を作りたいときぐらいではないでしょうか。

- http://search.cpan.org/dist/Test-Simple/lib/Test/Tutorial.pod … Test::Simple を使ったテストのチュートリアル

### [Test::Most](https://metacpan.org/pod/Test::Most)

Test::More の機能に物足りなくなってきたあなたのためのモジュールです。
内部で `Test::Xxx` なモジュールを use して関数を export しており、執筆時点(2015/5/24) の v0.34 では以下で置き換えられるとドキュメントに書かれています。

```perl
use strict;
use warnings;
use Test::Exception 0.88;
use Test::Differences 0.500;
use Test::Deep 0.106;
use Test::Warn 0.11;
use Test::More;
```

- [第27回 Test::Most：Test::Moreでは物足りなくなってきたら：モダンPerlの世界へようこそ｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/serial/01/modern-perl/0027)

### [Test::Base](https://metacpan.org/pod/Test::Base)

色んなデータパターンでテストするときにすっきり書けるようにしてくれるものです。
ドキュメントでは Test::Base を拡張してユーザ独自モジュールを作る例が載せられていますが、Test::Base 単体でも利用可能です。

- [第2回 Test::Baseの紹介：Happy Testing Perl｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/feature/01/test-perl/0002)

### [Test::Class](https://metacpan.org/pod/Test::Class)

筆者は使ったことがないので参考記事から引用すると、「xUnit スタイルで Perl のテストを書けるフレームワーク」だそうです。

- [第30回 Test::Class：ユニットテストに使うだけでなく：モダンPerlの世界へようこそ｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/serial/01/modern-perl/0030)
- [Test::Class - naoyaのはてなダイアリー](http://d.hatena.ne.jp/naoya/20060629/1151548135)

### [Test::Declare](https://metacpan.org/pod/Test::Declare)

@nekokak さん作の、テストコードをDSLで宣言的に書けるようにしてくれるモジュールです。
テストコードがごちゃごちゃしてきたと思ったら試してみるといいことがあるかもしれません。

内部で Test::More，Test::Deep，Test::Exception，Test::Warn，Test::Output を use して関数を export しています。

- [第3回 Test::Declareの紹介：Happy Testing Perl｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/feature/01/test-perl/0003)

## テスト機能拡張モジュール

テスト用の便利な関数や機能を提供してくれるモジュールです。
中には `Test::Exception` など「フレームワーク」として単体で使えるものもあるのですが、特定の機能に特化しているものはこちらに入れています。

### [Test::Deep](https://metacpan.org/pod/Test::Deep)

ネストが深いデータ構造の比較を可能にしてくれます。
単純な1階層のハッシュや配列(リファレンス含む)の比較であれば、 `Test::More::is_deeply` で十分なケースもあると思います。

### [Test::Difference](https://metacpan.org/pod/Test::Differences)

これも `Test::More::is_deeply` の機能強化版のようです。
比較結果が見やすそうです。

- [複雑な構造のデータをテストする : おまえのログ](http://norainu.net/mt/archives/2006/05/post_68.html)

### [Test::Exception](https://metacpan.org/pod/Test::Exception)

実行時エラーや `die`, そのときのメッセージなどをテストできるようにしてくれます。
`die` しないことのテストにも使えます。

- [Test::Exception で Death テスト - Perl Advent Calendar Japan 2011 Test Track](http://perl-users.jp/articles/advent-calendar/2011/test/14)

### [Test::MockObject](https://metacpan.org/pod/Test::MockObject)

stub メソッドを作って、オブジェクト(モジュール) をでっち上げることを可能にしてくれます。
開発担当が分かれていて、該当のモジュールが出来ていないときや、「この関数がこれこれを返す」ことを前提としてテストを書きたいときに使えるでしょう。

Test::MockObject::Extend というモジュールも同梱されており、これを使うとモジュールのインスタンス(blessed reference)を MockObject 化することができます。

- [Perlで単体テスト - yokkunsの日記](http://d.hatena.ne.jp/yokkuns/20090920/1253410002)

### [Test::Mock::Guard](https://metacpan.org/pod/Test::Mock::Guard)

Test::MockObject のように stub 関数を作れるものですが、特定のブロック内で stub 化してくれます。
スコープを抜けたら元の挙動に戻ります。

- [Test::Mock::Guard Released - Yet Another Hackadelic](http://d.hatena.ne.jp/ZIGOROu/20110308/1299605305)
- [にひりずむ::しんぷる - 最近の Test::Mock::Guard](http://blog.livedoor.jp/xaicron/archives/53251833.html)

## テスト支援系モジュール

直接テストの機能を提供するものではありませんが、テストのための機能を持つモジュールです。

### [Test::mysqld](https://metacpan.org/pod/Test::mysqld)

テスト時に mysqld を起動して、MySQL に依存するテストを可能にしてくれるモジュールです。

- [Kazuho@Cybozu Labs: Perl のテスト用に MySQL 環境を自動で構築するモジュール Test::mysqld を書いた](http://developer.cybozu.co.jp/archives/kazuho/2009/08/perl-mysql-test.html)

### データベース Fixture 系

DB のテストをするときには Fixture を使ってデータをロードしたいことがあると思います。
これを簡単に実現してくれるモジュールがいくつかあるのでまとめて書いておきます。

- [Test::Fixture::DBI](https://metacpan.org/pod/Test::Fixture::DBI)
  - [Test::Fixture::DBI で覚えるデータベーステスト - JPerl Advent Calendar 2010 Hacker Track](http://perl-users.jp/articles/advent-calendar/2010/hacker/1)
- [DBIx::FixtureLoader](https://metacpan.org/pod/DBIx::FixtureLoader)
  - [おそらくはそれさえも平凡な日々: DBIx::FixtureLoaderってのを書きました](http://www.songmu.jp/riji/archives/2013/06/dbixfixtureload.html)
- [Test::Fixture::DBIxSkinny](https://metacpan.org/pod/Test::Fixture::DBIxSkinny)

### [Harriet](https://metacpan.org/pod/Harriet)

テストのときに mysqld や memcached など daemon の起動・停止をカジュアルに実現してくれるツールです。

- [Harriet ー テストのときつかうにデーモンの取扱を簡単にするためのフレームワーク - blog.64p.org](http://blog.64p.org/entry/2013/05/16/201916)

## その他のテスト関連モジュール

### [Test::Harness](https://metacpan.org/pod/Test::Harness)

`prove` コマンドの内部で使われているモジュールです。

- [第1回 Perlにおけるテストの概要／TAPとは？：Happy Testing Perl｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/feature/01/test-perl/0001)

## もっとたくさんあります！！

[PerlでTDD(テスト駆動開発)するなら覚えておきたいCPANモジュール群 | hirobanex.net](http://hirobanex.net/article/2012/08/1343880047) という記事でも多数紹介されています。

## Perl のテストに関するまとまった情報

- [Perl Advent Calendar Japan 2011 Test Trac](http://perl-users.jp/articles/advent-calendar/2011/test/)
- [Happy Testing Perl：特集｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/feature/01/test-perl)
- [はてな教科書 / Perl を使ったテストの書き方](https://github.com/hatena/Hatena-Textbook/blob/master/test-for-perl.md)