• IT-Karriere:
  • Services:

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. MVV Enamic GmbH, Mannheim
  2. Netze BW GmbH, Stuttgart

  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. Advanced Python - Fortgeschrittene Programmierthemen
    17./18. Juni 2021, online
  2. Einführung in die Programmierung mit Rust
    21.-24. September 2021, online
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


Anzeige
Hardware-Angebote
  1. (u. a. Ryzen 5 5600X 358,03€)

Robert.Mas 21. Apr 2021 / Themenstart

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

kayozz 21. Apr 2021 / Themenstart

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

Steffo 20. Apr 2021 / Themenstart

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

Steffo 20. Apr 2021 / Themenstart

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

Steffo 20. Apr 2021 / Themenstart

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

Kommentieren


Folgen Sie uns
       


Polestar 2 Probe gefahren

Wir sind mit dem Polestar 2 eine längere Strecke gefahren und waren von dem Elektroauto von Volvo angetan.

Polestar 2 Probe gefahren Video aufrufen
Programm für IT-Jobeinstieg: Hoffen auf den Klebeeffekt
Programm für IT-Jobeinstieg
Hoffen auf den Klebeeffekt

Aktuell ist der Jobeinstieg für junge Ingenieure und Informatiker schwer. Um ihnen zu helfen, hat das Land Baden-Württemberg eine interessante Idee: Es macht sich selbst zur Zeitarbeitsfirma.
Ein Bericht von Peter Ilg

  1. Arbeitszeit Das Sechs-Stunden-Experiment bei Sipgate
  2. Neuorientierung im IT-Job Endlich mal machen!
  3. IT-Unternehmen Die richtige Software für ein Projekt finden

Weclapp-CTO Ertan Özdil: Wir dürfen nicht in Schönheit und Perfektion untergehen!
Weclapp-CTO Ertan Özdil
"Wir dürfen nicht in Schönheit und Perfektion untergehen!"

Der CTO von Weclapp träumt von smarter Software, die menschliches Eingreifen in der nächsten ERP-Generation reduziert. Deutschen Perfektionismus hält Ertan Özdil aber für gefährlich.
Ein Interview von Maja Hoock


    Fiat 500 als E-Auto im Test: Kleinstwagen mit großem Potenzial
    Fiat 500 als E-Auto im Test
    Kleinstwagen mit großem Potenzial

    Fiat hat einen neuen 500er entwickelt. Der Kleine fährt elektrisch - und zwar richtig gut.
    Ein Test von Peter Ilg

    1. Vierradlenkung Elektrischer GMC Hummer SUV fährt im Krabbengang seitwärts
    2. MG Cyberster MG B Roadster mit Lasergürtel und Union Jack
    3. Elektroauto E-Auto-Prämie übersteigt in 2021 schon Vorjahressumme

      •  /