logo

Vergessen Sie nicht die Edge Cases!

Eine Einführung in die Test Drive Development (TDD)

Stellen Sie sich ein Szenario vor, in dem Sie die folgende Funktion als Teil eines größeren Projekts schreiben möchten:

IN rite eine Funktion, um den Typ eines Dreiecks basierend auf dem Wert der Länge von drei Seiten eines Dreiecks zurückzugeben. Machen wir es uns etwas einfacher, indem wir davon ausgehen, dass der Test für den Eingabedatentyp bereits vorhanden ist, sodass Sie nur numerische Werte zum Arbeiten erhalten.



Zeile vs. Spalte

Die Situation sieht einfach aus. Sie schreiben nun die Funktion, die etwa so aussieht:

Algorithmus:   

    Input :    3 numeric values  
Output : 1 string stating type of triangle
Function : triangleType (side1 side2 side3)
Start :
1. If side1 == side2 == side3
Then Return Equilateral Triangle
2. Else if side1 == side2 or side1 == side3 or side2 == side3
Then Return Isosceles Triangle
3. Else
Return Scalar Triangle
Stop

Nachdem Sie die Funktion abgeschlossen haben, müssen Sie einige Zusicherungen ausführen. Und zu Ihrer Überraschung stellen Sie fest, dass nur 50 % der Fälle erfolgreich waren. 

Base64-Dekodierung in js

Schauen wir uns die Testaussagen an. Diejenigen, die bestehen, sind:
1. Stellen Sie fest, ob (String_toLowerCase(triangle_type(678))==skalares Dreieck) = Korrekt ist 
2. Stellen Sie fest, ob (String_toLowerCase(triangle_type(666))==gleichseitiges Dreieck) = Korrekt ist 
3. Assert(String_toLowerCase(triangle_type(676))==gleichschenkliges Dreieck) = Korrekt 
Bis hierher sieht es gut aus. Aber diejenigen, die scheitern, sind:
4. Stellen Sie fest, ob (String_toLowerCase(triangle_type(000))==kein Dreieck) = Falsch ist 
5. Stellen Sie fest, ob (String_toLowerCase(triangle_type(-6-7-8))==kein Dreieck) = Falsch ist 
6. Stellen Sie fest, ob (String_toLowerCase(triangle_type(528))==kein Dreieck) = Falsch ist 

  • Im 4 Die Eingabewerte der Anweisung sind (000). Jetzt wissen wir, dass (000) einen Punkt und kein Dreieck bilden. Tatsächlich ist das Dreieck nicht möglich, wenn einer der Eingabewerte Null ist. Aber in unserem Fall wird es ein gleichseitiges Dreieck zurückgeben!
  • Auch die 5 Die Anweisung erinnert uns daran, dass die Länge niemals ein negativer Wert sein kann. Sie sehen eine Skala mit einer Länge von -30 cm. Wenn wir also auch nur einen -ve-Längenwert haben, ist das Dreieck nicht möglich. Aber in unserem Fall kann es je nach Wert eines der drei Ergebnisse zurückgeben. Hier wird ein Skalar zurückgegeben.
  • Was ist nun mit dem 6 Stellungnahme. Alle Werte sind >= 0 und es handelt sich sicherlich um ein Skalardreieck. Oder doch? Denken Sie an die Regel, dass in einem Dreieck die Summe zweier Seiten immer größer oder gleich der dritten ist.

Hier sehen wir für:  

8 + 2 > 5  
8 + 5 > 2
5 + 2 > 8

Ausgabe :  

True  
True
False

Es besteht den Triangularitätstest nicht. Daher bilden die Längen (258) kein Dreieck.

Was wir also brauchen, ist eine Art Dreiecksvalidierung, die uns sagt, ob das, was wir haben, überhaupt ein Dreieck ist oder nicht. Als Teil der Lösung schreiben Sie eine weitere Funktion, die wie folgt aussieht:

Algorithmus:   

Schlaf für Javascript
Input : 3 sides of the triangle   
Output : Boolean value: True if 3 sides form a triangle false otherwise
Function : triangleValidator(side1 side2 side3)
Start
1. If (side1 <= 0 or side2 <= 0 or side3 <= 0) and
(side2 + side3 >= side1) and
(side3 + side1 >= side2) and (side1 + side2 >= side3)
then return True
3. Return False
Stop

Unsere bisherige Funktion enthält jetzt 2 zusätzliche Zeilen am Anfang und wola! Alle Tests werden jetzt bestanden.

Dies ist nur ein einfaches Beispielszenario, das uns daran erinnern soll, dass wir beim Schreiben von Code auf Produktionsebene auch bei einfachen Dingen vorsichtig sein müssen. Durch die Berücksichtigung der einfachen Randfälle und die Prüfung mit einheitlichen String-Fällen haben wir unsere Testabdeckung erhöht und dafür gesorgt, dass unser Programm mathematisch korrektere Ergebnisse liefert.

Nachfolgend finden Sie die Umsetzung des oben genannten Ansatzes:  

Python3
# Check if given sides form a triangle or not def triangleValidator(side1 side2  side3): if side1 <= 0 or side2 <= 0 or side3 <= 0: return False elif (side1 + side2 >= side3) and (side2 + side3 >= side1) and (side3 + side1 >= side2): return True return False # Return the type of triangle def triangleType(side1 side2 side3): # If not a triangle return 'Not a triangle' if triangleValidator(side1 side2 side3) == False: return 'Not A Triangle' # Else perform type checking if side1 == side2 == side3: return 'Equilateral Triangle' elif (side1 == side2) or (side2 == side3) or (side3 == side1): return 'Isosceles Triangle' return 'Scalar Triangle' def call(): print(triangleType(678)) print(triangleType(666)) print(triangleType(676)) print(triangleType(000)) print(triangleType(-6-7-8)) print(triangleType(528)) if __name__=='__main__': call() 
JavaScript
// Check if given sides form a triangle or not function triangleValidator(side1 side2 side3) {  if (side1 <= 0 || side2 <= 0 || side3 <= 0) {  return false;  } else if (side1 + side2 > side3 && side2 + side3 > side1 && side3 + side1 > side2) {  return true;  }  return false; } // Return the type of triangle function triangleType(side1 side2 side3) {  // If not a triangle return 'Not a triangle'  if (triangleValidator(side1 side2 side3) === false) {  return 'Not A Triangle';  }  // Else perform type checking  if (side1 === side2 && side2 === side3) {  return 'Equilateral Triangle';  } else if (side1 === side2 || side2 === side3 || side3 === side1) {  return 'Isosceles Triangle';  }  return 'Scalar Triangle'; } // Assertions console.assert(triangleType(6 7 8).toLowerCase() === 'scalar triangle'); console.assert(triangleType(6 6 6).toLowerCase() === 'equilateral triangle'); console.assert(triangleType(6 7 6).toLowerCase() === 'isosceles triangle'); console.assert(triangleType(0 0 0).toLowerCase() === 'not a triangle'); console.assert(triangleType(-6 -7 -8).toLowerCase() === 'not a triangle'); console.assert(triangleType(5 3 8).toLowerCase() === 'not a triangle'); 

Wenn das obige Programm anhand der zuvor besprochenen Behauptungen getestet wird, besteht es nun die Testfälle.

Mapping im Typoskript

In der Branche wird die Entwicklung von Eckfällen und die anschließende Entwicklung von Funktionen, um sicherzustellen, dass diese Testfälle erfolgreich sind, als „testgetriebene Entwicklung“ bezeichnet. Dieser Blog gibt nur einen Einblick in die praktische Bedeutung von TDD.
 

Quiz erstellen