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

Evolutionäres Softwaredesign mit TDD

Evolutionäres Softwaredesign mit TDD

David Tanzer

June 21, 2016
Tweet

More Decks by David Tanzer

Other Decks in Technology

Transcript

  1. I have lost count of the times where I have

    seen a developer mock out more than they need to because of excessive class coupling in their code. https://stephenhaunts.com/2013/03/07/all-your-mocks-are-evil/
  2. Sometimes the design is not clear at the start and

    evolves as you go along - this will force you to redo your test which will generate a big time lose. http://stackoverflow.com/questions/64333/disadvantages-of-test-driven-development
  3. Evil tests create a lock on how the code is

    implemented. http://www.makinggoodsoftware.com/2012/01/27/the-evil-unit-test/
  4. I think TDD is more like Othello: "A minute to

    learn. A lifetime to master." Jon Reid https://twitter.com/qcoding https://twitter.com/qcoding/status/433676850007506945 https://de.wikipedia.org/wiki/Othello_(Spiel)
  5. David Tanzer (@dtanzer) [email protected] Ich helfe meinen Kunden: • Als

    Teams effektiver zusammenzuarbeiten • Technische Praktiken zu verbessern • Qualität und Design ihrer Software zu verbessern • Kontrolle über ihren Legacy-Code zurückzugewinnen http://davidtanzer.net
  6. If you can't build a monolith, what makes you think

    microservices are the answer? Simon Brown http://www.codingthearchitecture.com/2014/07/06/distributed_big_balls_of_mud.html
  7. Tests die… • Eine bestimmte Implementierung voraussetzen • Duplikation verursachen

    • “Zufällig” rot warden • Schwer lesbar sind • Sich überschneiden • Zu viel gleichzeitig testen
  8. Designprinzipien • The Four Rules of Simple Design • S.O.L.I.D

    • Coupling / Cohesion • IoC / Dependency Injection • DDD
  9. Single Responsibility Principle “Every module or class should have responsibility

    over a single part of the functionality provided by the software, and that responsibility should be entirely encapsulated by the class.“ “A class should have only one reason to change.”
  10. Dependency Inversion Principle “High-level modules should not depend on low-level

    modules. Both should depend on abstractions. Abstractions should not depend on details. Details should depend on abstractions.“ “Your business logic should not depend on your infrastructure code.“
  11. Interface Segregation Principle “No client should be forced to depend

    on methods it does not use.“ “The consumer defines what it needs from an interface. Every consumer gets their own interface.“
  12. Test Doubles • Dummy Objekte werden weitergegeben, aber nie verwendet.

    • Fake haben eine einfachere Implementierung als das echte Objekt. • Stubs liefern vorgefertigte Rückgabewerte. • Mocks geben uns die Möglichkeit, zu überprüfen, ob sie im Test richtig verwendet wurden. http://martinfowler.com/articles/mocksArentStubs.html
  13. @Test public void returnsAddressWithValidStreetWhenUserIsValid() { User validUser = stubValidUser(…); Address

    address = addressService.addressFor(validUser); assertNotNull(address.getStreet()); }
  14. @Test public void returnsAddressWithValidStreetWhenUserIsValid() { User validUser = stubValidUser(…); Address

    address = addressService.addressFor(validUser); assumeNotNull(address); assertNotNull(address.getStreet()); }
  15. Agile Acceptance Testing • Features durch ihre Akzeptanzkriterien spezifizieren •

    Akzeptanzkriterien so schreiben, dass sie automatisch Akzteptanztests ergeben • Akzeptanztests automatisieren
  16. Danke! [email protected] Ich helfe meinen Kunden: • Als Teams effektiver

    zusammenzuarbeiten • Technische Praktiken zu verbessern • Qualität und Design ihrer Software zu verbessern • Kontrolle über ihren Legacy-Code zurückzugewinnen http://davidtanzer.net