SlideShare a Scribd company logo
Unit Testing with
JUnit Boot Camp
Peter Kofler, ‘Code Cop’
@codecopkofler
www.code-cop.org
Copyright Peter Kofler, licensed under CC-BY.
Peter Kofler
• Ph.D. (Appl. Math.)
• Professional Software
Developer for 15+ years
• “fanatic about code quality”
• I help development teams
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
I help development teams with
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
●
Professionalism
●
Quality and
Productivity
●
Continuous
Improvement
Mentoring
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
●
Pair Programming
●
Programming
Workshops
●
Deliberate
Practice, e.g.
Coding Dojos
Developing Quality
Software Developers
Agenda
●
JUnit
●
Coding Exercise
●
Unit Tests
●
Lunch Break
●
Clean Unit Tests
●
Coding Exercise
●
Retrospective
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
How to take advantage
●
Slow down
●
Focus on doing it right
●
Get out of your comfort zone
●
Embrace freedom of experimenting
●
Pair with strangers you do not know
●
What you learn is your responsibility
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Introduce Yourself
●
Your Name
●
Who has heard of JUnit? (xUnit)
●
Who has never written a unit test?
●
Who has written
a few?
●
Who writes unit
tests every day?
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
JUnit
JUnit
●
http://junit.org/
●
a (unit) testing framework
●
tests are executed within a framework
●
no output from your tests
●
check expectations programmatically
●
test runner reports failure on each test
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Project – Class - Method
●
Maven
●
src/test/java
●
Test Class
public class SomeTestClass
{
@Test
public void someTestMethod()
{
...
}
}
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
JUnit Assertions
import static org.junit.Assert.*;
assertEquals("SNEK", actual);
assertTrue(isSaved);
assertNotNull(customer);
assertArrayEquals(
new String[] {"Berg", "Wien"},
citiesArray);
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Hamcrest Assertions
import static org.junit.Assert.assertThat;
import static org.hamcrest.core.IsCollectionContaining.hasItem;
import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.hamcrest.core.StringContains.containsString;
import static org.hamcrest.core.StringEndsWith.endsWith;
assertThat(actual,instanceOf(Customer.class));
assertThat(message,
containsString("abgelaufen"));
assertThat(message, endsWith("des Jahres."));
assertThat(citiesCollection, hasItem("Wien"));
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Try it yourself
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Setup
●
Find a pair.
●
Get the code
(https://bitbucket.org/pkofler/junit-koans)
●
Run JUnit - should see no tests
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Pair Programming
●
Collaborative = Pair Programming
●
do not talk for
too long
●
do not interrupt
the other
●
no “keyboard
hugging“
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Pair Programming
adds discussion &
a second opinion
to the practice.
Assignment
●
Go through the test code
●
Assertions are commented/ incomplete
●
uncomment the assertions
●
and complete them making tests pass
●
Explore features of JUnit
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
→Practice
JUnit Boot Camp (GeeCON 2016)
Keep the bar green to
keep the code clean
Unit Tests
Why write tests?
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
“I write unit tests for one
reason: so my coworkers
don't f*** up my code.”
(David Angry)
Unit Test (Micro Test)
●
code written by a developer
●
tests an individual unit
●
isolate each part
●
shows that the individual part is correct
●
sort of living documentation
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Unit of Work
●
single logical functional use case
●
invoked by some public interface
●
a single method,
●
a whole class or
●
multiple classes
●
with one single logical purpose
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Focus on Behaviour

e.g. requirements are behaviour

names from (problem) domain

full sentences
(long, descriptive test method names)

expected behaviour should

separation per business module
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Consist of 3 Simple Steps
●
Prepare Input – Arrange
●
Call Method – Act
●
Check Output – Assert
●
Use in form of Given-When-Then
●
No conditional logic ( more test cases)→
●
No loops ( parametrized test)→
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Only one aspect/feature
●
tests work best with lots of small tests
●
tests only fail because of one reason
●
more than 1 assert in test
split into multiple tests→
●
1 test case – 1 method – 1 assertion
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
testHighAndLowInput()
testHighInput()
testLowInput()
Attributes of a
Good Unit Test?
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
F.I.R.S.T
●
Fast
●
Isolated (data, sequence)
●
Repeatable
●
Self-verifying
●
Timely
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Clean, Readable
and Expressive?
http://theprofoundprogrammer.com/post/26561881517/text-single-letter-variables-who-the-fuck-do
Clean?
●
Free from dirt or marks:
e.g. a clean kitchen floor.
●
Without imperfections or errors:
e.g. a clean edge.
●
What if all your tests would be nicely
structured and consistent?
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Readable?
●
Easily read; legible:
e.g. a readable typeface.
●
Enjoyable or interesting to read:
e.g. a readable story.
●
What if a test suite would be a readable
document at the same time?
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Expressive?
●
Full of expression; meaningful:
e.g. an expressive shrug.
●
Effectively conveying thought:
e.g. an expressive glance.
●
What if tests revealed their intend?
Would express what should happen?
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Clean Tests
●
Are of same quality as production code.
●
Are clean code, structured, consistent.
●
Are a readable document.
●
Reveal their intend and express what
should happen.
●
Give informative error message on
failure.
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Welcome to the Gilded Rose
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
The existing inventory system
●
We have items to sell. Items degrade in
quality the older they get.
●
All items have a SellIn value which
denotes the number of days we have to
sell the item.
●
All items have a Quality value which
denotes how valuable the item is.
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Requirements
●
At the end of each day our system lowers
both values for every item.
●
Once the sell by date has passed, Quality
degrades twice as fast.
●
The Quality of an item is never negative.
●
The Quality is never more than 50.
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Special Item: Brie
●
Aged Brie actually increases in Quality
the older it gets.
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Backstage Passes
●
A backstage pass
increases in Quality
as it's SellIn value
approaches (by a
complex formula)
●
but Quality drops to
0 after the concert.
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Special Item
●
Sulfuras, a legendary item, never has to
be sold or decreases in Quality.
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Setup
● Find a pair.
● Get the code.
(https://github.com/emilybache/GildedRose-Refactoring-Kata)
● Run tests, should see single failing test.
● Read GildedRoseRequirements.txt
● Run TextTestFixture to see what it does.
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Assignment
●
Create “perfect” unit tests
●
derive test cases from requirements
●
cover all cases e.g. boundary conditions
●
readable, concise, free of duplication
●
Experiment with different styles.
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Create a test suite
that is a readable
document at the
same time!
Don't Focus on
Getting it Done.
F0cus on Doing
It Perfectly.
→Practice
JUnit Boot Camp (GeeCON 2016)
Closing Circle
●
What did you learn today?
●
What surprised you today?
●
What will you do
differently in the
future?
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
Peter Kofler
@codecopkofler
www.code-cop.org
Kata by
Emily Bache
@emilybache
http://coding-is-like-cooking.info/2013/03/writing-good-tests-for-the-gilded-rose-kata/
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
CC Images
● Bruce http://www.flickr.com/photos/sherpas428/4350620602/
● pairing http://www.flickr.com/photos/dav/94735395/
● agenda http://www.flickr.com/photos/24293932@N00/2752221871/
● wants you http://www.flickr.com/photos/shutter/105497713/
● hands https://www.flickr.com/photos/ninahiironniemi/497993647/
● green http://www.flickr.com/photos/43442082@N00/296362882/
● inn http://www.flickr.com/photos/danielleblue/170496395/
● Brie http://www.flickr.com/photos/chez_loulou/2767503201
● pass http://www.flickr.com/photos/frf_kmeron/5556518514
● Sulfuras https://www.flickr.com/photos/sharelabs/11195626116
PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY

More Related Content

PDF
Coding Dojo: Data Munging (2016)
PDF
Designing Test Cases for the Gilded Rose Kata v3 (2016)
PDF
Deliberate Practice (Agile Slovenia 2015)
PDF
Clean Readable Specifications (ETC 2016)
PDF
Mob Programming (2016)
PDF
Refactoring the Tennis Kata v2 (2016)
PDF
Coding Dojo: Asynchronous Clock-In (2016)
PDF
Code Retreat Venice (2016)
Coding Dojo: Data Munging (2016)
Designing Test Cases for the Gilded Rose Kata v3 (2016)
Deliberate Practice (Agile Slovenia 2015)
Clean Readable Specifications (ETC 2016)
Mob Programming (2016)
Refactoring the Tennis Kata v2 (2016)
Coding Dojo: Asynchronous Clock-In (2016)
Code Retreat Venice (2016)

What's hot (20)

PDF
Coding Dojo: Functional Calisthenics (2016)
PDF
Brutal Coding Constraints (ITAKE 2017)
PDF
The Brutal Refactoring Game (2013)
PDF
Code Retreat Graz, Austria 2013
PDF
Extract Method Refactoring Workshop (2016)
PDF
Designing Test Cases for the Gilded Rose Kata (2013)
PDF
TDD as if You Meant It (2013)
PDF
Coding Dojo Object Calisthenics (2016)
PDF
Coding Dojo: Baby Steps Push Challenge (2021)
PDF
Coding Dojo: Bank OCR Outside-In (2015)
PDF
Deliberate Practice, New Learning Styles (2015)
PDF
Software Craftsmanship Journeyman Tour (2013)
PDF
Coding Dojo: Mars Rover (2014)
PDF
Using Automated Code Reviews to Achieve Continuous Quality (ASQF Agile Night ...
PDF
Coding Dojo: Naming with Dices (2021)
PDF
Idiomatic R for Rosetta Code (2013)
PDF
Outside-in Test Driven Development - the London School of TDD
PDF
Coding Dojo: Adding Tests to Legacy Code (2014)
PDF
Refactoring the Tennis Kata (2013)
PDF
Designing Test Cases for the Gilded Rose Kata v2 (2015)
Coding Dojo: Functional Calisthenics (2016)
Brutal Coding Constraints (ITAKE 2017)
The Brutal Refactoring Game (2013)
Code Retreat Graz, Austria 2013
Extract Method Refactoring Workshop (2016)
Designing Test Cases for the Gilded Rose Kata (2013)
TDD as if You Meant It (2013)
Coding Dojo Object Calisthenics (2016)
Coding Dojo: Baby Steps Push Challenge (2021)
Coding Dojo: Bank OCR Outside-In (2015)
Deliberate Practice, New Learning Styles (2015)
Software Craftsmanship Journeyman Tour (2013)
Coding Dojo: Mars Rover (2014)
Using Automated Code Reviews to Achieve Continuous Quality (ASQF Agile Night ...
Coding Dojo: Naming with Dices (2021)
Idiomatic R for Rosetta Code (2013)
Outside-in Test Driven Development - the London School of TDD
Coding Dojo: Adding Tests to Legacy Code (2014)
Refactoring the Tennis Kata (2013)
Designing Test Cases for the Gilded Rose Kata v2 (2015)
Ad

Similar to JUnit Boot Camp (GeeCON 2016) (17)

PDF
Pragmatic Introduction to Python Unit Testing (PyDays 2018)
PDF
Prime Factors Code Kata - Practicing TDD (2014)
PDF
Pair Programming (2015)
PDF
Coding Dojo: Baby Steps (2014)
PDF
Code Quality Assurance v4 (2013)
PDF
Coding Dojo for Testers/Testing Dojo: Designing Test Cases with FitNesse (2014)
PDF
Pragmatic Introduction to PHP Unit Testing (2015)
PDF
Coding Dojo: Roman Numerals (2014)
PDF
Deliberate Practice (2014)
PDF
Coding Dojo: Fun with Tic-Tac-Toe (2014)
PDF
Coding Dojo: String Calculator (2013)
PDF
Pair Programming (2014)
PDF
Coding Dojo: Bank OCR (2014)
PPTX
Software testing and quality assurance
PDF
Can PL/SQL be Clean? (2013)
PPTX
Test Driven Development on Android (Kotlin Kenya)
PDF
Practical (J)Unit Testing (2009)
Pragmatic Introduction to Python Unit Testing (PyDays 2018)
Prime Factors Code Kata - Practicing TDD (2014)
Pair Programming (2015)
Coding Dojo: Baby Steps (2014)
Code Quality Assurance v4 (2013)
Coding Dojo for Testers/Testing Dojo: Designing Test Cases with FitNesse (2014)
Pragmatic Introduction to PHP Unit Testing (2015)
Coding Dojo: Roman Numerals (2014)
Deliberate Practice (2014)
Coding Dojo: Fun with Tic-Tac-Toe (2014)
Coding Dojo: String Calculator (2013)
Pair Programming (2014)
Coding Dojo: Bank OCR (2014)
Software testing and quality assurance
Can PL/SQL be Clean? (2013)
Test Driven Development on Android (Kotlin Kenya)
Practical (J)Unit Testing (2009)
Ad

Recently uploaded (20)

PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Electronic commerce courselecture one. Pdf
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Machine learning based COVID-19 study performance prediction
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
KodekX | Application Modernization Development
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PDF
Network Security Unit 5.pdf for BCA BBA.
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPTX
Cloud computing and distributed systems.
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPT
Teaching material agriculture food technology
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
Encapsulation_ Review paper, used for researhc scholars
Reach Out and Touch Someone: Haptics and Empathic Computing
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Electronic commerce courselecture one. Pdf
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Machine learning based COVID-19 study performance prediction
Understanding_Digital_Forensics_Presentation.pptx
KodekX | Application Modernization Development
Unlocking AI with Model Context Protocol (MCP)
MIND Revenue Release Quarter 2 2025 Press Release
Network Security Unit 5.pdf for BCA BBA.
Digital-Transformation-Roadmap-for-Companies.pptx
Cloud computing and distributed systems.
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Diabetes mellitus diagnosis method based random forest with bat algorithm
Teaching material agriculture food technology
“AI and Expert System Decision Support & Business Intelligence Systems”

JUnit Boot Camp (GeeCON 2016)

  • 1. Unit Testing with JUnit Boot Camp Peter Kofler, ‘Code Cop’ @codecopkofler www.code-cop.org Copyright Peter Kofler, licensed under CC-BY.
  • 2. Peter Kofler • Ph.D. (Appl. Math.) • Professional Software Developer for 15+ years • “fanatic about code quality” • I help development teams PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 3. I help development teams with PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY ● Professionalism ● Quality and Productivity ● Continuous Improvement
  • 4. Mentoring PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY ● Pair Programming ● Programming Workshops ● Deliberate Practice, e.g. Coding Dojos
  • 6. Agenda ● JUnit ● Coding Exercise ● Unit Tests ● Lunch Break ● Clean Unit Tests ● Coding Exercise ● Retrospective PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 7. How to take advantage ● Slow down ● Focus on doing it right ● Get out of your comfort zone ● Embrace freedom of experimenting ● Pair with strangers you do not know ● What you learn is your responsibility PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 8. Introduce Yourself ● Your Name ● Who has heard of JUnit? (xUnit) ● Who has never written a unit test? ● Who has written a few? ● Who writes unit tests every day? PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 10. JUnit ● http://junit.org/ ● a (unit) testing framework ● tests are executed within a framework ● no output from your tests ● check expectations programmatically ● test runner reports failure on each test PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 11. Project – Class - Method ● Maven ● src/test/java ● Test Class public class SomeTestClass { @Test public void someTestMethod() { ... } } PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 12. JUnit Assertions import static org.junit.Assert.*; assertEquals("SNEK", actual); assertTrue(isSaved); assertNotNull(customer); assertArrayEquals( new String[] {"Berg", "Wien"}, citiesArray); PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 13. Hamcrest Assertions import static org.junit.Assert.assertThat; import static org.hamcrest.core.IsCollectionContaining.hasItem; import static org.hamcrest.core.IsInstanceOf.instanceOf; import static org.hamcrest.core.StringContains.containsString; import static org.hamcrest.core.StringEndsWith.endsWith; assertThat(actual,instanceOf(Customer.class)); assertThat(message, containsString("abgelaufen")); assertThat(message, endsWith("des Jahres.")); assertThat(citiesCollection, hasItem("Wien")); PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 14. Try it yourself PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 15. Setup ● Find a pair. ● Get the code (https://bitbucket.org/pkofler/junit-koans) ● Run JUnit - should see no tests PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 16. Pair Programming ● Collaborative = Pair Programming ● do not talk for too long ● do not interrupt the other ● no “keyboard hugging“ PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 17. Pair Programming adds discussion & a second opinion to the practice.
  • 18. Assignment ● Go through the test code ● Assertions are commented/ incomplete ● uncomment the assertions ● and complete them making tests pass ● Explore features of JUnit PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 21. Keep the bar green to keep the code clean
  • 23. Why write tests? PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 24. “I write unit tests for one reason: so my coworkers don't f*** up my code.” (David Angry)
  • 25. Unit Test (Micro Test) ● code written by a developer ● tests an individual unit ● isolate each part ● shows that the individual part is correct ● sort of living documentation PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 26. Unit of Work ● single logical functional use case ● invoked by some public interface ● a single method, ● a whole class or ● multiple classes ● with one single logical purpose PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 27. Focus on Behaviour  e.g. requirements are behaviour  names from (problem) domain  full sentences (long, descriptive test method names)  expected behaviour should  separation per business module PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 28. Consist of 3 Simple Steps ● Prepare Input – Arrange ● Call Method – Act ● Check Output – Assert ● Use in form of Given-When-Then ● No conditional logic ( more test cases)→ ● No loops ( parametrized test)→ PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 29. Only one aspect/feature ● tests work best with lots of small tests ● tests only fail because of one reason ● more than 1 assert in test split into multiple tests→ ● 1 test case – 1 method – 1 assertion PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY testHighAndLowInput() testHighInput() testLowInput()
  • 30. Attributes of a Good Unit Test? PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 34. Clean? ● Free from dirt or marks: e.g. a clean kitchen floor. ● Without imperfections or errors: e.g. a clean edge. ● What if all your tests would be nicely structured and consistent? PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 35. Readable? ● Easily read; legible: e.g. a readable typeface. ● Enjoyable or interesting to read: e.g. a readable story. ● What if a test suite would be a readable document at the same time? PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 36. Expressive? ● Full of expression; meaningful: e.g. an expressive shrug. ● Effectively conveying thought: e.g. an expressive glance. ● What if tests revealed their intend? Would express what should happen? PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 37. Clean Tests ● Are of same quality as production code. ● Are clean code, structured, consistent. ● Are a readable document. ● Reveal their intend and express what should happen. ● Give informative error message on failure. PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 38. Welcome to the Gilded Rose PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 39. The existing inventory system ● We have items to sell. Items degrade in quality the older they get. ● All items have a SellIn value which denotes the number of days we have to sell the item. ● All items have a Quality value which denotes how valuable the item is. PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 40. Requirements ● At the end of each day our system lowers both values for every item. ● Once the sell by date has passed, Quality degrades twice as fast. ● The Quality of an item is never negative. ● The Quality is never more than 50. PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 41. Special Item: Brie ● Aged Brie actually increases in Quality the older it gets. PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 42. Backstage Passes ● A backstage pass increases in Quality as it's SellIn value approaches (by a complex formula) ● but Quality drops to 0 after the concert. PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 43. Special Item ● Sulfuras, a legendary item, never has to be sold or decreases in Quality. PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 44. Setup ● Find a pair. ● Get the code. (https://github.com/emilybache/GildedRose-Refactoring-Kata) ● Run tests, should see single failing test. ● Read GildedRoseRequirements.txt ● Run TextTestFixture to see what it does. PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 45. Assignment ● Create “perfect” unit tests ● derive test cases from requirements ● cover all cases e.g. boundary conditions ● readable, concise, free of duplication ● Experiment with different styles. PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 46. Create a test suite that is a readable document at the same time!
  • 47. Don't Focus on Getting it Done. F0cus on Doing It Perfectly.
  • 50. Closing Circle ● What did you learn today? ● What surprised you today? ● What will you do differently in the future? PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 51. Peter Kofler @codecopkofler www.code-cop.org Kata by Emily Bache @emilybache http://coding-is-like-cooking.info/2013/03/writing-good-tests-for-the-gilded-rose-kata/ PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY
  • 52. CC Images ● Bruce http://www.flickr.com/photos/sherpas428/4350620602/ ● pairing http://www.flickr.com/photos/dav/94735395/ ● agenda http://www.flickr.com/photos/24293932@N00/2752221871/ ● wants you http://www.flickr.com/photos/shutter/105497713/ ● hands https://www.flickr.com/photos/ninahiironniemi/497993647/ ● green http://www.flickr.com/photos/43442082@N00/296362882/ ● inn http://www.flickr.com/photos/danielleblue/170496395/ ● Brie http://www.flickr.com/photos/chez_loulou/2767503201 ● pass http://www.flickr.com/photos/frf_kmeron/5556518514 ● Sulfuras https://www.flickr.com/photos/sharelabs/11195626116 PETER KOFLER, CODE-COP.ORG FANATIC ABOUT CODE QUALITY