15

Click here to load reader

Perl Test::Spec in 5 minutes

Embed Size (px)

Citation preview

Page 1: Perl Test::Spec in 5 minutes

5 minutes intro intoTest::Spec

BDD testing system for Perl

Page 2: Perl Test::Spec in 5 minutes

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

Page 3: Perl Test::Spec in 5 minutes

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, ...

Page 4: Perl Test::Spec in 5 minutes

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

Page 5: Perl Test::Spec in 5 minutes

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

Page 6: Perl Test::Spec in 5 minutes

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

Page 7: Perl Test::Spec in 5 minutes

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

Page 8: Perl Test::Spec in 5 minutes

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

Page 9: Perl Test::Spec in 5 minutes

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

Page 10: Perl Test::Spec in 5 minutes

StringCalculator

on regular day supports basic calculations supports custom delimiters

on holidays throws exception for any input

Page 11: Perl Test::Spec in 5 minutes

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

Page 12: Perl Test::Spec in 5 minutes

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

Page 13: Perl Test::Spec in 5 minutes

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

Page 14: Perl Test::Spec in 5 minutes

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

Page 15: Perl Test::Spec in 5 minutes

That’s All!