Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

テストではまったお話 Test::More

604 views

Published on

Perl Test::More usage.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

テストではまったお話 Test::More

  1. 1. テストではまったお話 Perl Beginners#12 @dokechin
  2. 2. 自己紹介 @dokechin • Perl歴2年目 • PerlのWAF Mojoliciousで自作Webアプリケー ションを作って運用中 • Mishima.pm主催
  3. 3. 複数の配列を1つの配列にまとめたい。 ただし、以下のようなルールで @array1=(1,1,3,8); @array2=(2,3); @array3=(5,6); ↓ @array=(1,2,5,1,3,6,3,8);
  4. 4. こんな感じの関数をつくりたい my @array1=(1,2,3,8); my @array2=(1,3); my @array3=(5,6); my @sorted = my_sort(¥@array1,¥@array2,¥@array3); my @sorted = my_sort(@array1,@array2,@array3);
  5. 5. とりあえず実装した package Sort; use strict; use warnings; sub my_sort { my @sorted; my $total = 0; for my $array(@_){ $total = $total + scalar(@$array); } until( $total == scalar @sorted){ foreach (@_) { if (my $item = shift (@$_)){ push @sorted , $item; } } } return @sorted; }
  6. 6. テスト1 use strict; use warnings; use Test::More; my @result =Sort::my_sort ([1,2,3,8],[1,3],[5,6]); is(@result, (1,1,5,2,3,6,3,8), "sort 3 list");
  7. 7. テスト2 use strict; Use warnings; Use Test::More; my @result =Sort::my_sort ([],[],[]); is(@result, (), "sort empty list"); # got: '0' # expected: undef ← scalar @result ← scalar ()
  8. 8. is はスカラーにした結果値を比較して いる Test::Moreのソース sub is ($$;$) { my $tb = Test::More->builder; return $tb->is_eq(@_); } プロトタイプ この場合、引数をスカ ラー評価してから処理する
  9. 9. Test::Moreのis はリストコンテキスト の値のテストはできない 待てよ、テスト1に戻る
  10. 10. テスト1 use strict; use warnings; use Test::More; my @result =Sort::my_sort ([1,2,3,8],[1,3],[5,6]); is(@result, (1,1,5,2,3,6,3,8), "sort 3 list"); scalar @result →配列の要素数 8 Scalar(1,1,5,2,3,6,3,8) →リストの末尾の要素 8
  11. 11. 書き直し is_deeply
  12. 12. テスト1 use strict; use warnings; use Test::More; my @result =Sort::my_sort ([1,2,3,8],[1,3],[5,6]); is_deeply(¥@result, [1,1,5,2,3,6,3,8], "sort 3 list");
  13. 13. テスト2 use strict; Use warnings; Use Test::More; my @result =Sort::my_sort ([],[],[]); is_deeply(¥@result, [], "sort empty list");
  14. 14. tokuhiromさんからのコメント `if (my $hit = shift (@$_)){` を `if (defined(my $hit = shift (@$_))){` にしないと、0がはいると 無限ループになりますね。
  15. 15. tsucchiさんからのコメント List::MoreUtils のzip(mesh)も近いけど、詰めて くれないからちょっと違うか...(undef がデータと して入ってこないなら grep で undef 除けば多分 所望の動作になりますが...) my @result = grep { defined $_ } zip @aa, @bb, @cc, @dd;
  16. 16. 結論 Listの操作で困ったら、List::Util,List::MoreUtils のドキュメントを読もう。 イケてないからクールへ。
  17. 17. • ご清聴ありがとうございました コメントいただいた xtetsujiさん、tokuhiromさ ん、tsucchiさん、magnolia_k_さん ありがとうございました。

×