Test2::Suiteを使ってテストを書く

吉祥寺.pmは一応(?)Perlのイベントなので、たまにはPerlのことを書いてみます。

Test2モジュール

Perlのテスティングフレームワークと言えばTest::Moreがスタンダードですが、今リリースされているTest::More v1.3以降では内部構造が全て作り直されていて、Test2というモジュールがベースになっています。

Test2モジュールでは、テストの結果やメッセージが全て「イベント」という形で取り出せるようになっていて、テストモジュールの作者は従来より確実にテストができるようになっています。

詳細は割愛しますが、従来のTest::Moreではテストモジュールのテストが難しい、という課題を解決するためにTest2モジュールは作られました。

Test2::Suiteモジュール

さて、Test::Moreの中身はTest2モジュールを使って書き直されていますが、後方互換性を維持するため単にTest::Moreを使うだけであれば、テストの書き方は従来とまったく変わりませんが、おなじくTest2モジュールをベースにしたTest2::Suiteというモジュールを使うと、今までよりテストを書く上で便利な機能が使えるようになります。

例えばTest2::Bundle::Moreを使えば、より詳細なメッセージを出力するis_deeplyが使えますし、Test2::Plugin::UTF8というプラグインを使えば、Unicode文字列が正しく表示されるようになります。

use Test2::Bundle::More;
use Test2::Plugin::UTF8;

use utf8;

my $hash1 = { name => "ガンダルフ" };

is_deeply($hash1, { name => "サルマン"}, "イスタルの名前");

done_testing;

実行すると(当然ハッシュの中身は一致しないので)テストが失敗し、その詳細なメッセージが表示されます。

$ perl test.t
not ok 1 - イスタルの名前
# Failed test 'イスタルの名前'
# at test.t line 8.
# +--------+------------+----+----------+
# | PATH   | GOT        | OP | CHECK    |
# +--------+------------+----+----------+
# | {name} | ガンダルフ | eq | サルマン |
# +--------+------------+----+----------+
1..1

Test::Moreis_deeplyより読みやすい形式で出力されました。また日本語を出力しても、おなじみのWide Character...のメッセージも出力されていません。

なお、Unicode文字列を表示する際には、Unicode::GCStringモジュールがインストールされていないと、正しい文字幅で表示できない旨の警告メッセージが表示されるので、併せてインストールしておいた方が良いようです。

おわりに

このようにTest2::Suiteを使うことでTest::Moreより分かりやすいテストが書けるようになります。ぜひ使ってみてください。

かんたん Perl (プログラミングの教科書)

かんたん Perl (プログラミングの教科書)