Uvod u razvoj testne vožnje (TDD)
Zamislite scenarij u kojem želite napisati sljedeću funkciju kao dio nekog većeg projekta:
U rite funkciju za vraćanje vrste trokuta na temelju vrijednosti duljine 3 stranice trokuta. Olakšajmo to uz pretpostavku da je test za vrstu ulaznih podataka već postavljen tako da primate samo numeričke vrijednosti za rad.
java spavanje
Situacija izgleda lako. Samo naprijed i napišite funkciju koja izgleda otprilike ovako -
Algoritam:
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
Nakon što dovršite funkciju dobivate nekoliko tvrdnji koje trebate izvršiti. I na svoje iznenađenje otkrijete da je samo 50% slučajeva prošlo.
Pogledajmo testne izjave. Oni koji prolaze su:
1. Utvrdite if (String_toLowerCase(triangle_type(678))==skalarni trokut) = Ispravno
2. Utvrdi ako (String_toLowerCase(triangle_type(666))==jednakostranični trokut) = Točno
3. assert(String_toLowerCase(triangle_type(676))==istokračni trokut) = Ispravno
Pa stvari izgledaju dobro do ovdje. Ali oni koji ne uspijevaju su:
4. Potvrdi ako (String_toLowerCase(triangle_type(000))==nije trokut) = Netočno
5. Utvrdi ako (String_toLowerCase(triangle_type(-6-7-8))==nije trokut) = Netočno
6. Tvrdi ako (String_toLowerCase(triangle_type(528))==nije trokut) = Netočno
- u 4 ulazne vrijednosti iskaza su (000). Sada znamo da (000) čine točku, a ne trokut. Zapravo, ako je bilo koja ulazna vrijednost nula, trokut nije moguć. Ali u našem slučaju vratit će jednakostranični trokut!
- Također 5 izjava nas podsjeća da duljina nikada ne može biti negativna vrijednost. Vidite ljestvicu koja je duga -30 cm. Dakle, ako imamo samo jednu -ve vrijednost duljine trokut nije moguć. Ali u našem slučaju, ovisno o vrijednosti, može vratiti bilo koji od 3 rezultata. Ovdje vraća skalar.
- Što je sada s 6 izjava. Sve vrijednosti su >= 0 i to je sigurno skalarni trokut. Ili je? Zapamtite pravilo da je u trokutu zbroj bilo koje dvije strane uvijek veći ili jednak trećoj.
Ovdje vidimo za:
8 + 2 > 5
8 + 5 > 2
5 + 2 > 8
Izlaz:
logika prvog reda
True
True
False
Pada na testu trokutastosti. Dakle, duljine (258) ne tvore trokut.
Dakle, ono što nam treba je neka vrsta valjanosti trokuta koja nam govori je li ono što imamo uopće trokut ili nije. Kao dio rješenja pišete drugu funkciju koja izgleda ovako:
Algoritam:
string u int
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 prethodna funkcija sada uključuje 2 dodatna retka na početku i wola! sada svi testovi prolaze.
Ovo je samo jednostavan primjer scenarija koji nas podsjeća da kada pišemo kod proizvodne razine moramo biti oprezni čak i s jednostavnim stvarima. Imajući na umu jednostavne rubne slučajeve i provjeravajući uniformne slučajeve nizova, povećali smo našu pokrivenost testom i učinili da naš program vraća matematički ispravnije rezultate.
Ispod je implementacija gornjeg pristupa:
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');
Kada se gore navedeni program testira na tvrdnje o kojima je prije bilo riječi sada će proći testne slučajeve.
U industriji se smišljanje kutnih slučajeva, a zatim razvoj funkcija kako bi se osiguralo da ti testni slučajevi prolaze, naziva "testom vođen razvoj". Ovaj blog samo je kratak pregled onoga što TDD znači u praksi.