Software Quality via Unit Testing

Preview:

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.

Citation preview

SOFTWARE QUALITY VIA UNIT TESTINGShaun Abram

April 20, 2013

Email: Shaun@Abram.com

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: Shaun@Abram.com

Twitter: @shaunabramBlog: shaunabram.com

LinkedIn: linkedin.com/in/sabram

All slides available at: shaunabram.com/dcc13

Recommended