テストではまったお話 test::more

17
テストではまったお話 Perl Beginners#12 @dokechin

Upload: tetsuya-tatsumi

Post on 01-Nov-2014

243 views

Category:

Technology


2 download

DESCRIPTION

Perl Test::More usage.

TRANSCRIPT

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

テストではまったお話

Perl Beginners#12 @dokechin

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

自己紹介 @dokechin

• Perl歴2年目

• PerlのWAF Mojoliciousで自作Webアプリケーションを作って運用中

• Mishima.pm主催

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

複数の配列を1つの配列にまとめたい。ただし、以下のようなルールで @array1=(1,1,3,8);

@array2=(2,3);

@array3=(5,6);

@array=(1,2,5,1,3,6,3,8);

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

こんな感じの関数をつくりたい

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);

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

とりあえず実装した 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;

}

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

テスト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");

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

テスト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 ()

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

is はスカラーにした結果値を比較している Test::Moreのソース

sub is ($$;$) {

my $tb = Test::More->builder;

return $tb->is_eq(@_);

}

プロトタイプ この場合、引数をスカラー評価してから処理する

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

Test::Moreのis はリストコンテキストの値のテストはできない

待てよ、テスト1に戻る

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

テスト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

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

書き直し

is_deeply

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

テスト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");

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

テスト2

use strict;

Use warnings;

Use Test::More;

my @result =Sort::my_sort ([],[],[]);

is_deeply(¥@result, [], "sort empty list");

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

tokuhiromさんからのコメント

`if (my $hit = shift (@$_)){` を `if (defined(my $hit = shift (@$_))){` にしないと、0がはいると無限ループになりますね。

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

tsucchiさんからのコメント

List::MoreUtils のzip(mesh)も近いけど、詰めてくれないからちょっと違うか...(undef がデータとして入ってこないなら grep で undef 除けば多分所望の動作になりますが...) my @result = grep { defined $_ } zip @aa, @bb, @cc, @dd;

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

結論

Listの操作で困ったら、List::Util,List::MoreUtilsのドキュメントを読もう。 イケてないからクールへ。

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

• ご清聴ありがとうございました

コメントいただいた xtetsujiさん、tokuhiromさん、tsucchiさん、magnolia_k_さん

ありがとうございました。