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:

Stellenmarkt
  1. Senior Software / Data Base Engineer (m/w/d)
    Allianz Deutschland AG, Unterföhring
  2. Softwareentwickler (m/w/d) Automatisierungstechnik
    Dürr Systems AG, Goldkronach
Detailsuche

  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.

Golem Akademie
  1. Linux-Shellprogrammierung: virtueller Vier-Tage-Workshop
    8.–11. März 2022, Virtuell
  2. Einführung in Unity: virtueller Ein-Tages-Workshop
    17. Februar 2022, Virtuell
Weitere IT-Trainings

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.

Handbuch für Softwareentwickler: Das Standardwerk für professionelles Software Engineering

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...

Steffo 20. Apr 2021

Klar und kurz vor Release soll dann alles nochmal durchgetestet werden, um dann...



Aktuell auf der Startseite von Golem.de
Microsoft
11 gute Gründe gegen den Umstieg auf Windows 11

Microsoft hat mit Windows 11 ein besseres Windows versprochen. Momentan fehlt aber viel und Funktionen werden hinter mehr Klicks versteckt.
Ein IMHO von Oliver Nickel

Microsoft: 11 gute Gründe gegen den Umstieg auf Windows 11
Artikel
  1. Vor Hauptversammlung: Telekom-Chef Höttges bekommt zweite Erhöhung in 12 Monaten
    Vor Hauptversammlung
    Telekom-Chef Höttges bekommt zweite Erhöhung in 12 Monaten

    Tim Höttges soll künftig bis zu 9,1 Millionen Euro im Jahr verdienen, gefordert hatte er 10 Millionen Euro von der Telekom.

  2. Reddit: IT-Arbeiter automatisiert seinen Job angeblich vollständig
    Reddit
    IT-Arbeiter automatisiert seinen Job angeblich vollständig

    Ein anonymer IT-Spezialist will unbemerkt seinen Job vollständig automatisiert haben. Dem Arbeitgeber sei dies seit einem Jahr nicht aufgefallen.

  3. Rastplätze: Warnung vor Ladeplätzen zweiter Klasse an Autobahnen
    Rastplätze
    Warnung vor Ladeplätzen zweiter Klasse an Autobahnen

    An unbewirtschafteten Rastplätzen sollen tausend neue Ladesäulen installiert werden. Das führe zu einem Zweiklassensystem, warnen Ladenetzbetreiber.

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 • PS5 Digital inkl. 2. Dualsense bestellbar • RTX 3080 12GB bei Mindfactory 1.699€ • Samsung Gaming-Monitore (u.a. G5 32" WQHD 144Hz Curved 299€) • MindStar (u.a. GTX 1660 6GB 499€) • Sony Fernseher & Kopfhörer • Samsung Galaxy A52 128GB 299€ • CyberGhost VPN 1,89€/Monat [Werbung]
    •  /