Und jetzt fügen wir alles zusammen

Wie gesagt würden wir in der Praxis nur jeweils einen einzigen Fehler einbauen. Der Einfachheit halber fassen wir aber alle zusammen:

  1. public int add(final String numbers) {
  2. double returnValue = 0;
  3. String[] numbersArray = numbers.split(",");
  4. if (numbersArray.length == 3) {
  5. throw new RuntimeException("Up to 2 numbers separated by comma (,) are allowed");
  6. }
  7. for (String number : numbersArray) {
  8. if (number.isEmpty()) { return 0; }
  9. returnValue += Double.parseDouble(number);
  10. }
  11. return (int) returnValue;
  12. }

Erstaunlicherweise ist nicht ein einziger Test fehlgeschlagen! Jeder einzelne vom Autor geschriebene Test ist immer noch grün, obwohl wir in jede zweite Zeile plausible Fehler eingebaut haben. Das zeigt, dass die Testsuite folgende Lücken hat:

1. Sie testet nicht auf Leerzeichen.

2. Sie testet nicht auf tatsächliche leere Substrings/Leerzeichen-Substrings, wo eigentlich eine Zahl stehen sollte.

3. Sie testet nicht auf eine beliebige Anzahl von Eingaben.

4. Es wird nicht auf numerische, nicht-ganzzahlige Eingaben getestet.

Sobald Sie die oben genannten Lücken identifiziert haben, können Sie zudem anfangen, sie zu schließen, indem Sie weitere Tests hinzufügen. Tests, die jetzt fehlschlagen, aber bestehen, sobald Sie alle eingebauten Fehler beheben:

  1. @Test(expected = NumberFormatException.class)
  2. public void doubleInputProvided_shouldThrowException() {
  3. EXAMPLE.add("1.5,1.5");
  4. }
  5.  
  6. @Test
  7. public void blankString_shouldReturn0() {
  8. Assert.assertEquals(0, EXAMPLE.add(" "));
  9. }
  10.  
  11. @Test
  12. public void emptyStringAfterNumbers_shouldIgnoreIt() {
  13. Assert.assertEquals(1, EXAMPLE.add("1, "));
  14. }
  15.  
  16. @Test
  17. public void arbitrarilyManyNumbersProvided_shouldThrowException() {
  18. StringBuilder inputs = new StringBuilder("3,4");
  19. for (int i=0; i<10; i++) {
  20. inputs.append("," + ThreadLocalRandom.current().nextInt());
  21. try {
  22. int result = EXAMPLE.add(inputs.toString());
  23. Assert.fail("No exception thrown. Got result: " + result + ", for input: " + inputs.toString());
  24. } catch (RuntimeException e) {
  25. Assert.assertEquals("Up to 2 numbers separated by comma (,) are allowed", e.getMessage());
  26. }
  27. }
  28. }

Um es klar zu sagen - die obigen Tests sind sicher nicht perfekt. Mit weiteren Iterationen von mutationsgetriebenen Tests können Sie noch mehr Abdeckungslücken identifizieren, die von den obigen Tests übersehen werden. Außerdem sollten Sie ausgefeiltere Testtechniken verwenden (die hier besprochen werden), um Ihre Testabdeckung auf sinnvolle Weise zu verbessern.

Zumindest aber hilft uns dieser Prozess, besser zu verstehen, wo die Abdeckungslücken sind, und bringt uns der Beseitigung der eklatantesten Lücken näher.

Aber: Ist es das wert?

Zugegeben, das Durchlaufen des obigen Prozesses wird zusätzlichen Aufwand und Zeit erfordern. Und das Endergebnis wird eine viel umfangreichere Serie von Tests sein, von denen viele für ein ungeschultes Auge überflüssig erscheinen mögen. Ist es das also wirklich wert?

Wie immer hängt es von Ihren Prioritäten ab. Wenn Sie quick and dirty einen Prototyp bauen und es Ihnen nichts ausmacht, dass einige kleine und seltene Fehler durchrutschen, ist das wahrscheinlich in Ordnung. Wenn Sie aber Angst vor Produktionsfehlern haben, sollten Sie unbedingt Zeit und Mühe in die Verbesserung Ihrer Testsuite investieren. Eine solide Testsuite mit minimalen Abdeckungslücken ist die beste Verteidigung gegen Produktionsbugs. Auf lange Sicht wird das Ihre Entwicklungsgeschwindigkeit sogar erhöhen, weil es erlaubt, sicher zu refaktorisieren und Änderungen schnell zu verteilen, ohne viel Zeit für manuelle Tests zu verwenden.

Oft wird über TDD gesprochen, als ob es ein Allheilmittel wäre, welches das Problem mit dem Testen "löst". Das ist ganz klar nicht der Fall. Wenn Sie Jeff Dean oder Sanjay Ghemawat sind, können Sie vielleicht eine perfekte Testsuite allein durch Nachdenken schreiben. Für den Rest von uns Sterblichen ist jedoch der beste Weg, Abdeckungslücken in unserer Testsuite zu identifizieren und zu beheben, indem wir sie empirisch testen.

Bitte aktivieren Sie Javascript.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
  • ohne Werbung
  • mit ausgeschaltetem Javascript
  • mit RSS-Volltext-Feed
 Ein TDD-Beispiel
  1.  
  2. 1
  3. 2
  4. 3


Robert.Mas 21. Apr 2021

Du meinst so wie hier im Artikel: "Es gibt übrigens Werkzeuge(Link: https://pitest.org...

kayozz 21. Apr 2021

+1 Allein dadurch, dass ich von außen einen Test schreibe, und danach die...

Steffo 20. Apr 2021

Sagt er doch gar nicht: "1. Erreichen Sie einen Zustand, in dem Sie sowohl Code als auch...

Steffo 20. Apr 2021

Alles, was du hier ansprichst, behandelt doch der Artikel. Dadurch lassen sich natürlich...



Aktuell auf der Startseite von Golem.de
Nachfolger von CS GO
Counter-Strike 2 ist geleakt

Eigentlich steht CS 2 bisher nur ausgewählten Personen zur Verfügung. Eine davon hat die Spieldateien aber offenbar ins Internet hochgeladen.

Nachfolger von CS GO: Counter-Strike 2 ist geleakt
Artikel
  1. Model S und Model X: Teslas rundes Lenkrad ist ausverkauft
    Model S und Model X
    Teslas rundes Lenkrad ist ausverkauft

    Tesla kann die Alternative zum Steuerhorn beim Model X und Model S nicht liefern. Offenbar wurde die Nachfrage unterschätzt.

  2. Akkutechnik: Amprius stellt Akkuzellen mit über 500 Wh/kg vor
    Akkutechnik
    Amprius stellt Akkuzellen mit über 500 Wh/kg vor

    Mit viel Aufwand können inzwischen Akkus nah an der Grenze zum physikalisch Machbaren gebaut werden. Was fehlt, ist die Massenproduktion.
    Eine Analyse von Frank Wunderlich-Pfeiffer

  3. Tiktok-Randale bei Creed III: Kinos setzen auf Erhöhung der FSK und Security
    Tiktok-Randale bei Creed III
    Kinos setzen auf Erhöhung der FSK und Security

    Kinos wollen verhindern, dass Zuschauer wegen Störaktionen dem Boxerfilm Creed III fernbleiben. Der Trend, sich beim Randalieren auf Tiktok zu zeigen, hält an.

Du willst dich mit Golem.de beruflich verändern oder weiterbilden?
Zum Stellenmarkt
Zur Akademie
Zum Coaching
  • Schnäppchen, Rabatte und Top-Angebote
    Die besten Deals des Tages
    • Daily Deals • MediaMarkt-Osterangebote • 3 Spiele kaufen, nur 2 bezahlen • Cyberport Jubiläums-Deals • MindStar: Gigabyte RTX 4080 OC 1.229€ • NBB Black Weeks • Crucial SSD 1TB/2TB (PS5) bis -42% • Amazon Smart TVs ab 189€ • PS5 + RE4 569€ • Nintendo Switch + Spiel + Goodie 288€ [Werbung]
    •  /