Uvod v razvoj testne vožnje (TDD)
Predstavljajte si scenarij, kjer želite napisati naslednjo funkcijo kot del nekega večjega projekta:
IN rite funkcijo za vrnitev vrste trikotnika na podlagi vrednosti dolžine treh strani trikotnika. Poenostavimo ga tako, da predpostavimo, da je preizkus za vrsto vhodnih podatkov že vzpostavljen, tako da prejmete samo številske vrednosti za delo.
prečenje drevesa
Situacija je videti enostavna. Pojdite naprej in napišite funkcijo, ki je videti nekako takole -
Algoritem:
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
Ko dokončate funkcijo, vam je na voljo nekaj trditev, ki jih morate izvesti. In na vaše presenečenje ugotovite, da je le 50% primerov uspešno.
Poglejmo testne izjave. Tisti, ki prehajajo, so:
1. Uveljavi, če (String_toLowerCase(triangle_type(678))==skalarni trikotnik) = Pravilno
2. Uveljavi, če (String_toLowerCase(triangle_type(666))==enakostranični trikotnik) = Pravilno
3. assert(String_toLowerCase(triangle_type(676))==enakokraki trikotnik) = Pravilno
No, vse do tukaj izgleda dobro. Toda tisti, ki ne uspejo, so:
4. Uveljavi, če (String_toLowerCase(triangle_type(000))==ni trikotnik) = nepravilno
5. Uveljavi, če (String_toLowerCase(triangle_type(-6-7-8))==ni trikotnik) = Nepravilno
6. Uveljavi, če (String_toLowerCase(triangle_type(528))==ni trikotnik) = nepravilno
- V 4 vhodne vrednosti izjave so (000). Zdaj vemo, da (000) tvorijo točko in ne trikotnika. Pravzaprav, če je katera koli vhodna vrednost enaka nič, trikotnik ni mogoč. Toda v našem primeru bo vrnil enakostranični trikotnik!
- Tudi 5 izjava nas opominja, da dolžina nikoli ne more biti negativna vrednost. Vidite lestvico, ki je dolga -30 cm. Torej, če imamo vsaj eno -ve vrednost dolžine, trikotnik ni mogoč. Toda v našem primeru lahko glede na vrednost vrne katerega koli od 3 rezultatov. Tukaj vrne skalar.
- Kaj pa zdaj 6 izjava. Vse vrednosti so >= 0 in zagotovo je skalarni trikotnik. Ali pa je? Zapomnite si pravilo, da je v trikotniku vsota katerih koli dveh strani vedno večja ali enaka tretji.
Tukaj vidimo za:
8 + 2 > 5
8 + 5 > 2
5 + 2 > 8
Izhod:
kako deluje računalnik
True
True
False
Ne opravi testa trikotnosti. Dolžine (258) torej ne tvorijo trikotnika.
Torej potrebujemo nekakšno validacijo trikotnika, ki nam pove, ali je to, kar imamo, sploh trikotnik ali ne. Kot del rešitve napišete še eno funkcijo, ki izgleda takole:
Algoritem:
java proti c++
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
Naša prejšnja funkcija zdaj vključuje 2 dodatni vrstici na začetku in wola! zdaj vsi testi potekajo.
To je le preprost primer scenarija, ki nas opomni, da moramo biti pri pisanju kode na produkcijski ravni previdni tudi pri preprostih stvareh. Z upoštevanjem preprostih robnih primerov in preverjanjem z enotnimi primeri nizov smo povečali našo pokritost testa in poskrbeli, da naš program vrača matematično pravilnejše rezultate.
Spodaj je izvedba zgornjega pristopa:
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');
Ko bo zgornji program preizkušen na prej obravnavanih trditvah, bo zdaj prestal testne primere.
V panogi se priprava kotnih primerov in nato razvoj funkcij za zagotovitev, da ti testni primeri uspešno opravijo, imenuje "preizkusno usmerjen razvoj". Ta blog je le bežen vpogled v to, kaj TDD pomeni v praksi.