Tdd & clean code

Post on 18-Nov-2014

1.989 views 3 download

Tags:

description

TDD, ATDD & Clean Code

Transcript of Tdd & clean code

UNIT TESTING, TDD & ATDD

Arnon Axelrod, E4D Solutions

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

ABOUT ME

Arnon Axelrod

TDD and Agile Quality Expert

E4D Solutions

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

ABOUT YOU

Position: Dev, Test, Product, Management, other?

TDD/Unit testing experience

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

WHY LEARN TDD TODAY?

Adoption (% of martket)

time

Today

ATDD

TDD

Agile

Object-Oriented

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

Photo by: Stuart Miles

TDD?!

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

Learning TDD is like learning to ride a bicycle

Quality

Testing

Unit Tests TDD ATDD

QUALITY THROUGHOUT THE PROJECT LIFECYCLE

What is quality? Why it is important?

Quality

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

QUALITY

No bugs

Stability

TestingDesign

Happy, Loyal customers

User eXperience

Clean code

Maintainability

Customer feedback

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

THE PRODUCTIVITY MISCONCEPTION

Productivity

Features

Happy customers

MaintainabilityPressure

Legend:

Positive relationshipNegative relationship

Increased

Decreased

Productivity

Features

Happy customers

Stability

Clean code

Testing

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

THE PRODUCTIVITY MISCONCEPTION

Productivity

Features

Happy customers

MaintainabilityPressure

Legend:

Positive relationshipNegative relationship

Increased

Decreased

Stability

Clean code

Testing

Quality

Testing

Unit Tests TDD ATDD

TESTING

Testing

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

TYPES OF TESTS

Exploratory

Planned

Manual

Automated

White box Black box

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

TYPES OF TESTS

UI

View Model

Client Logic

Server Proxy

Service Layer

Business LogicDAL

ORM

DB

End-to-End

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

TYPES OF TESTS

UI

View Model

Client Logic

Server Proxy

Service Layer

Business LogicDAL

ORM

DB

Usability, UX

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

TYPES OF TESTS

UI

View Model

Client Logic

Server Proxy

Service Layer

Business LogicDAL

ORM

DB

Integration

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

TYPES OF TESTS

UI

View Model

Client Logic

Server Proxy

Service Layer

Business LogicDAL

ORM

DB

Functional

Mock

Mock

Mock

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

TYPES OF TESTS

UI

View Model

Client Logic

Server Proxy

Service Layer

DAL

ORM

DB

Unit tests

Business Logic

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

TYPES OF TESTS

Other:

Performance

Load (scalability)

Install (deployment)

Monkey testing

Quality

Testing

Unit Tests TDD ATDD

UNIT TESTS BASICS

Unit Testing

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

WHAT’S A UNIT TEST?

What’s a unit?

Smallest testable functionality

any testable functionality (BDD)

Automatic

Gray box

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

BENEFITS OF UNIT TESTS

Fast

Easy to write and maintain

Code coverage

When fail, provide insight into the problem

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

UNIT TESTS SHOULD:

Be Isolated Re-runnable

No side effects Cleanup

Environment agnostic Order doesn’t matter

Verify functionality, not implementation

Be straight-forward No conditionals, loops etc

Photo by: tongdang

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

UNIT TESTS SHOULD:

Read like a story

Verify only one thing

Have meaningful names

Be fast!

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.DOUBLES (MOCKS)

Order class+Items

+bool CheckAvailability (IInventory inventory)

+void Supply (IInventory inventory)

Inventory class

+int GetAvailablePieces (Item item)

+void Reduce(Item item, int count)

- DbConnectionProvider

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.DOUBLES (MOCKS)

Order class+Items

+bool CheckAvailability (IInventory inventory)

+void Supply (IInventory inventory)

IInventory interface

+int GetAvailablePieces (Item item)

+void Reduce(Item item, int count)

Inventory class (impl)

+int GetAvailablePieces (Item item)

+void Reduce(Item item, int count)

- DbConnectionProvider

InventoryDouble

+int GetAvailablePieces (Item item)

+void Reduce(Item item, int count)

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

DOUBLES...

Double

Fake

DummyMockStub

Detour

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

UNIT TEST STRUCTURE

Arrange

Act

Assert

Given

When

Then

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

TEST SUITE

Suite Initialize

Test Initialize

Test Method 1

Test Cleanup

Suite Cleanup

Test Method 2 Test Method 3

Quality

Testing

Unit Tests TDD ATDDTDD

TDD

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

WHAT TDD IS ALL ABOUT?

Testing?!

Design!

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.WHY IT IS IMPORTANT TO TEST FIRST?

Looking at the problem space

vs. the solution (implementation) space

Building decoupled code from base

Psychological effect

Testing the test first!

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

TESTING THE TEST FIRST!

What are the inputs? What are the outputs?

[TestMethod]public void TestFibonacciFunction(){ // arrange ... // Act: var result = Fibonacci(...); // Assert: Assert ...}

The test we want to test

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

TESTING THE TEST FIRST!

public bool TestFibonacciFunction(Func<…> fibonacci){ // arrange ... // Act: var result = fibonacci(...); // Assert: return ...}

The test we want to test

public void TestTheTest(){ var invalidImpl = … var goodImpl = Fibonacci; Assert.IsFalse(TestFibonacciFunction(invalidImpl)); Assert.IsTrue(TestFibonacciFunction(goodImpl));}

Testing the test

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

THE WAY TDD WORKS:

Write a failing test

Write the code to

make this test pass

Refactor

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

Write a test

New TestOld Test

s

Write production code

All Tests

Refactor

All Tests

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

TDD AND REFACTORING

Photo by: Chaiwat

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

TDD AND REFACTORING

public class SomeClass {    public SomeClass()    {        //...    }    public void Foo(int someParam)    {        // use someParam...    }}

Initial state

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

TDD AND REFACTORING

public class SomeClass { private int _someParam;    public SomeClass(int someParam)    {        //... _someParam = someParam;    }    public void Foo()    {        // use _someParam...    }}

Final (desired)

state

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

TDD AND REFACTORING

public class SomeClass {    public SomeClass()    {        //...    }    public void Foo(int someParam)    {        // use someParam...    }}

Initial state

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

TDD AND REFACTORING

public class SomeClass{    public SomeClass()    {        //...    }    private int _someParam;    public SomeClass(int someParam) : this()    {        _someParam = someParam;    }    public void Foo(int someParam)    {        //use someParam...    }}

Step1 – Add constructor

overload

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

TDD AND REFACTORING

public class SomeClass{    private int _someParam;    public SomeClass(int someParam)    {        //...        _someParam = someParam;    }    public void Foo(int someParam)    {        //use someParam...    }}

Step2 – Remove old constructor

overload

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

TDD AND REFACTORING

public class SomeClass{    private int _someParam;    public SomeClass(int someParam)    {        //...        _someParam = someParam;    }    public void Foo(int someParam)    {        //use someParam...    }    public void Foo()    {        //use _someParam...    }}

Step3 – Add new

overload of Foo

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

TDD AND REFACTORING

public class SomeClass{    private int _someParam;    public SomeClass(int someParam)    {        //...        _someParam = someParam;    }    public void Foo()    {        //use _someParam...    }}

Step4 (final) – Remove

old overload of Foo

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

TDD AND LEGACY CODE

TDD AND LEGACY CODE

Legacy code TDD (loosely-coupled)

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

LIMITS OF TDD

UI

Multi-threading

Integration with peripheral systems, including: Hardware (I/O) Operating System Database 3rd party applications and components

Quality

Testing

Unit Tests TDD ATDD

ATDD

ATDD

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

ATDD

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

ATDD

Stands for:

Accepance-Test Driven Development

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

ATDD

TDD is about writing the CODE RIGHT

ATDD is about writing the RIGHT CODE

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

ATDD

ATDD is about Communication

Mainly between Product, Dev and Test

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

ATDD IS AKA:

Agile Acceptance Testing Specification by Example Example Driven Development Executable Specifications ~= BDD (Behavio Driven Development)

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.PROBLEMS WITH WATERFALL SPECIFICATION

Photo by: Michal Marcol

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.PROBLEMS WITH AGILE SPECIFICATION

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

HOW ATDD WORKS?

Specification by Examples

Scenarios Acceptance tests

Quality

Testing

Unit Tests TDD ATDD

FITNESSE DEMO

ATDD

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.BENEFITS OF ATDD FOR THE BUSINESS ANALYST

Developers will actually read the specifications that you write

You will be sure that developers and testers understand the specifications correctly

You will be sure that they do not skip parts of the specification

You can track development progress easily

You can easily identify conflicts in business rules and requirements caused by later change requests

You’ll save time on acceptance and smoke testing

Source: Gojko Adzic – Bridging the Communication Gap

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.BENEFITS OF ATDD FOR THE DEVELOPER

Most functional gaps and inconsistencies in the requirements and specifications will be flushed out before the development starts

You will be sure that business analysts actually understand special cases that you want to discuss with them

You will have automated tests as targets to help you focus the development.

It will be easier to share, hand over and take over code

You’ll have a safety net for refactoring, making your code cleaner [Arnon A.]

Source: Gojko Adzic – Bridging the Communication Gap

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

BENEFITS OF ATDD FOR THE TESTER

You can influence the development process and stop developers from making the same mistakes over and over

You will have a much better understanding of the domain

You’ll delegate a lot of dull work to developers, who will collaborate with you on automating the verifications

Source: Gojko Adzic – Bridging the Communication Gap

© A

rnon A

xelro

d, E

4D

Solu

tions Ltd

.

BENEFITS OF ATDD FOR THE TESTER

You can build in quality from the start by raising concerns about possible problems before the development starts

You’ll be able to verify business rules with a touch of a button

You will be able to build better relationships with developers and business people and get their respect

You’ll spend less time doing dull work, and more time exploring “real” bugs and testing non-functional aspects (e.g. performance, usability, etc). [Arnon A.]

Source: Gojko Adzic – Bridging the Communication Gap

Quality

Testing

Unit Tests TDD ATDD

QUESTIONS?

Quality

Testing

Unit Tests TDD ATDD

THANK YOU!