SlideShare a Scribd company logo
1 of 15
Download to read offline
5 minutes intro into
Test::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!

More Related Content

What's hot

Symfony CoP: Form component
Symfony CoP: Form componentSymfony CoP: Form component
Symfony CoP: Form componentSamuel ROZE
 
Command Bus To Awesome Town
Command Bus To Awesome TownCommand Bus To Awesome Town
Command Bus To Awesome TownRoss Tuck
 
CQRS and Event Sourcing in a Symfony application
CQRS and Event Sourcing in a Symfony applicationCQRS and Event Sourcing in a Symfony application
CQRS and Event Sourcing in a Symfony applicationSamuel ROZE
 
Models and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and HobgoblinsModels and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and HobgoblinsRoss Tuck
 
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011Masahiro Nagano
 
R57shell
R57shellR57shell
R57shellady36
 
Your Second iPhone App - Code Listings
Your Second iPhone App - Code ListingsYour Second iPhone App - Code Listings
Your Second iPhone App - Code ListingsVu Tran Lam
 
(PHPers Wrocław #5) How to write valuable unit test?
(PHPers Wrocław #5) How to write valuable unit test?(PHPers Wrocław #5) How to write valuable unit test?
(PHPers Wrocław #5) How to write valuable unit test?RST Software Masters
 
Decoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DICDecoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DICKonstantin Kudryashov
 
A Series of Fortunate Events - Drupalcon Europe, Amsterdam 2014
A Series of Fortunate Events - Drupalcon Europe, Amsterdam 2014A Series of Fortunate Events - Drupalcon Europe, Amsterdam 2014
A Series of Fortunate Events - Drupalcon Europe, Amsterdam 2014Matthias Noback
 
A Series of Fortunate Events - Symfony Camp Sweden 2014
A Series of Fortunate Events - Symfony Camp Sweden 2014A Series of Fortunate Events - Symfony Camp Sweden 2014
A Series of Fortunate Events - Symfony Camp Sweden 2014Matthias Noback
 
Things I Believe Now That I'm Old
Things I Believe Now That I'm OldThings I Believe Now That I'm Old
Things I Believe Now That I'm OldRoss Tuck
 
Dealing with Legacy PHP Applications
Dealing with Legacy PHP ApplicationsDealing with Legacy PHP Applications
Dealing with Legacy PHP ApplicationsClinton Dreisbach
 
Building secured wordpress themes and plugins
Building secured wordpress themes and pluginsBuilding secured wordpress themes and plugins
Building secured wordpress themes and pluginsTikaram Bhandari
 

What's hot (20)

Symfony CoP: Form component
Symfony CoP: Form componentSymfony CoP: Form component
Symfony CoP: Form component
 
Zend framework service
Zend framework serviceZend framework service
Zend framework service
 
Command Bus To Awesome Town
Command Bus To Awesome TownCommand Bus To Awesome Town
Command Bus To Awesome Town
 
CQRS and Event Sourcing in a Symfony application
CQRS and Event Sourcing in a Symfony applicationCQRS and Event Sourcing in a Symfony application
CQRS and Event Sourcing in a Symfony application
 
Symfony2 your way
Symfony2   your waySymfony2   your way
Symfony2 your way
 
Models and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and HobgoblinsModels and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and Hobgoblins
 
Java day9n
Java day9nJava day9n
Java day9n
 
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
 
R57shell
R57shellR57shell
R57shell
 
Your Second iPhone App - Code Listings
Your Second iPhone App - Code ListingsYour Second iPhone App - Code Listings
Your Second iPhone App - Code Listings
 
(PHPers Wrocław #5) How to write valuable unit test?
(PHPers Wrocław #5) How to write valuable unit test?(PHPers Wrocław #5) How to write valuable unit test?
(PHPers Wrocław #5) How to write valuable unit test?
 
Min-Maxing Software Costs
Min-Maxing Software CostsMin-Maxing Software Costs
Min-Maxing Software Costs
 
Decoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DICDecoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DIC
 
A Series of Fortunate Events - Drupalcon Europe, Amsterdam 2014
A Series of Fortunate Events - Drupalcon Europe, Amsterdam 2014A Series of Fortunate Events - Drupalcon Europe, Amsterdam 2014
A Series of Fortunate Events - Drupalcon Europe, Amsterdam 2014
 
A Series of Fortunate Events - Symfony Camp Sweden 2014
A Series of Fortunate Events - Symfony Camp Sweden 2014A Series of Fortunate Events - Symfony Camp Sweden 2014
A Series of Fortunate Events - Symfony Camp Sweden 2014
 
AngularJs
AngularJsAngularJs
AngularJs
 
Things I Believe Now That I'm Old
Things I Believe Now That I'm OldThings I Believe Now That I'm Old
Things I Believe Now That I'm Old
 
Dealing with Legacy PHP Applications
Dealing with Legacy PHP ApplicationsDealing with Legacy PHP Applications
Dealing with Legacy PHP Applications
 
How te bring common UI patterns to ADF
How te bring common UI patterns to ADFHow te bring common UI patterns to ADF
How te bring common UI patterns to ADF
 
Building secured wordpress themes and plugins
Building secured wordpress themes and pluginsBuilding secured wordpress themes and plugins
Building secured wordpress themes and plugins
 

Similar to Perl Test::Spec in 5 minutes

Testowanie JavaScript
Testowanie JavaScriptTestowanie JavaScript
Testowanie JavaScriptTomasz Bak
 
Advanced php testing in action
Advanced php testing in actionAdvanced php testing in action
Advanced php testing in actionJace Ju
 
The Art of Transduction
The Art of TransductionThe Art of Transduction
The Art of TransductionDavid Stockton
 
Any event intro
Any event introAny event intro
Any event introqiang
 
20 modules i haven't yet talked about
20 modules i haven't yet talked about20 modules i haven't yet talked about
20 modules i haven't yet talked aboutTatsuhiko Miyagawa
 
Extbase and Beyond
Extbase and BeyondExtbase and Beyond
Extbase and BeyondJochen Rau
 
Watch out: Observables are here to stay
Watch out: Observables are here to stayWatch out: Observables are here to stay
Watch out: Observables are here to stayGuilherme Ventura
 
TLS305 Using DynamoDB with the AWS SDK for PHP - AWS re: Invent 2012
TLS305 Using DynamoDB with the AWS SDK for PHP - AWS re: Invent 2012TLS305 Using DynamoDB with the AWS SDK for PHP - AWS re: Invent 2012
TLS305 Using DynamoDB with the AWS SDK for PHP - AWS re: Invent 2012Amazon Web Services
 
Symfony (Unit, Functional) Testing.
Symfony (Unit, Functional) Testing.Symfony (Unit, Functional) Testing.
Symfony (Unit, Functional) Testing.Basel Issmail
 
Mike King - Storytelling by Numbers MKTFEST 2014
Mike King - Storytelling by Numbers MKTFEST 2014Mike King - Storytelling by Numbers MKTFEST 2014
Mike King - Storytelling by Numbers MKTFEST 2014Marketing Festival
 
Storytelling By Numbers
Storytelling By NumbersStorytelling By Numbers
Storytelling By NumbersMichael King
 
Internationalizing CakePHP Applications
Internationalizing CakePHP ApplicationsInternationalizing CakePHP Applications
Internationalizing CakePHP ApplicationsPierre MARTIN
 
Introduction à CoffeeScript pour ParisRB
Introduction à CoffeeScript pour ParisRB Introduction à CoffeeScript pour ParisRB
Introduction à CoffeeScript pour ParisRB jhchabran
 
PHPUnit でよりよくテストを書くために
PHPUnit でよりよくテストを書くためにPHPUnit でよりよくテストを書くために
PHPUnit でよりよくテストを書くためにYuya Takeyama
 

Similar to Perl Test::Spec in 5 minutes (20)

Testowanie JavaScript
Testowanie JavaScriptTestowanie JavaScript
Testowanie JavaScript
 
Advanced php testing in action
Advanced php testing in actionAdvanced php testing in action
Advanced php testing in action
 
The Art of Transduction
The Art of TransductionThe Art of Transduction
The Art of Transduction
 
project
projectproject
project
 
Daily notes
Daily notesDaily notes
Daily notes
 
Presentation1
Presentation1Presentation1
Presentation1
 
Any event intro
Any event introAny event intro
Any event intro
 
20 modules i haven't yet talked about
20 modules i haven't yet talked about20 modules i haven't yet talked about
20 modules i haven't yet talked about
 
Extbase and Beyond
Extbase and BeyondExtbase and Beyond
Extbase and Beyond
 
distill
distilldistill
distill
 
linieaire regressie
linieaire regressielinieaire regressie
linieaire regressie
 
Bag of tricks
Bag of tricksBag of tricks
Bag of tricks
 
Watch out: Observables are here to stay
Watch out: Observables are here to stayWatch out: Observables are here to stay
Watch out: Observables are here to stay
 
TLS305 Using DynamoDB with the AWS SDK for PHP - AWS re: Invent 2012
TLS305 Using DynamoDB with the AWS SDK for PHP - AWS re: Invent 2012TLS305 Using DynamoDB with the AWS SDK for PHP - AWS re: Invent 2012
TLS305 Using DynamoDB with the AWS SDK for PHP - AWS re: Invent 2012
 
Symfony (Unit, Functional) Testing.
Symfony (Unit, Functional) Testing.Symfony (Unit, Functional) Testing.
Symfony (Unit, Functional) Testing.
 
Mike King - Storytelling by Numbers MKTFEST 2014
Mike King - Storytelling by Numbers MKTFEST 2014Mike King - Storytelling by Numbers MKTFEST 2014
Mike King - Storytelling by Numbers MKTFEST 2014
 
Storytelling By Numbers
Storytelling By NumbersStorytelling By Numbers
Storytelling By Numbers
 
Internationalizing CakePHP Applications
Internationalizing CakePHP ApplicationsInternationalizing CakePHP Applications
Internationalizing CakePHP Applications
 
Introduction à CoffeeScript pour ParisRB
Introduction à CoffeeScript pour ParisRB Introduction à CoffeeScript pour ParisRB
Introduction à CoffeeScript pour ParisRB
 
PHPUnit でよりよくテストを書くために
PHPUnit でよりよくテストを書くためにPHPUnit でよりよくテストを書くために
PHPUnit でよりよくテストを書くために
 

Recently uploaded

Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptxMaking_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptxnull - The Open Security Community
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 

Recently uploaded (20)

Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptxMaking_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
The transition to renewables in India.pdf
The transition to renewables in India.pdfThe transition to renewables in India.pdf
The transition to renewables in India.pdf
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 

Perl Test::Spec in 5 minutes

  • 1. 5 minutes intro into Test::Spec BDD testing system for Perl
  • 2. 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/ ); }; }; };
  • 3. 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, ...
  • 4. 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
  • 5. 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
  • 6. 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
  • 7. 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
  • 8. 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
  • 9. 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
  • 10. StringCalculator on regular day supports basic calculations supports custom delimiters on holidays throws exception for any input
  • 11. 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
  • 12. 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
  • 13. 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
  • 14. 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