logo

Glem ikke Edge Cases!

En introduktion til Test Drive Development (TDD)

Forestil dig et scenarie, hvor du vil skrive følgende funktion som en del af et større projekt:

I riter en funktion for at returnere typen af ​​en trekant baseret på værdien af ​​længden af ​​3 sider af en trekant. Lad os gøre det lidt nemmere ved at antage, at testen for inputdatatype allerede er på plads, så du kun modtager numeriske værdier at arbejde med.



Situationen ser let ud. Du går videre og skriver funktionen, der ser sådan ud -

Algoritme:   

ms word hurtig adgang værktøjslinje
    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

Når du har fuldført funktionen, får du et par påstande, du skal udføre. Og til din overraskelse opdager du, at kun 50% af sagerne bestod. 

Lad os se på testerklæringerne. Dem der består er:
1. Bekræft, hvis (String_toLowerCase(triangle_type(678))==skalar trekant) = Korrekt 
2. Bekræft, hvis (String_toLowerCase(triangle_type(666))==ligesidet trekant) = Korrekt 
3. assert(String_toLowerCase(triangle_type(676))==ligebenet trekant) = Korrekt 
Tja, tingene ser godt ud indtil her. Men dem der fejler er:
4. Bekræft, hvis (String_toLowerCase(triangle_type(000))==ikke en trekant) = Forkert 
5. Bekræft, hvis (String_toLowerCase(triangle_type(-6-7-8))==ikke en trekant) = Forkert 
6. Påstå, hvis (String_toLowerCase(triangle_type(528))==ikke en trekant) = Forkert 

  • I den 4 sætningens inputværdier er (000). Nu ved vi, at (000) danner et punkt og ikke en trekant. Faktisk, hvis en inputværdi er nul, er trekanten ikke mulig. Men i vores tilfælde vil det returnere en ligesidet trekant!
  • Også den 5 statement minder os om, at længden aldrig kan være en negativ værdi. Du ser en skala, der er -30 cm lang. Så hvis vi har en -ve værdi af længden, er trekanten ikke mulig. Men i vores tilfælde kan det afhængigt af værdien returnere et hvilket som helst af de 3 resultater. Her returnerer det en skalar.
  • Hvad nu med 6 erklæring. Alle værdier er >= 0, og det er bestemt en skalar trekant. Eller er det? Husk reglen om, at summen af ​​alle 2 sider i en trekant altid er større end eller lig med den 3.

Her ser vi for:  

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

Output:  

True  
True
False

Det klarer ikke testen af ​​trekantethed. Derfor danner længder (258) ikke en trekant.

32 bit arkitektur vs 64 bit

Så det, vi har brug for, er en slags trekant-validering på plads, som fortæller os, om det, vi har, endda er en trekant eller ej. Som en del af løsningen skriver du en anden funktion, der ser sådan ud:

Algoritme:   

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

Vores tidligere funktion inkluderer nu 2 ekstra linjer i begyndelsen og wola! alle prøver består nu.

Dette er blot et simpelt eksempelscenarie for at minde os om, at når vi skriver produktionsniveaukode, skal vi være forsigtige med selv simple ting. Ved at huske på de enkle kantsager og tjekke med ensartede strengekasser øgede vi vores testdækning og fik vores program til at returnere mere matematisk korrekte resultater.

Nedenfor er implementeringen af ​​ovenstående tilgang:  

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'); 

Ovenstående program, når det testes på de påstande, der er diskuteret før, vil nu bestå testcaserne.

I branchen betegnes det som 'testdrevet udvikling' at komme med hjørnesager og derefter udvikle funktioner til at sikre, at disse testsager bestå. Denne blog er blot et glimt af, hvad TDD betyder i praksis.
 

Opret quiz