tdd & clean code
DESCRIPTION
TDD, ATDD & Clean CodeTRANSCRIPT
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!