• Black-box oriented tests • End to end • Web/phone/simulator • No tests doubles can be used • Needs a full and provisionable server environment • Slow tests Acceptance Tests Concepts
• JVM/PHP/Whatever • No need external env set up • Tests run in build time • Use test doubles • Slower tests than unit tests Integration Tests Concepts
Doubles • Stubs => Canned answers • Mocks => Stubs + verify • Spies => Record interaction info • Fake => I seem real but not • Dummy => I do nothing at all
Testability • Mixing object graph construction with application logic • Ask for things, don’t look for things • Doing work in constructor • Global State/Singletons • Static methods
Testability Mixing object graph construction with application logic • Factories, these are full of the "new" operators and are responsible for building the object graph of the application, but don't do anything else. • Business logic classes, which are devoid of the "new" operator and are responsible for doing work.
Testability Ask for things, don’t look for things • Just ask for all of the collaborators you need in your constructor. • But, if you find yourself needing to pass 10 collaborators to your constructor, maybe it's time to step back and think about the design
Testability Doing work in constructor • Any work you do in a constructor, you will have to successfully navigate through on every instantiation • There's no way to mock or handle work inside constructor. (actually there’s but you don’t wanna do it) • Do as little work in constructor as possible (Ideally just assigning passed parameters to the instance variables).
Testability Global State • Global State from the testing point of view is a real problem. • When tests modify global state, next run tests will be affected by this modification, this means that the order of the tests execution matters in this case. • Some tests can pass in isolation, but not when running them together. • Not sure about the current state of the global object. • Really hard to debug. • Tests cannot run in parallel.
Testability Singletons • Are global state in sheep’s clothing. • All of the internal objects of the singleton are global as well. • The core of the issue is that the global instance variables have transitive property!
Testability Static Methods • Procedural code has no seams (places where you can divert the normal execution flow) • How much a static method will hurt from a testing point of view depends on where it is in the application call graph. A leaf method such as Math.abs() is not a problem. But it could stop being a leaf in any moment when functionality needs to be changed.