Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
David Völkel, @davidvoelkel 
Clean Test Code 
Clean Code Days 12.11.2014
2 
@davidvoelkel 
Entwickler & Consultant 
Software Craftsman 
Test-Driven Development 
Softwaredesign 
@softwerkskammer
Agil 
Automatisierte Tests 
=> häufige Releases + Qualität
Dirty Test Code 
technische Schulden 
Velocity sinkt 
Kosten 
Latenz 
agil
Clean Tests 
4 Eigenschaften verlässlich lesbar redundanzfrei fokussiert Fazit Fragen & Diskussion
xUnit- Patterns 
BDD 
Funktionale Tests 
setup 
arrange 
given 
Eingabe 
execute 
act 
when 
“Fixture“ 
verify 
assert 
th...
4 Rules of Simple Design 
1.Pass all Tests 
2.Clear, Expressive & Consistent 
3.No Duplication 
4.Minimal Units
Verlässlich 
Gefahr Komplexität, vermeide 
•boolsche Assertions 
assertTrue(age >= 18);
Verlässlich 
Gefahr Komplexität, vermeide 
•boolsche Assertions 
assertTrue(age >= 18); 
assertThat(age, greaterThan(17))
Verlässlich 
Gefahr Komplexität vermeide 
•boolsche Assertions 
•Conditionals, komplexe Asserts & Schleifen 
boolean conta...
Verlässlich 
Gefahr Komplexität vermeide 
•boolsche Assertions 
•Conditionals, komplexe Asserts & Schleifen 
boolean conta...
Lesbar 
„Write the tests you want to read“ 
80% lesen, 20% schreiben 
Executable Specifications 
Living Documentation
Abstraktion 
Weglassen von Details
Testmethode 
Gerard Meszaros: 
„When it is not important for something to be seen in the test method, it is important that...
„Im Bestellformular soll der Benutzer mit dem Abbrechen-Button den Bestellprozess beenden können”
@Test public void prozessAbbruch_inBestellFormular() { 
server.laufendeProzesse(0); 
ProzessStatus prozess = server.starte...
@Test public void prozessAbbruch_inBestellFormular() { 
server.laufendeProzesse(0); 
ProzessStatus prozess = server.starte...
@Test public void prozessAbbruch_inBestellFormular() { 
server.laufendeProzesse(0); 
ProzessStatus prozess = server.starte...
@Test public void prozessAbbruch_inBestellFormular() { 
imFormular(BESTELL_FORMULAR); 
sendeFormularMitButton(ABBRUCH); 
p...
Namen
Name Testklasse 
public class AnOrderProcess { 
OrderProcess process; 
@Before public void createOrderProcess() { 
process...
public class AnOrderProcess { 
OrderProcess process; 
@Before public void createOrderProcess() { 
process = new OrderProce...
public class AnOrderProcess { 
OrderProcess process; 
@Before public void createOrderProcess() { 
process = new OrderProce...
@Before public void createOrderProcess() { 
process = new OrderProcess(); 
} 
@Test public void inOrderForm_cancel() { 
pr...
@Before public void createOrderProcess() { 
process = new OrderProcess(); 
} 
@Test public void inOrderForm_cancel() { 
pr...
Publikum 
Test-Wartung 
Fehlersuche 
Spezifikation
Kommuniziere 
vollständig 
OuT + setup + execute + verify 
Verteilung: Klasse, Methoden-Name, Assertion
Redundanzfrei
@Rule 
public class BestellProzessTest { 
@Rule 
public ProzessTestServer server; 
} 
public class ProzessTestServer exten...
Hierarchische Tests 
public class AnOrderProcess { 
@Before public void createOrderProcess() { 
process = new OrderProcess...
OuT 
Hierarchische Tests 
setup 
execute 
verify
Hilfsmethoden 
Object Mother 
Test Data Builder 
aCustomer("David"); 
CustomerTest.aCustomer("David"); 
CustomerMother....
void assertMoneyEquals(Money expected, Money actual) { 
assertEquals("currency", expected.getCurrency(),actual.getCurrency...
"Single Concept per Test" 
"One Execute per Test" 
"One Assert per Test" 
Fokussiert
Parameterized „State of Java“ 
@Test public void beitragsfreiheit() { 
freigabeZustandIst(2, BEITRAGS_FREI); 
freigabeZust...
Status vs. Testbarkeit 
Fokussiert
„Listen to your tests!“ 
Hard to test code
Clean Tests 
wartbar 
lesbar 
flexibel 
verlässlich
Clean Tests 
wartbar 
lesbar 
flexibel 
verlässlich 
1. 
1.
Clean Tests 
wartbar 
Namen & 
Abstraktion 
lesbar 
flexibel 
verlässlich 
2.
Clean Tests 
wartbar 
redundanzfrei 
lesbar 
flexibel 
verlässlich 
3. 
Namen & 
Abstraktion
Clean Tests 
wartbar 
fokussiert 
redundanzfrei 
lesbar 
flexibel 
verlässlich 
4. 
Namen & 
Abstraktion
Fazit 
Agil bleiben mit Clean Test Code
Quellen 
Bücher 
„Clean Code“, Robert C. Martin 
„xUnit Test Patterns“, Gerard Meszaros 
„Effective Unittesting“, Lasse...
David Völkel 
codecentric AG 
Twitter: @davidvoelkel 
david.voelkel@codecentric.de 
www.codecentric.de 
blog.codecentric.d...
Attribution-ShareAlike 3.0 Germany 
http://creativecommons.org/licenses/by-sa/3.0/de/ 
Die verwendeten Bilder sind geme...
Nächste SlideShare
Wird geladen in …5
×

von

Clean Test Code (Clean Code Days) Slide 1 Clean Test Code (Clean Code Days) Slide 2 Clean Test Code (Clean Code Days) Slide 3 Clean Test Code (Clean Code Days) Slide 4 Clean Test Code (Clean Code Days) Slide 5 Clean Test Code (Clean Code Days) Slide 6 Clean Test Code (Clean Code Days) Slide 7 Clean Test Code (Clean Code Days) Slide 8 Clean Test Code (Clean Code Days) Slide 9 Clean Test Code (Clean Code Days) Slide 10 Clean Test Code (Clean Code Days) Slide 11 Clean Test Code (Clean Code Days) Slide 12 Clean Test Code (Clean Code Days) Slide 13 Clean Test Code (Clean Code Days) Slide 14 Clean Test Code (Clean Code Days) Slide 15 Clean Test Code (Clean Code Days) Slide 16 Clean Test Code (Clean Code Days) Slide 17 Clean Test Code (Clean Code Days) Slide 18 Clean Test Code (Clean Code Days) Slide 19 Clean Test Code (Clean Code Days) Slide 20 Clean Test Code (Clean Code Days) Slide 21 Clean Test Code (Clean Code Days) Slide 22 Clean Test Code (Clean Code Days) Slide 23 Clean Test Code (Clean Code Days) Slide 24 Clean Test Code (Clean Code Days) Slide 25 Clean Test Code (Clean Code Days) Slide 26 Clean Test Code (Clean Code Days) Slide 27 Clean Test Code (Clean Code Days) Slide 28 Clean Test Code (Clean Code Days) Slide 29 Clean Test Code (Clean Code Days) Slide 30 Clean Test Code (Clean Code Days) Slide 31 Clean Test Code (Clean Code Days) Slide 32 Clean Test Code (Clean Code Days) Slide 33 Clean Test Code (Clean Code Days) Slide 34 Clean Test Code (Clean Code Days) Slide 35 Clean Test Code (Clean Code Days) Slide 36 Clean Test Code (Clean Code Days) Slide 37 Clean Test Code (Clean Code Days) Slide 38 Clean Test Code (Clean Code Days) Slide 39 Clean Test Code (Clean Code Days) Slide 40 Clean Test Code (Clean Code Days) Slide 41 Clean Test Code (Clean Code Days) Slide 42 Clean Test Code (Clean Code Days) Slide 43 Clean Test Code (Clean Code Days) Slide 44 Clean Test Code (Clean Code Days) Slide 45 Clean Test Code (Clean Code Days) Slide 46
Nächste SlideShare
Mockist vs. Classicists TDD
Weiter
Herunterladen, um offline zu lesen und im Vollbildmodus anzuzeigen.

1 Gefällt mir

Teilen

Herunterladen, um offline zu lesen

Clean Test Code (Clean Code Days)

Herunterladen, um offline zu lesen

Die Folien zu meinem Vortrag "Clean Test Code" auf den Clean Code Days 2014 in München: http://www.cleancode-days.de/vortraege/articles/clean-test-code.html

Ähnliche Bücher

Kostenlos mit einer 30-tägigen Testversion von Scribd

Alle anzeigen

Ähnliche Hörbücher

Kostenlos mit einer 30-tägigen Testversion von Scribd

Alle anzeigen

Clean Test Code (Clean Code Days)

  1. 1. David Völkel, @davidvoelkel Clean Test Code Clean Code Days 12.11.2014
  2. 2. 2 @davidvoelkel Entwickler & Consultant Software Craftsman Test-Driven Development Softwaredesign @softwerkskammer
  3. 3. Agil Automatisierte Tests => häufige Releases + Qualität
  4. 4. Dirty Test Code technische Schulden Velocity sinkt Kosten Latenz agil
  5. 5. Clean Tests 4 Eigenschaften verlässlich lesbar redundanzfrei fokussiert Fazit Fragen & Diskussion
  6. 6. xUnit- Patterns BDD Funktionale Tests setup arrange given Eingabe execute act when “Fixture“ verify assert then Ausgabe [teardown] [annihilate] Testphasen Input Output
  7. 7. 4 Rules of Simple Design 1.Pass all Tests 2.Clear, Expressive & Consistent 3.No Duplication 4.Minimal Units
  8. 8. Verlässlich Gefahr Komplexität, vermeide •boolsche Assertions assertTrue(age >= 18);
  9. 9. Verlässlich Gefahr Komplexität, vermeide •boolsche Assertions assertTrue(age >= 18); assertThat(age, greaterThan(17))
  10. 10. Verlässlich Gefahr Komplexität vermeide •boolsche Assertions •Conditionals, komplexe Asserts & Schleifen boolean containsName = false; for (String name: names) { if (name.equals("David")) { containsName = true; } } assertTrue(containsName);
  11. 11. Verlässlich Gefahr Komplexität vermeide •boolsche Assertions •Conditionals, komplexe Asserts & Schleifen boolean containsName = false; for (String name: names) { if (name.equals("David")) { containsName = true; } } assertTrue(containsName); assertThat(names, hasItem("David"));
  12. 12. Lesbar „Write the tests you want to read“ 80% lesen, 20% schreiben Executable Specifications Living Documentation
  13. 13. Abstraktion Weglassen von Details
  14. 14. Testmethode Gerard Meszaros: „When it is not important for something to be seen in the test method, it is important that it not be seen in the test method! “
  15. 15. „Im Bestellformular soll der Benutzer mit dem Abbrechen-Button den Bestellprozess beenden können”
  16. 16. @Test public void prozessAbbruch_inBestellFormular() { server.laufendeProzesse(0); ProzessStatus prozess = server.starteProzess(Prozess.BESTELLUNG); prozessInstanzId = prozess.getInstanzId(); server.laufendeProzesse(1); server.erwarteBenutzerFormular(prozessInstanzId, BESTELL_FORMULAR); Formular formular = new Formular(); formular.setBestellDatum("01.01.2015"); formular.setStandardVersand(false); String taskId = server.taskIdZu(prozessInstanzId); controller.submitEingabe(formular, Mockito.mock(BindingResult.class), null, taskId, null, ABBRUCH); server.laufendeProzesse(0); } „Im Bestellformular soll der Benutzer mit dem Abbrechen-Button den Bestellprozess beenden können”
  17. 17. @Test public void prozessAbbruch_inBestellFormular() { server.laufendeProzesse(0); ProzessStatus prozess = server.starteProzess(Prozess.BESTELLUNG); prozessInstanzId = prozess.getInstanzId(); server.laufendeProzesse(1); server.erwarteBenutzerFormular(prozessInstanzId, BESTELL_FORMULAR); Formular formular = new Formular(); formular.setBestellDatum("01.01.2015"); formular.setStandardVersand(false); String taskId = server.taskIdZu(prozessInstanzId); controller.submitEingabe(formular, Mockito.mock(BindingResult.class), null, taskId, null, ABBRUCH); server.laufendeProzesse(0); } „Im Bestellformular soll der Benutzer mit dem Abbrechen-Button den Bestellprozess beenden können” “Testskript” “Incidental Details”
  18. 18. @Test public void prozessAbbruch_inBestellFormular() { server.laufendeProzesse(0); ProzessStatus prozess = server.starteProzess(Prozess.BESTELLUNG); prozessInstanzId = prozess.getInstanzId(); server.laufendeProzesse(1); server.erwarteBenutzerFormular(prozessInstanzId, BESTELL_FORMULAR); Formular formular = new Formular(); formular.setBestellDatum("01.01.2015"); formular.setStandardVersand(false); String taskId = server.taskIdZu(prozessInstanzId); controller.submitEingabe(formular, Mockito.mock(BindingResult.class), null, taskId, null, server.laufendeProzesse(0); } ABBRUCH); Signal-Noise-Ratio? Single Level of Abstraction? „Im Bestellformular soll der Benutzer mit dem Abbrechen-Button den Bestellprozess beenden können”
  19. 19. @Test public void prozessAbbruch_inBestellFormular() { imFormular(BESTELL_FORMULAR); sendeFormularMitButton(ABBRUCH); prozessGestoppt(); } „Im Bestellformular soll der Benutzer mit dem Abbrechen-Button den Bestellprozess beenden können”
  20. 20. Namen
  21. 21. Name Testklasse public class AnOrderProcess { OrderProcess process; @Before public void createOrderProcess() { process = new OrderProcess(); } object under test
  22. 22. public class AnOrderProcess { OrderProcess process; @Before public void createOrderProcess() { process = new OrderProcess(); } @Test public void inOrderForm_cancel() { process.setState(ORDER_FORM); process.submit(CANCEL_BUTTON); assertThat("process canceled", process.isCanceled(), equalTo(true)); } Name Testmethode object under test
  23. 23. public class AnOrderProcess { OrderProcess process; @Before public void createOrderProcess() { process = new OrderProcess(); } @Test public void inOrderForm_cancel() { process.setState(ORDER_FORM); process.submit(CANCEL_BUTTON); assertThat("process canceled", process.isCanceled(), equalTo(true)); } Namen object under test setup
  24. 24. @Before public void createOrderProcess() { process = new OrderProcess(); } @Test public void inOrderForm_cancel() { process.setState(ORDER_FORM); process.submit(CANCEL_BUTTON); assertThat("process canceled", process.isCanceled(), equalTo(true)); } Namen setup execute
  25. 25. @Before public void createOrderProcess() { process = new OrderProcess(); } @Test public void inOrderForm_cancel() { process.setState(ORDER_FORM); process.submit(CANCEL_BUTTON); assertThat("process canceled", process.isCanceled(), equalTo(true)); } Namen setup execute verify
  26. 26. Publikum Test-Wartung Fehlersuche Spezifikation
  27. 27. Kommuniziere vollständig OuT + setup + execute + verify Verteilung: Klasse, Methoden-Name, Assertion
  28. 28. Redundanzfrei
  29. 29. @Rule public class BestellProzessTest { @Rule public ProzessTestServer server; } public class ProzessTestServer extends ExternalResource { @Override protected void before() throws Throwable { deployProcesses(); } @Override protected void after() { deleteAllProcessInstances(); }
  30. 30. Hierarchische Tests public class AnOrderProcess { @Before public void createOrderProcess() { process = new OrderProcess(); } public class InOrderForm { @Before public void inOrderForm() { process.setState(ORDER_FORM); } @Test public void whenCanceled_processIsStopped() { process.submit(CANCEL_BUTTON); assertThat("process stopped", process.isStopped(), equalTo(true)); } @Test public void whenBought_orderIsConfirmed() { process.submit(BUY_NOW_BUTTON); assertThat("state", process.getState(), equalTo(ORDER_CONFIRMED)); } } … gemeinsames “setup”
  31. 31. OuT Hierarchische Tests setup execute verify
  32. 32. Hilfsmethoden Object Mother Test Data Builder aCustomer("David"); CustomerTest.aCustomer("David"); CustomerMother.aCustomer("David"); CustomerMother.aCustomer("David", „Völkel"); CustomerMother.aCustomer(null, „Völkel", null, null, null, null, birthday); aCustomer().withLastName("Völkel") .withBirthDay(birthDay) .build(); Gemeinsame Testdaten
  33. 33. void assertMoneyEquals(Money expected, Money actual) { assertEquals("currency", expected.getCurrency(),actual.getCurrency()); assertEquals("amount", expected.getAmount(), actual.getAmount()); } Matcher<Money> equalTo(Money money) { return allOf( property(money, Money::getCurrency, "currency"), property(money, Money::getAmount, "amount")); } Hilfsmethoden Komposition via Hamcrest Matcher Gemeinsames Verify
  34. 34. "Single Concept per Test" "One Execute per Test" "One Assert per Test" Fokussiert
  35. 35. Parameterized „State of Java“ @Test public void beitragsfreiheit() { freigabeZustandIst(2, BEITRAGS_FREI); freigabeZustandIst(3, BEITRAGS_FREI); freigabeZustandIst(99, !BEITRAGS_FREI); freigabeZustandIst(null, !BEITRAGS_FREI); } Fokussiert
  36. 36. Status vs. Testbarkeit Fokussiert
  37. 37. „Listen to your tests!“ Hard to test code
  38. 38. Clean Tests wartbar lesbar flexibel verlässlich
  39. 39. Clean Tests wartbar lesbar flexibel verlässlich 1. 1.
  40. 40. Clean Tests wartbar Namen & Abstraktion lesbar flexibel verlässlich 2.
  41. 41. Clean Tests wartbar redundanzfrei lesbar flexibel verlässlich 3. Namen & Abstraktion
  42. 42. Clean Tests wartbar fokussiert redundanzfrei lesbar flexibel verlässlich 4. Namen & Abstraktion
  43. 43. Fazit Agil bleiben mit Clean Test Code
  44. 44. Quellen Bücher „Clean Code“, Robert C. Martin „xUnit Test Patterns“, Gerard Meszaros „Effective Unittesting“, Lasse Koskela „Growing Object Oriented Software“, Steve Freeman, Nat Pryce „Specification by Example”, Gojko Adzic Videos Episoden 20-22 http://cleancoders.com/, Robert C. Martin Artikel „Design – jetzt auch für Tests“, David Völkel
  45. 45. David Völkel codecentric AG Twitter: @davidvoelkel david.voelkel@codecentric.de www.codecentric.de blog.codecentric.de Fragen und Diskussion 45
  46. 46. Attribution-ShareAlike 3.0 Germany http://creativecommons.org/licenses/by-sa/3.0/de/ Die verwendeten Bilder sind gemeinfrei und stammen aus der Wikipedia Lizenz 46
  • mpausch

    Apr. 28, 2015

Die Folien zu meinem Vortrag "Clean Test Code" auf den Clean Code Days 2014 in München: http://www.cleancode-days.de/vortraege/articles/clean-test-code.html

Aufrufe

Aufrufe insgesamt

1.945

Auf Slideshare

0

Aus Einbettungen

0

Anzahl der Einbettungen

11

Befehle

Downloads

19

Geteilt

0

Kommentare

0

Likes

1

×