YAMLでテストケースを書く

  • 自作Perlモジュール(Perlはライブラリと呼ばないのかな)のテストを書いている。Perlでテストを書き方よく分かってないので色々調べたり勉強したり試行錯誤。
  • テストは実際に実行した値と期待値が一致するかどうかの積み重ねが基本。Perlはテストのためのモジュールやツールがとても充実しているんだね。他言語と比較できるほどの知識は持ってないんだけど。テスト自動化したり、簡単に書けるようなヘルパースクリプトがあったり、カバレッジ測定できたり、もう誰かがCPANにupしていたり。あんまりそういう効率の良いテストしたことなかったので新鮮。
  • で、CPANモジュールのテストスクリプトを色々眺めてみたが、結構書き方にこれというのもない感じ。みんな目的が違うので当然か。で、テストケースをずらずらと書き並べておけば後はそれを自動的に読み込んでテストしてくれる方法でいい方法ないかと考えた。ハッシュと配列組み合わせてネストしてと考えて組んでみたが、ネストが深くなってくるとコードが見づらい。
  • で、YAMLファイル作ってそこにテストケース書けば良いのではと思ったのが今回のエントリ。ま、すぐ思いつく程度のことなのでみんなやってるんだろうなと思いながらメモ。YAML自体よくわかってなかったので調べながら。JSONと共用できるフォーマットがいいのかな。JSONもよく分かってないけど。
- TestCaseNo: 1
  TestHTML:   test1.html
  Expect:     [1,2,3]
- TestCaseNo: 2
  TestHTML:   test2.html
  Expect:     [4,5,6]
  • Test。YAML::Syckの方がCライブラリを使ってて高速らしいし、ppmでもさっくりinstall出来たのでこっちを使う。Test::Deepは今回の目的みたく単純なパラメータ比較ではなく、ネストされたパラメータを比較するのに使えるテストモジュール。
use strict; use warnings;
use Test::More qw(no_plan);
use Test::Deep;
use YAML::Syck;

$YAML::Syck::ImplicitTyping = 1;# スカラー値が全部文字列として扱われないように
my $TestCase = YAML::Syck::LoadFile("t/TestCase1.yml");

foreach my $t (@$TestCase){
    $Crawler->{CACHEFILE} = "t/".$t->{TestHTML};
    my $result = $Crawler->Scrape();
    cmp_deeply($result,$t->{Expect},"Result value is valid.");
}
  • ひとつ問題。YAMLファイルをUTF8にしてYAML::Syck::LoadFileすると例外で落ちる。日本語をキーにしたハッシュを入れるということと、テスト対象モジュールがutf8で処理している関係でutf8にしておこうと思ったんだけど。
  • SJISにしておくとバイナリとして扱えるようで、とりあえずLoadFileはできたので、その日本語キーをテストスクリプトでEncode::decode("sjis",$japankey);してcmp_deeplyした。
$YAML::Syck::ImplicitUnicode = 1;
  • というフラグもあるみたいだけど効果なし。というよりよく分かってないので後日調査。
参考リンク