Perl 6 のテストを書く

はじめに

 この記事は、 Perl6 Advent Calendar 2011 (日本版)の7日目の記事です。

テストは重要です

 Perl 6 では Test モジュールが用意されています。 Test モジュールが提供するテスト機能は、 Test Anything Protocol ( TAP ) の形式で使用できます。

 ご存知の方も多いかと思いますが、 Perl 5 にも Test::More というモジュールがあり、 TAP 形式のテストを簡単に書くことができます。 Perl 6 の Test も、基本的には Perl 5 のテストと同じように書くことができます。

Test モジュールの基本的な機能

 まずは簡単なところから。 ok() と nok() は第一引数が真か偽かを判断します。

ok $cond; # $cond が真なら OK
nok $cond; # $cond が偽なら OK

 値の比較をしたい時は、 is() と isnt() でできます。

is func($param), 'expected'; # func($param) の戻り値が 'expected' なら OK
isnt func($param), 'expected?'; # func($param) の戻り値が 'expected' でなければ OK

 データ構造の比較は、 is_deeply() でできます。

is_deeply $struct, $expected;

 オブジェクトが想定するクラスのインスタンスかテストしたい時は、 isa_ok() が使えます。

isa_ok("string", Str); # "string" オブジェクトは Str クラスのインスタンスなので OK

 クラスの継承関係も適切に判定できます。

class Parent {};
class Child {};
isa_ok(Parent.new, Child); # not ok
isa_ok(Child.new, Parent); # ok

今はまだ使えない機能

 将来的には実装される予定ではありますが、まだ実装されていない機能もあります。 Test::More にもある like() や unlike() 、 use_ok() などがそうです( rakudo-star-2011.07 で確認)。

さいごに

 言語を問わず、テストは大切です。だからこそ、テストが書きやすいことも重要ですし、テスト関連の機能は充実していることが望ましいでしょう。

 ここでは簡単な説明しかしていませんが、 Perl 6 でのテストについては、過去に Day 4: Testing | Perl 6 Advent Calendar でも書かれています。

 私は使ったことがありませんが、 Perl 6 Modules Directory には、テスト関連のモジュールもいくつかあります。先に説明した機能やこれらのモジュールを用いることで、より良いテストを行いましょう。