Download - Under Test

Transcript
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

Top Related