その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

Test::Synopsis::Expectationというモジュールをリリースしました

このたび,Test::Synopsis::Expectationというモジュールをリリースしました.
https://metacpan.org/pod/Test::Synopsis::Expectation
https://github.com/moznion/Test-Synopsis-Expectation


使い方や仕組み等をid:mackee_wさんの記事で紹介していただいたので,そちらの方も併せてご覧いただくと良いと思います.
SYNOPSISのコメントを使ってテストするTest::Synopsis::Expectation - ぱいぱいにっき


CPANに上がっているモジュールを使う時,多くの方が何は無くとも真っ先にSYNOPSISを見て使い方をザックリ把握するかと思います.とりあえずSYNOPSISのコードをコピペしてみて,動くかどうか見てみる的な.
で,SYNOPSISのコードが壊れていたり間違っていたりすると,モジュールのコードやテストコードを結局追わなければならなくなってしまったり,そもそもそのモジュールに対する信用が低くなってしまったりして,良いことが無いわけですね.SYNOPSISが壊れてるとみんなが悲しい気持ちになる.


そういった問題を解決すべく,miyagawaさんがTest::Synopsisという非常にクールなモジュールをリリースされていて,これが何かと言うとSYNOPSISのコードを評価してSyntax的にValidかどうかを確認してくれるという,SYNOPSISの故障検知器だったんですね.超便利!


で,今回作ったTest::Synopsis::Expectationはそこからもう一歩押し進めて,SYNOPSIS自体に期待する値を埋め込んでおいて,それをもとにSYNOPSISのコードをテストする事で,SYNOPSISがSyntax的にもLogic的にもValidであることをチェックしようと思ったのです.


そう,このようなSYNOPSISをモジュールのPOD内に書くことによって;

my $num;
$num = 1; # => 1
++$num;   # => is 2
 
use Foo::Bar;
my $instance = Foo::Bar->new; # => isa 'Foo::Bar'
 
my $str = 'Hello, I love you'; # => like qr/ove/
 
my $obj = {
    foo => ["bar", "baz"],
}; # => is_deeply { foo => ["bar", "baz"] }


利点としては,もちろん値とともにSYNOPSISをテストするからLogicが正しいかどうかをチェックできるというのに加えて,ある程度ヒューマンリーダブルなかたちで期待値を表現できるので,SYNOPSISを読んだ人が「ここはこういう値が来るのだな」というのが理解しやすくなるであろう,というのがあります (とはいえ,例のように期待値が短い時にヒューマンリーダブルになるのであって,これが非常に長い文字列やhashrefだった場合なんかはそうならないかもしれません).

テストを増やしていくと,SYNOPSISが充実して人間がわかりやすくなる,というのは割と良いのではないかなあ,と思った次第です.


最近,テストとドキュメントはポジション的に近いところにいるのではないかという思想になってきたので,こういったものを書いてみました.そのことに関してはいずれ別なものに認めたい気持ちです.
また,このモジュールを作りたいばっかりに,id:goccy54さんには無理なお願いをして,Compiler::Lexerに手を加えていただいて,Comment TokenとPod Tokenを取得出来るようにしたいただきました.本当にありがとうございます!


ご意見ご感想等,目下募集中です.
ぜひご利用下さいませ.


この記事で僕は何回SYNOPSISと書いたのだろうか……