Perlのテスト:プランを立てるべきか、そうでないべきか
Perlのモジュールやアプリケーションを書いているとしましょう。ソフトウェアの品質(またはkwalitee)を少しでも保ちたいので、テストスクリプトのスイートを書いています。テストを先に書くのを良い習慣としている(テスト駆動開発を実践しているあなた、偉い!)か、アプリケーションコードがすでに存在するかに関わらず、おそらくTest::Simple、Test::More、またはTest2::Suiteのバンドルのいずれかを手に取るでしょう。後者の2つを使用するとすぐに選択肢に直面します:テストの数を計算してプランを立てるか、あるいはdone_testing()
をテストスクリプトの最後に置いてそれを省略するか。
どちらのアプローチにも良い理由があります。始めたばかりのときは、スクリプトにどれくらい多くのテストが含まれるか想像もつかないでしょう。結局のところ、テストスクリプトはモジュールのインターフェースを設計するための便利なツールとして、それを使用するコードの例を書く過程で役に立つでしょう。探求的なコードは、モジュールやアプリケーションがすでに完成しており、あなたが望む通りに動作することを試すかのように書かれます。この場合、プランを宣言しないことは非常に理にかなっています。 最後にdone_testing()
を置いて、テスト定義に戻るだけです。
もちろん、Test::Simpleを使用する場合にそのオプションはありません—それは非常に基本的で関数(ok()
)が1つしかなく、モジュールをuse
するときに実行するテストの数を前もって宣言する必要があります、以下のように:
use Test::Simple tests => 23;
フルスクリーンモードを開始 フルスクリーンモードを終了
Test::Moreもこの形式のプランをサポートしていますし、plan
関数を使ってスクリプトやsubtest
でのテスト数を状態することを選択できます。Test2を使う場合はplan
を使う必要がありますが、いずれの方法も、プランは一種のメタテストとして機能し、意図したとおりにちょうどそれだけのテストが実行されたことを確認します:それ以上でもそれ以下でもない。特定のテストセットが何回実行されるべきか予測できない状況があるにせよ、私は他のすべての場合にはテストを「整理」してプランを宣言するべきだと強く提案します。後で、テストを追加または削除した場合には、何かが変わったことにすぐ気づき、新しいプランを立てる時だとわかるでしょう。
他のPerlテストフレームワークについてはどうでしょうか? これらもプランを使用できます。ここに2つの例があります:
- Test::Classは、メソッドのTest属性の一部としてプランを宣言し、
fail_if_returned_early
とfail_if_returned_late
というヘルパーメソッドを使用して、守られないプランは失敗を引き起こすべきであることを示します。 - Test::Class::Mooseは「プランは不要」と言いつつも、属性またはメソッド呼び出しを通じてプランを宣言することも可能です。
意見はありますか? テストプランを宣言することは、テストを書く際に余りにも柔軟性がなくなりすぎるでしょうか? プランがないことは悪い行動を助長しますか? あなたの考えをコメントで教えてください。
こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/mjgardner/testing-perl-to-plan-or-not-to-plan-3plb