複雑なデータ構造に対するテストをする - Test::Differences編

Perlでは複雑なデータ構造に対するテストを行うモジュールの一つとして、Test::Differencesという二つのモジュールが存在します。

例えば、以下のように複数行に渡る文字列があったとしましょう。

use strict;
use warnings;
use Test::More qw(no_plan);
use Test::Differences;

my $expected = 'Mooose
is
really cool';

my $got = 'MOOOOOOOSE
is
really cooooooooooooooooooooooool';

eq_or_diff $got, $expected, 'Same string';

この場合に、Test::Differencesを使って、文字列が一致しているかどうかを比較すると、失敗したときにdiffが表示されます。

testdifferences......1/? 
#   Failed test 'Same string'
#   at testdifferences.t line 14.
# +---+-----------------------------------+-------------+
# | Ln|Got                                |Expected     |
# +---+-----------------------------------+-------------+
# *  1|MOOOOOOOSE                         |Mooose       *
# |  2|is                                 |is           |
# *  3|really cooooooooooooooooooooooool  |really cool  *
# +---+-----------------------------------+-------------+
# Looks like you failed 1 test of 1.

行毎に文字列の比較結果が表示されるので、どこに間違いがあるかが簡単に確認できます。

とはいっても、複数行のデータを比較するときなんかそんなないよ!と思われる方もいるかもしれません。そう思われた方は、是非、以下のドキュメントを読んでみてください。

石井さんの、「オブジェクトの文字列表現を活用しよう」
http://www.objectclub.jp/community/memorial/homepage3.nifty.com/masarl/article/junit/to-string.html

これは、テストコードのリーダビリティを高めるための重要なテクニックの一つです。テスト対象の粒度を大きくとることで、テストの意図を明確にする事ができる。また、テストコードのリーダビリティも高くなります。

オブジェクトの文字列表現を活用してテストのリーダビリティを高めつつ、かつTest::Differencesを組み合わせる事で、テスト失敗時の原因をわかりやすくすることができます。

では、Happy Testing !

# Test::Diffのdiffのstyleもsupportされるみたいですね.
http://use.perl.org/~Ovid/journal/37083