Fix my TDD
Patterns for efficient Tests
Fix my TDD Patterns for efficient Tests TDD in a Nutshell Test - - PowerPoint PPT Presentation
Fix my TDD Patterns for efficient Tests TDD in a Nutshell Test Christian Fischer Refactoring Implementation Simple, but not easy Christian Fischer Password Validator Kata boolean validate(String password) A password it valid, when it has
Patterns for efficient Tests
Christian Fischer
Test Implementation Refactoring
Christian Fischer
Christian Fischer
boolean validate(String password) A password it valid, when it has
Christian Fischer
Valid password „aBc_de -> true Less than minimum characters „aBc_de“ -> false No upper case „ab_cde“ -> false No lower case „ABC_DE“ -> false No special character „aBcxde“ -> false
from Kent Beck
Christian Fischer
Christian Fischer
Christian Fischer
Simple Scenarios Simple Solutions Zero One Many Boundaries Behavior Interfaces Exercise Exceptions
from James Grenning
Christian Fischer
{}
nil
constant
constant
statement
unconditional --> if scalar
array
statement
if
expression
variable
simple complex from Robert C. Martin
Christian Fischer
Christian Fischer
„guitar“ -> [guitar] “red electric guitar“ -> [red, electric, guitar] „red guitar with gigbag“ -> [red,guitar,gigback] „red guitar and gigbag“ -> [red,guitar,gigback]
+ parse(String query): String[]
„red guitar with 7 gigbag“ -> [red,guitar,gigback]
Christian Fischer
„guitar“ -> [guitar] “red electric guitar“ -> [red, electric, guitar] [red,guitar,with,gigback]-> [red,guitar,gigback] [red,guitar,and,gigback] -> [red,guitar,gigback]
+ parse(query: String): String []
[red,guitar,7,gigback] -> [red,guitar,gigback]
+ filter(words: String[]): String[] + QueryParser(filter: QueryFilter)
Christian Fischer
„guitar“ -> [guitar] “red electric guitar“ -> [red, electric, guitar] [red,guitar,with,gigback]-> [red,guitar,gigback] [red,guitar,and,gigback] -> [red,guitar,gigback]
+ parse(query: String)
[red,guitar,7,gigback] -> [red,guitar,gigback]
+ filter(words: String[]): String[] + QueryParser(filter: QueryParser)
„Guitar“ -> [guitar]
“guitars“ -> [guitar]
Christian Fischer
„guitar“ -> [guitar] “red electric guitar“ -> [red, electric, guitar] [red,guitar,with,gigback]-> [red,guitar,gigback] [red,guitar,and,gigback] -> [red,guitar,gigback]
+ parse(query: String)
[red,guitar,7,gigback] -> [red,guitar,gigback]
+ filter(words: String[]): String[] + QueryParser(filter: QueryFilter, normalizer: QueryNormalizer)
„Guitar“ -> „guitar“ „guitars“ -> „guitar“
+ normalize(word: String): String
Christian Fischer
Parser Module
QueryParser QueryFilter QueryNormalizer QueryParserTest
Parser Tests
QueryFilterTest QueryNormalizerTest
public Class package private Class
Christian Fischer
Parser Module
QueryParser QueryFilter QueryNormalizer QueryParserTest
Parser Tests
QueryFilterTest QueryNormalizerTest
public Class package private Class
Christian Fischer
Refactoring: Split name into two fields.
Christian Fischer
Christian Fischer
Christian Fischer
Christian Fischer
from „Growing Object Oriented Design, guided by Tests [Steve Freeman, Nat Pryce]
Christian Fischer
Does the Endpoint has the corrrect Path & Method? Does the Deserialization works as expected? Does the Serialization works as expected?
Christian Fischer
Christian Fischer
▪ Repeatable ▪ Consistent ▪ In Memory ▪ Fast ▪ Single Concern
from Roy Osherove: The art of Unit Testing
Christian Fischer
▪ Use system dependent variables ▪ Create object with little Control (e.g. Threads, etc.) ▪ Reach out to external systems ▪ Test several components
from Roy Osherove: The art of Unit Testing
Christian Fischer
from Kent Beck
Christian Fischer
Write Adapters for Integration Code and mock these.
Christian Fischer
1 Develop your Tests against the Module API. 2 Test the Behaviour, not the Implementation. 4 Use Integration Tests for I/O-Components. 3 Don‘t mock external libraries, use Adapters. 5 Make a Test Plan.
Christian Fischer no Multi- Tasking Protection from Overengineering Complexity Partitioning no Fear
zero Debug Time Testable Design