未リリース Test::Clear 作ってる
Test::Clear hixi-hyi/p5-Test-Clear · GitHub っていうのを作ってる。
case "{name} case" => { name => 'hixi' }, sub { my $dataset = shift; my $ret = $module->get_person($dataset->{name}); is $ret, xxxxx; }; # Subtest: basically name:hixi
subtestの何が嫌って、ユニットテストを書く時に、明確にスコープを分けようとすると、 以下のように書かないといけない。
{ my $name = 'hixi'; subtest "$name case" => sub { ok $module->get_person($name), xxx; }; } { my $name = undef; subtest "$name case" => sub { ok !$module->get_person($name), xxx; }; }
一応Test::Simple(1.001006)以降だったら以下のようにかける。
が、subtestには変数を入れれなくなってしまって、何のテストをしているのかを明確に記述できない。
また、最後の行まで見ないと、何の変数のテストをしているのかがわからない。
(通常テストを見たり書くときには、前提データが何なのかを知りたい/定義したい)
subtest "case" => sub { ok $module->get_person($_[0]->{name}), xxx; }, { name => 'name' };
なので、文頭で書いたように、データセットを明確に記述出来るようなものを書いてる。
2つ目の引数は、coderefの場合は実行するようになってるので、こんなふうに書くことも出来る。
この場合はテストケースである、uriを明確に定義できるし、データセットが明確にわかりやすいんじゃないかな。
case 'request person data uri:{uri}' => sub { my $user_id = 1; my $uri = 'http://example.com/person/' . $user_id; return { uri => $uri, user_id => $user_id, } }, sub { my $dataset = shift; my $ret = $module->request($dataset->{uri}); is $ret->{person}->{id}, $dataset->{user_id}; }; # Subtest: request person data uri:http://example.com/person/1
ってことで、こんなの作ってます。
未リリース。
Test::Clearとかそんな一等地を取っていいのかも分からない!
※ ちなみに、TODOの改善もしてる こんな感じ。コードブロックにするとインデントとかちょっと嫌じゃないですかー的な。Clear
subtest 'optional case' => sub { my $guard = todo_scope 'not yet implementated'; fail; }; # Subtest: optional case not ok 1 # TODO not yet implementated