複雑なデータ構造に対するテストをする - 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