Ievads testa braucienu izstrādē (TDD)
Iedomājieties scenāriju, kurā vēlaties uzrakstīt šādu funkciju kā daļu no kāda lielāka projekta:
IN rakstīt funkciju, lai atgrieztu trijstūra veidu, pamatojoties uz trijstūra 3 malu garuma vērtību. Padarīsim to nedaudz vienkāršāku, pieņemot, ka ievades datu tipa pārbaude jau ir izveidota, tāpēc saņemat tikai skaitliskās vērtības, ar kurām strādāt.
auns aktieris
Situācija izskatās viegla. Jūs turpiniet un uzrakstiet funkciju, kas izskatās apmēram šādi -
Algoritms:
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
Pēc funkcijas pabeigšanas jums tiek doti daži apgalvojumi, kas jāveic. Un jums par pārsteigumu jūs atklājat, ka tikai 50% gadījumu ir pagājuši.
Apskatīsim testa paziņojumus. Tie, kas iziet, ir:
1. Apstiprināt, ja (String_toLowerCase(triangle_type(678))==skalārais trīsstūris) = Pareizi
2. Apstiprināt, ja (String_toLowerCase(triangle_type(666))==vienādmalu trīsstūris) = Pareizi
3. assert(String_toLowerCase(triangle_type(676))==vienādsānu trīsstūris) = Pareizi
Līdz šim lietas izskatās labi. Bet tie, kas neizdodas, ir:
4. Apgalvot, ja (String_toLowerCase(triangle_type(000))==nav trīsstūris) = Nepareizi
5. Apgalvot, ja (String_toLowerCase(triangle_type(-6-7-8))==nav trīsstūris) = Nepareizi
6. Apgalvot, ja (String_toLowerCase(triangle_type(528))==nav trīsstūris) = Nepareizi
- In 4 paziņojuma ievades vērtības ir (000). Tagad mēs zinām, ka (000) veido punktu, nevis trīsstūri. Faktiski, ja kāda ievades vērtība ir nulle, trīsstūris nav iespējams. Bet mūsu gadījumā tas atgriezīs vienādmalu trīsstūri!
- Arī 5 paziņojums mums atgādina, ka garums nekad nevar būt negatīva vērtība. Jūs redzat mērogu, kura garums ir -30 cm. Tādējādi, ja mums ir kaut viena -ve garuma vērtība, trīsstūris nav iespējams. Bet mūsu gadījumā atkarībā no vērtības tas var atgriezt jebkuru no 3 rezultātiem. Šeit tas atgriež skalāru.
- Tagad ko par 6 paziņojums. Visas vērtības ir >= 0, un tas noteikti ir skalārs trīsstūris. Vai arī tā ir? Atcerieties noteikumu, ka trijstūrī jebkuru 2 malu summa vienmēr ir lielāka vai vienāda ar 3.
Šeit mēs redzam:
8 + 2 > 5
8 + 5 > 2
5 + 2 > 8
Izvade:
cik pilsētu Amerikas Savienotajās Valstīs
True
True
False
Tas neiztur trīsstūrveida pārbaudi. Tādējādi garumi (258) neveido trīsstūri.
Tātad mums ir vajadzīga sava veida trijstūra validācija, kas mums norāda, vai tas, kas mums ir, ir pat trīsstūris vai nē. Kā daļu no risinājuma jūs ierakstāt citu funkciju, kas izskatās šādi:
Algoritms:
niks pulos melns zibens
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
Mūsu iepriekšējā funkcija tagad ietver 2 papildu rindas sākumā un wola! visi testi tagad iet.
Šis ir tikai vienkāršs scenārija piemērs, kas atgādina mums, ka, rakstot ražošanas līmeņa kodu, mums jābūt uzmanīgiem pat ar vienkāršām lietām. Paturot prātā vienkāršās malas gadījumus un pārbaudot, izmantojot vienotus virknes gadījumus, mēs palielinājām mūsu testa pārklājumu un likām programmai sniegt matemātiski pareizākus rezultātus.
Zemāk ir aprakstīta iepriekš minētās pieejas īstenošana:
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');
Iepriekš minētā programma, pārbaudot to, pamatojoties uz iepriekš apspriestajiem apgalvojumiem, tagad izturēs pārbaudes gadījumus.
Nozarē tiek piedāvāti stūra korpusi un pēc tam izstrādātas funkcijas, lai pārliecinātos, ka šie testpiemēri ir izturējuši, tiek saukta par "pārbaudes virzītu attīstību". Šis emuārs ir tikai ieskats tajā, ko TDD nozīmē praksē.