logo

Ne felejtsd el az Edge tokokat!

Bevezetés a tesztmeghajtók fejlesztésébe (TDD)

jgombot

Képzeljünk el egy forgatókönyvet, amikor a következő függvényt egy nagyobb projekt részeként szeretné megírni:

IN Írjon egy függvényt a háromszög típusának visszaadásához a háromszög 3 oldalának hosszának értéke alapján. Tegyük egyszerűbbé a dolgot azzal, hogy feltételezzük, hogy a bemeneti adattípus tesztje már megtörtént, így csak numerikus értékeket kap, amelyekkel dolgozni kell.



A helyzet könnyűnek tűnik. Menj előre, és írd be a függvényt, ami valahogy így néz ki -

Algoritmus:   

    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

Miután befejezte a funkciót, néhány állítást kell végrehajtania. És meglepetésére azt tapasztalja, hogy csak az esetek 50%-a ment át. 

statikus java

Nézzük a tesztállításokat. Amelyek átmennek a következők:
1. Állítsa be, ha (String_toLowerCase(triangle_type(678))==skaláris háromszög) = Helyes 
2. Állítsa be, ha (String_toLowerCase(triangle_type(666))== egyenlő oldalú háromszög) = Helyes 
3. assert(String_toLowerCase(triangle_type(676))==egyenlő szárú háromszög) = Helyes 
Nos, idáig jól néznek ki a dolgok. De amik kudarcot vallanak:
4. Állítsa be, ha (String_toLowerCase(triangle_type(000))==nem háromszög) = Helytelen 
5. Állítsa be, ha (String_toLowerCase(triangle_type(-6-7-8))==nem háromszög) = Helytelen 
6. Állítsa be, ha (String_toLowerCase(triangle_type(528))==nem háromszög) = Helytelen 

  • A 4 utasítás bemeneti értéke (000). Most már tudjuk, hogy (000) egy pontot alkot, és nem egy háromszöget. Valójában ha bármely bemeneti érték nulla, a háromszög nem lehetséges. De a mi esetünkben egyenlő oldalú háromszöget ad vissza!
  • Szintén a 5 kijelentés arra emlékeztet bennünket, hogy a hosszúság soha nem lehet negatív érték. Egy -30 cm hosszú mérleget látsz. Így ha csak egy -ve hosszúságunk van, a háromszög nem lehetséges. De esetünkben az értéktől függően a 3 eredmény bármelyikét visszaadhatja. Itt egy skalárt ad vissza.
  • Most mi van a 6 nyilatkozat. Minden érték >= 0, és ez biztosan egy skaláris háromszög. Vagy mégis? Emlékezz arra a szabályra, hogy egy háromszögben bármely két oldal összege mindig nagyobb vagy egyenlő a 3-mal.

Itt látjuk:  

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

Kimenet:  

True  
True
False

Megbukik a háromszögesség tesztjén. Ezért a (258) hosszúságok nem alkotnak háromszöget.

Tehát szükségünk van egyfajta háromszög-érvényesítésre, amely megmondja, hogy az, amink van, még háromszög-e vagy sem. A megoldás részeként egy másik függvényt ír, amely így néz ki:

Algoritmus:   

np.log
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

Korábbi funkciónk most 2 extra sort tartalmaz az elején és wola! most minden teszt sikeres.

Ez csak egy egyszerű példa forgatókönyv, amely emlékeztet bennünket arra, hogy amikor éles szintű kódot írunk, még az egyszerű dolgokkal is óvatosnak kell lennünk. Az egyszerű élesetek szem előtt tartásával és az egységes karakterlánc-esetekkel történő ellenőrzéssel növeltük a tesztek lefedettségét, és a programunk matematikailag helyesebb eredményeket ad vissza.

Az alábbiakban bemutatjuk a fenti megközelítés megvalósítását:  

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

A fenti program, ha a korábban tárgyalt állításokon teszteljük, most átmegy a teszteseteken.

tömb c karakterlánc

Az iparágban a sarok esetek kidolgozása, majd a tesztesetek sikerességét biztosító funkciók fejlesztése „tesztvezérelt fejlesztésnek” nevezik. Ez a blog csak egy pillantás arról, hogy mit jelent a TDD a gyakorlatban.
 

Kvíz létrehozása