Click here to load reader
Upload
marian-schubert
View
89
Download
1
Embed Size (px)
Citation preview
5 minutes intro intoTest::Spec
BDD testing system for Perl
use Test::Spec;
describe "StringCalculator" => sub { my $calculator; my $calendar;
before each => sub { $calculator = StringCalculator->new( calendar => ( $calendar = stub() ) ); };
describe "on regular day" => sub { before each => sub { $calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers'); };
it "supports custom delimiters" => sub { is( $calculator->add('//;\n1,1'), 2); }; };
describe "on holidays" => sub { before each => sub { $calendar->stubs( today_is_holiday => 1 ) };
it "throws exception for any input" => sub { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ ); }; };};
describe "StringCalculator" => sub { my $calculator; my $calendar;
before each => sub { $calculator = StringCalculator->new( calendar => ( $calendar = stub() ) ); };
describe "on regular day" => sub { before each => sub { $calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers'); };
it "supports custom delimiters" => sub { is( $calculator->add('//;\n1,1'), 2); }; };
describe "on holidays" => sub { before each => sub { $calendar->stubs( today_is_holiday => 1 ) };
it "throws exception for any input" => sub { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ ); }; };};
Standing on the shoulders of giants.Test::Builder, Test::More, ...
describe "StringCalculator" => sub { my $calculator; my $calendar;
before each => sub { $calculator = StringCalculator->new( calendar => ( $calendar = stub() ) ); };
describe "on regular day" => sub { before each => sub { $calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers'); };
it "supports custom delimiters" => sub { is( $calculator->add('//;\n1,1'), 2); }; };
describe "on holidays" => sub { before each => sub { $calendar->stubs( today_is_holiday => 1 ) };
it "throws exception for any input" => sub { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ ); }; };};
Behavior-Driven Development
sub fooadd : Tests { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers'); is( $calculator->add('//;\n1,1'), 2); eval { $calculator->add(); }; like( $@, qr/HolidaysError/ );}
vs Test::Class
sub add : Tests { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');}
sub custom_delimiters : Tests { is( $calculator->add('//;\n1,1'), 2);}
sub holidays : Tests { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ );}
vs Test::Class
sub add_supports_simple_calculations_on_regular_day : Tests { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers');}
sub add_supports_custom_delimiters_on_regular_day : Tests { is( $calculator->add('//;\n1,1'), 2);}
sub add_throws_exception_on_holidays : Tests { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ );}
vs Test::Class
sub add_returns_zero_for_empty_input_on_regular_day : Tests { is( $calculator->add(''), 0);}
sub add_returns_given_number_for_single_number_input_on_regular_day : Tests { is( $calculator->add('1'), 1);}
sub add_returns_sum_of_comma_delimited_numbers_on_regular_day : Tests { is( $calculator->add('1,1'), 2);}
sub add_throws_exception_for_any_given_input_on_holidays : Tests { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ );}
vs Test::Class
describe "StringCalculator" => sub { my $calculator; my $calendar;
before each => sub { $calculator = StringCalculator->new( calendar => ( $calendar = stub() ) ); };
describe "on regular day" => sub { before each => sub { $calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers'); };
it "supports custom delimiters" => sub { is( $calculator->add('//;\n1,1'), 2); }; };
describe "on holidays" => sub { before each => sub { $calendar->stubs( today_is_holiday => 1 ) };
it "throws exception for any input" => sub { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ ); }; };};
Behavior-Driven Development
StringCalculator
on regular day supports basic calculations supports custom delimiters
on holidays throws exception for any input
describe "StringCalculator" => sub { my $calculator; my $calendar;
before each => sub { $calculator = StringCalculator->new( calendar => ( $calendar = stub() ) ); };
describe "on regular day" => sub { before each => sub { $calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers'); };
it "supports custom delimiters" => sub { is( $calculator->add('//;\n1,1'), 2); }; };
describe "on holidays" => sub { before each => sub { $calendar->stubs( today_is_holiday => 1 ) };
it "throws exception for any input" => sub { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ ); }; };};
Easy mocks/stubs
describe "StringCalculator" => sub { my $calculator; my $calendar;
before each => sub { $calculator = StringCalculator->new( calendar => () ); };
describe "on regular day" => sub { before each => sub { Calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers'); };
it "supports custom delimiters" => sub { is( $calculator->add('//;\n1,1'), 2); }; };
describe "on holidays" => sub { before each => sub { Calendar->stubs( today_is_holiday => 1 ) };
it "throws exception for any input" => sub { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ ); }; };};
Easy mocks/stubs
describe "StringCalculator" => sub { my $calculator; my $calendar;
before each => sub { $calculator = StringCalculator->new( calendar => ( $calendar = stub() ) ); };
describe "on regular day" => sub { before each => sub { $calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers'); };
it "supports custom delimiters" => sub { is( $calculator->add('//;\n1,1'), 2); }; };
describe "on holidays" => sub { before each => sub { $calendar->stubs( today_is_holiday => 1 ) };
it "throws exception for any input" => sub { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ ); }; };};
Multiple before/after blocks
describe "StringCalculator" => sub { my $calculator; my $calendar;
before each => sub { $calculator = StringCalculator->new( calendar => ( $calendar = stub() ) ); };
xdescribe "on regular day" => sub { before each => sub { $calendar->stubs( today_is_holiday => 0 ) };
it "supports basic calculations" => sub { is( $calculator->add(''), 0, 'returns zero for empty input'); is( $calculator->add('1'), 1, 'returns given number for single number input'); is( $calculator->add('1,1'), 2, 'returns sum of comma delimited numbers'); };
it "supports custom delimiters" => sub { is( $calculator->add('//;\n1,1'), 2); }; };
describe "on holidays" => sub { before each => sub { $calendar->stubs( today_is_holiday => 1 ) };
xit "throws exception for any input" => sub { eval { $calculator->add(); }; like( $@, qr/HolidaysError/ ); }; };};
Shortcuts
That’s All!