logo

Ikke glem The Edge Cases!

En introduksjon til Test Drive Development (TDD)

Se for deg et scenario der du vil skrive følgende funksjon som en del av et større prosjekt:

I rite en funksjon for å returnere typen til en trekant basert på verdien av lengden på 3 sider av en trekant. La oss gjøre det litt enklere ved å anta at testen for inputdatatype allerede er på plass, slik at du bare mottar numeriske verdier å jobbe med.



Situasjonen ser lett ut. Du går videre og skriver funksjonen som ser omtrent slik ut -

Algoritme:   

java boolsk streng
    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

Etter at du har fullført funksjonen får du et par påstander å utføre. Og til din overraskelse finner du ut at bare 50 % av sakene ble godkjent. 

La oss se på testutsagnene. De som består er:
1. Bekreft hvis (String_toLowerCase(triangle_type(678))==skalar trekant) = Riktig 
2. Bekreft hvis (String_toLowerCase(triangle_type(666))==likesidet trekant) = Riktig 
3. assert(String_toLowerCase(triangle_type(676))== likebenet trekant) = Riktig 
Ting ser bra ut hittil. Men de som mislykkes er:
4. Bekreft hvis (String_toLowerCase(triangle_type(000))==ikke en trekant) = Feil 
5. Bekreft hvis (String_toLowerCase(triangle_type(-6-7-8))==ikke en trekant) = Feil 
6. Bekreft hvis (String_toLowerCase(triangle_type(528))==ikke en trekant) = Feil 

  • I 4 setningsinndataverdier er (000). Nå vet vi at (000) danner et punkt og ikke en trekant. Faktisk, hvis en inngangsverdi er null, er trekanten ikke mulig. Men i vårt tilfelle vil den returnere en likesidet trekant!
  • Også den 5 uttalelsen minner oss om at lengden aldri kan være en negativ verdi. Du ser en skala som er -30 cm lang. Så hvis vi har enda en -ve verdi av lengde, er trekanten ikke mulig. Men i vårt tilfelle, avhengig av verdien, kan den returnere hvilket som helst av de 3 resultatene. Her returnerer den en skalar.
  • Hva nå med 6 uttalelse. Alle verdier er >= 0 og det er sikkert en skalar trekant. Eller er det? Husk regelen at i en trekant er summen av 2 sider alltid større enn eller lik den tredje.

Her ser vi for:  

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

Utgang:  

True  
True
False

Den klarer ikke testen av trekantethet. Lengder (258) danner derfor ikke en trekant.

gi nytt navn til mappe i linux

Så det vi trenger er en slags trekantvalidering på plass som forteller oss om det vi har til og med er en trekant eller ikke. Som en del av løsningen skriver du en annen funksjon som ser slik ut:

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

Vår forrige funksjon inkluderer nå 2 ekstra linjer i begynnelsen og wola! alle testene består nå.

Dette er bare et enkelt eksempelscenario for å minne oss på at når vi skriver produksjonsnivåkode, må vi være forsiktige med selv enkle ting. Ved å ha de enkle kantsakene i tankene og sjekke med ensartede strengetuier økte vi testdekningen og fikk programmet vårt til å returnere mer matematisk korrekte resultater.

Nedenfor er implementeringen av tilnærmingen ovenfor:  

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

Programmet ovenfor når det testes på påstandene diskutert før, vil nå bestå testsakene.

I bransjen kalles det å komme opp med hjørnesaker og deretter utvikle funksjoner for å sikre at disse testsakene består som "testdrevet utvikling". Denne bloggen er bare et glimt av hva TDD betyr i praksis.
 

Lag quiz