Test::Declareで気持ちよくテストするB!

こんにちわ!

DBIx::Skinny trackも同時進行中のnekokakです!

3日目は私が作ったTest::Declareを紹介したいと思います。

みんなテストをどうかいてる?

みなさんはテストをどのように書いてますか?

Test::Moreですかね?

Test::Baseですかね?

Test::Classですかね?

perlには色々なtest用のフレームワークが存在していますが、皆さんはそれで満足していますか?

皆さんが書いたテストコードはメンテナンスしやすいですか?

Test::Declare

私も先ほど例にあげたモジュールを使ってテストを書いてきましたがどれもしっくりきませんでした。

そこで作ったのがTest::Declareです。

Test::Declareには,以下の特徴があります。

  • テストコードをDSL風に(宣言的に)書く事を重点に置いている
  • それによりテストコード自体の見やすさを向上させることができる
  • 宣言的にテストを書く事により,一体なにを目的としたテストなのかがわかりやすくなる
  • Test::More,Test::Deep,Test::Exception,Test::Warn,Test::Outputなど良く使う関数をまとめてexportしている
  • いちいちtestのplan数をかぞえなくてもblocksという関数をつかえば自動でテスト数を数えてくれる
    • 最近だとdone_testingがあるからいらないですが

でしょうか。

では実際に使ってみましょう。

use strict;
use warnings;
use Test::Declare;
use MyAPP;

plan tests => blocks;

describe 'MyAPP test' => run {
    my $obj;
    init { $obj = MyAPP->new }
    test 'foo isa MyAPP::Foo' => run {
        isa_ok foo, 'MyAPP::Foo';
    };
    cleanup { $obj = undef };
};

Test::Declareがexportする関数の説明をします

  • blocks
    • 実行されるテストコード内に存在するテストメソッドの数をかぞえてる
  • describe
    • テストの大枠を設定
    • とくになにをするでもなく見た目を整える為だけにある
  • init
    • 名前の通り前処理を行う
    • databaseをsetupしたり
  • test
    • テスト実行フェーズ
  • cleanup
    • 後処理
    • databaseをdropしたり

Test::Declreではこのような大枠を提供しているので、それに合わせて

テストコードを書くだけです。

Test::Declareをつかえばテストを宣言的に書く事ができるので、

このtestブロックではなんのテストをしているのかが宣言でき、

より見通しがよくなります。

私が作るほとんどのモジュールではこのTest::Declareをつかって開発しています。

まとめ

今回は Test::Declare について、解説しました。

このモジュールは自分が気持ちよくテストをかけて、

さらにメンテナンスしやすくなるように考えて作ったモジュールです。

Test::Declareをつかってあなたがテストを書きやすくなったりメンテナンスしやすくなるとうれしいです。

というわけで今回はここまで。明日は新婚の id:typester さんです。