software quality via unit testing
DESCRIPTION
Software quality is critical to consistently and continually delivering new features to our users. This talk covers the importance of software quality and how to deliver it via unit testing, Test Driven Development and clean code in general. This is the deck from a talk I gave at Desert Code Camp 2013.TRANSCRIPT
SOFTWARE QUALITY VIA UNIT TESTINGShaun Abram
April 20, 2013
Email: [email protected]
Twitter: @shaunabram
These slides available at shaunabram.com/dcc13
Blog: shaunabram.com
LinkedIn: linkedin.com/in/sabram
Software Quality via Unit Testing
The value of software design
Automated testing
Clean code
Goal:
Deliver value to our users
Software Quality via Unit Testing
The value of software design
Why should we care about ‘good’ design in software?
How do you respond?
Do we really need unit tests?
Refactoring doesn’t change what the code does, so why bother?
We need less focus on quality so we can add more features
Why should we care about ‘good’ design in software?
Take the moral high ground?
Why should we care about ‘good’ design in software?
We need to have economic reasons
Remember: Our goal is to deliver value to our users
What is Quality in software anyway?
Intuitive GUI
Few defects
Modular Design
What is Quality in software anyway?
Intuitive GUI
Few defects Visible to user
Modular Design Transparent to user
Fowler’s Design Stamina Hypothesis
Technical debtThe eventual consequences of poor design in a codebase
Technical debtThe eventual consequences of poor design in a codebase
Interest payments can come in the form of:
1. Bugs
2. Just understanding what the heck the current code does
3. Refactoring
4. Completing unfinished work
Technical debt
Pay down?
Accept?
But, don’t build bad on top of bad…
Design Stamina
Design
Business value to our clients
stamina to
continually and consistently deliver functionality
faster and with less bugs to our users
Clean code that works
• The value of software design • Automated testing
Unit testing
A unit test is a piece of code that executes a specific functionality (‘unit’) in the code, and • Confirms the behavior or result is as expected.• Determines if code is ‘fit for use’
Example…
16
17
•
18
19
21
22
23
24
What unit tests provide
Unit tests don’t necessarily help find bugs.
Instead, unit tests:• Drive design
What unit tests provide
Unit tests don’t necessarily help find bugs.
Instead, unit tests:• Drive design
• The tests act as the first user of the code, making you think about:• What should this code do• Border conditions (0, null, -ve, too big)
• Force you to use good design:• Short, focused methods • Dependency Injection
• Writing a class is different from using a class!
What unit tests provide
Unit tests don’t necessarily help find bugs.
Instead, unit tests:• Drive design• Act as safety buffers by finding regression bugs• Provide documentation
28
What unit tests provide
Unit tests don’t necessarily help find bugs.
Instead, unit tests:• Drive design• Act as safety buffers by finding regression bugs• Provide documentation
Can also be used on legacy codebases
Unit testing limitations
1. Can not prove the absence of bugs
2. Lot’s of code (x3-5)
3. Some things difficult to test
So should we unit test?
Not only should we unit test,
We should let unit tests drive development and design…
Test Driven Development (TDD)
Test Driven Development (TDD)
Test Driven Development (TDD)
Test Driven Development (TDD)
Test Driven Development (TDD)
Red - Green – Refactor: the TDD Mantra
No new functionality without a failing test
No refactoring without passing tests
Test Driven Development (TDD) Example
Write a simple StringCalculator class with a method
Integer add(String numbers)
A String of comma separated numbers should return their sum e.g. “1,2,10” should return 13.
A single number String should return that number e.g. “3” should return 3
An empty String should return 0
For brevity, our test will focus on valid inputs.
36
Test Driven Development (TDD) Example
Write a simple StringCalculator class with a method
Integer add(String numbers)
Code demo…
37
Refactor?
Refactor?
These tests act like the original developer looking over your shoulder and advising you, long after that developer has left…
Test Driven Development (TDD)
Red - Green – Refactor: the TDD Mantra
No new functionality without a failing test
No refactoring without passing tests
Clean code that works
• The value of software design • Automated testing
Clean code that works
• The value of software design • Automated testing • Clean code
• Feedback…
• XKCD
62
Code SmellsWhat are code smells?
“Certain structures in code suggest (sometimes they scream for) the possibility of refactoring.”
Martin Fowler. Refactoring: Improving the design of existing code
Code Smells
• Duplicated code• Long switch/if statements• Long methods
Even one line methods can be OK:if ( (account != null) && ( (account.getBalance() > 0) || (!account.overdraftLimitReached()) ) {
…
}
if (account.hasFundsAvailable()) {
…
}
Code Smells
• Duplicated code• Long switch/if statements• Long methods• Poor method names
int process(int id) { //bad!
int calculateAccountBalance(int accountID) { //better
Code Smells
• Duplicated code• Long switch/if statements• Long methods• Poor method names• In-line comments• Large classes
• Symptoms• Too many methods (>10 public?)• Too many instance variables – is every instance variable used in every
method?• Solutions
• Eliminate redundancy / duplicated code• Extract new/sub classes
Clear Code
Make the intent of your code clearCode should be clear, concise and easy to understand
How many times will the code you are about to write be read?
Studies show poor readability correlates strongly with defect density1
Avoid attrition & complete re-writes1 "Learning a Metric for Code Readability," IEEE Transactions on Software Engineering, 09 Nov. 2009. IEEE computer Society Digital Library. IEEE Computer Society
Summary• Good design gives us the stamina to continually and
consistently deliver business value
• Unit tests are an integral part of good design; TDD is even better
• Good design can also simply be cleaner code; Aggressively refactor to achieve this!
Final thought:
Every time you are in a piece of code,
just make one small improvement!
Effective Unit TestingLasse Koskela
Refactoring: Improving the Design of Existing CodeMartin Fowler, Kent Beck et. al.
Recommended Reading
Test Driven DevelopmentKent Beck
Growing Object-Oriented Software, Guided by TestsFreeman & Pryce
70
Questions?
Email: [email protected]
Twitter: @shaunabramBlog: shaunabram.com
LinkedIn: linkedin.com/in/sabram
All slides available at: shaunabram.com/dcc13