Table of contents

page #
Introduction 28


Define a shared big-picture view of quality 10
Explore capabilities, not features 12
Start with always/never 14
Tap into your emotions 16
Test benefit as well as implementation 18
Quantify even if you cannot measure 20
Map global risks using an ACC matrix 22
Use risk checklists for cross-cutting concerns 24
Document trust boundaries26
Monitor trends in logs and consoles28
Mob your test sessions 30
Don't let the pen be the bottleneck 32
Snoop on the competition34


Focus on key examples38
Contrast examples with counter-examples42
Describe what, not how44
Avoid mathematical formulas 46
Flip equivalence classes between inputs and outputs48
Clearly separate inputs and outputs50
Ask 'what happens instead?' 52
Use Given-When-Then in a strict sequence 54
One test, one topic 56
Treat too many boundaries as a modelling problem 58
Prefer smaller tables 60
Balance three competing forces 62
Write assertions first 64
Split technical and business checks 66
Don't automate manual tests 68


Wrap synchronous database tests in transactions 72
Set up before asynchronous data tests, don't clean up after 74
Introduce business time 76
Provide atomic external resources 78
Wait for events, not time 80
Split data generators from tests 82
Minimise UI interactions 84
Separate decisions, workflows and technical interactions 86
Use production metrics for expensive tests 88


Make developers responsible for checking 92
Design tests together with other teams 94
Avoid organising tests by work items 96
Version control tests along with software 98
Create a gallery of examples for automation patterns100
Decouple coverage from purpose102
Avoid having strict coverage targets104
Measure your tests' half-life106
Optimise for reading, not writing108
Name tests for search engine optimisation110
Explain the purpose of a test in the introduction112
Split just-in-case tests from key examples114
Let the chaos monkey out periodically116

© 2014-2015 Neuri Consulting LLP