YAPC::Hokkaido SAPPORO のLTに応募しましたが、採択されませんでしたので没になった資料をそのまま公開します。
まだ型チェックの厳しい言語で消耗してるの?
動的型付け言語を使おう!
quickcheck
- 単体テストライブラリ
- 満たすべき性質を記述する
- テストケースを自動生成
- ランダムに生成する (VS smallcheck)
- テストケースの確率分布はプログラマが制御する
Test::RandomCheck
- quickcheckをPerlへ移植したもの
使用例
例えば新人が挑戦的な length
関数を書いてきた時。
use List::Util qw(sum);
sub my_length {
(my $x = splice @_, 0, 1) =~ s/./2/g;
sum (split //, $x || 0) >> 1;
}
lengthの性質
length("") == 0
length($char) == 1
length($s1 . $s2) == length($s1) + length($s2)
空文字列のチェック
is my_length(""), 0;
単位のチェック
性質を式に書く。
my_length($char) == 1;
単位のチェック
Test::RandomCheck
を使う。
use Test::RandomCheck;
use Test::RandomCheck::Generator;
random_ok {
my $char = shift;
my_length($char) == 1;
} char;
演算の保存のチェック
性質を式に書く。
my_length($s1) + my_length($s2) == my_length($s1 . $s2);
演算の保存のチェック
性質の記述に必要な型を、Test::RandomCheck::Generator
で定義。
my $type_of_arguments = concat(string, string);
演算の保存のチェック
Test::RandomCheck
を使う。
my $type_of_arguments = concat(string, string);
random_ok {
my ($s1, $s2) = @_;
my_length($s1) + my_length($s2) == my_length($s1 . $s2);
} $type_of_arguments;
自然性をチェックしてみる
性質を式に書く。
my @chars = split //, $str;
my $mapped = join '', map { $f->($_) } @chars;
my_length($str) == my_length($mapped);
自然性をチェックしてみる
性質の記述に必要な型を、Test::RandomCheck::Generator
で定義。
my $type_of_arguments = concat(string, function(char, char));
自然性をチェックしてみる
こんな感じ。
my $type_of_arguments = concat(string, function(char, char));
random_ok {
my ($str, $f) = @_;
my @chars = split //, $str;
my $mapped = join '', map { $f->($_) } @chars;
my_length($str) == my_length($mapped);
} $type_of_arguments;
まとめ
- 性質を検査できるのは便利
- 生成される変数の質が悪いから手直しいるかな・・・