ひぃ(hixi)の技術雑記ブログ

事実や解決策というよりも自分が思ったことをつらつらと書いていく所存。文章構成とかそういうのあまり気にせずに書きます

未リリース 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