Under Test

51
Under Test TDD Techniques from the Trenches May 24, 2011 Matt Thurston

description

Under Test. TDD Techniques from the Trenches May 24, 2011 Matt Thurston. Agenda. Rediscovery. Nutshell. Why get code ‘Under Test’?. Cost of Change. Change. Simple Code Change (“Hack”) versus Tough Design Change (“Right Thing”). Technical Debt. Motivator. What is Legacy Code?. - PowerPoint PPT Presentation

Transcript of Under Test

Page 1: Under Test

Under Test

TDD Techniques from the TrenchesMay 24, 2011Matt Thurston

Page 2: Under Test

Agenda

TDD

Legacy Code

TechniquesBenefits

Pitfalls

Page 3: Under Test

TDD

Legacy Code

TechniquesBenefits

Pitfalls

Page 4: Under Test

Rediscovery

Page 5: Under Test

Nutshell

Failing Test

Passing Test

Re-factor

Page 6: Under Test

Why get code ‘Under Test’?

Page 7: Under Test

Cost of Change

Page 8: Under Test

Change

Simple Code Change (“Hack”)versus

Tough Design Change (“Right Thing”)

Page 9: Under Test

Technical Debt

Page 10: Under Test

Motivator

Page 11: Under Test

TDD

Legacy Code

TechniquesBenefits

Pitfalls

Page 12: Under Test

What is Legacy Code?

• Inherited?• Old version?• Previous platform?• ‘C’?

Page 13: Under Test

Legacy Code = Code Without Tests

Page 14: Under Test

Confident Change

• Changing legacy code– What will break? – Will we find the break?

Page 15: Under Test

Under Test

• TDD Greenfields vs Legacy Code Retrofits

Page 16: Under Test

TDD

Legacy Code

TechniquesBenefits

Pitfalls

Page 17: Under Test

Defining ‘Unit Test’

• Our Unit is the C++ class• Unit Tests in C++

Page 18: Under Test

Issue #1

• TDD requires immediate feedback

Page 19: Under Test

What should CTRL + B do?

• Build and test as much as possible within a few seconds.

Page 20: Under Test

Deployment Fidelity

Development

Test Deployment

Production Deployment

Page 21: Under Test

Deployment Fidelity

• Deployment Fidelity typically dictates Test Fidelity

Page 22: Under Test

Test Fidelity

Unit Integration System

Page 23: Under Test

Test Fidelity

Unit(Seconds)

Integration(Minutes)

System(Hours)

Page 24: Under Test

Introduce New Fidelity?

• TDD requires immediate feedback• If necessary, introduce a new fidelity

Page 25: Under Test

Issue #2

• ‘Random’ test failures

Page 26: Under Test
Page 27: Under Test

Dependency Inversion

• E.g.– Foo uses files to store configuration information– Instead, inject FooConfiguration with• Virtual bool FooConfiguration::isEnabled() = 0;

Page 28: Under Test

Dependency Inversion

• Big Benefits:– Improves isolation– Simplifies reasoning about collaborations

Page 29: Under Test

Issue #3

• Difficult component

Page 30: Under Test

Difficult Components

• Lack of modularity• Lots of dependencies• Lack of coherent design• Full of bugs• Etc.

Page 31: Under Test

Integration Test First

• Works well for Difficult Components• Provides confidence when re-factoring for unit

testability

Page 32: Under Test

Issue #4

• Getting inherited legacy code under test

Page 33: Under Test

Characterization Tests

Failing Test

Capture Output

Passing Test

Page 34: Under Test

Characterization Tests

• Capture reality not expected behavior• The first test is the hardest

Page 35: Under Test

Failing a Unit Test

• If a unit test has never failed once, how do you know it works?

Page 36: Under Test

Mutation Testing

Page 37: Under Test

Mutation Testing

Passing Test

Mutate

Failing Test

Un-mutate

Page 38: Under Test

TDD

Legacy Code

TechniquesBenefits

Pitfalls

Page 39: Under Test

Semantic Memory

Input ‘A’ Output ‘B’

Page 40: Under Test

Tests are never wrong

• Tests encode semantics of the software– (even if the sematic is wrong)

Page 41: Under Test

Comment on comments

• “When the code and the comments disagree, both are probably wrong.” – Norm Schryer

Page 42: Under Test

Under Test vs. Coding Speed

Page 43: Under Test

Dreaming of Code

Page 44: Under Test

TDD

Legacy Code

TechniquesBenefits

Pitfalls

Page 45: Under Test

Continuous Testing

• Share tests• Don’t let test code rot– Integrate with build / CI tool

Page 46: Under Test

Mocks, Stubs, Fakes

• Take care with terminology overloading

Page 47: Under Test

Mocks, Stubs, Fakes

• Take care with terminology overloading• Mock: – Object used to mock collaborator behavior in a unit test

• Stub:– Satisfies linkage from a collaborator, provides no

implementation (e.g. asserts)• Fake:– Implements a collaborator’s functionality in a synthetic

fashion

Page 48: Under Test

Not Just the Tests

• Code coverage• Static analysis (e.g. Lint, -Wall)• Dynamic analysis (e.g. valgrind)

Page 49: Under Test

Quality?

• TDD / Unit Testing does not imply Quality

Page 50: Under Test

Questions? Comments?

TDD

Legacy Code

TechniquesBenefits

Pitfalls

Page 51: Under Test