Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Tuenti <3 Testing

June 01, 2015

Tuenti <3 Testing

Story of a healthy addiction


June 01, 2015

More Decks by Tuenti

Other Decks in Programming


  1. • We <3 our customers • Confidence • Safety Net

    • Refactoring, refactoring, refactoring • It is professional, guys :)
  2. • 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
  3. • 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
  4. • JVM/PHP/Whatever • Application classes in isolation • Test doubles

    • Build time • Really fast tests Unit Tests Concepts
  5. Doubles • Stubs => Canned answers • Mocks => Stubs

    + verify • Spies => Record interaction info • Fake => I seem real but not • Dummy => I do nothing at all
  6. 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
  7. 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.
  8. 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
  9. 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).
  10. 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.
  11. 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!
  12. 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.
  13. What are we going to use? • Clean Architecture •

    Microservices • S.O.L.I.D • Dependency Injection