logo

Nezapomeňte na pouzdra Edge!

Úvod do vývoje testovacích disků (TDD)

Představte si scénář, ve kterém chcete napsat následující funkci jako součást nějakého většího projektu:

V ritujte funkci, která vrátí typ trojúhelníku na základě hodnoty délky 3 stran trojúhelníku. Pojďme si to trochu usnadnit tím, že předpokládáme, že test pro vstupní datový typ je již na místě, takže obdržíte pouze číselné hodnoty, se kterými můžete pracovat.



Situace vypadá jednoduše. Pokračujte a napište funkci, která vypadá nějak takto -

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

Po dokončení funkce dostanete několik tvrzení, která musíte provést. A ke svému překvapení zjistíte, že pouze 50 % případů prošlo. 

Podívejme se na testovací prohlášení. Ty, které projdou, jsou:
1. Uveďte if (String_toLowerCase(triangle_type(678))==skalární trojúhelník) = Správně 
2. Uveďte, zda (String_toLowerCase(typ_trojuhelníku(666))==rovnostranný trojúhelník) = Správně 
3. tvrdit(String_toLowerCase(typ_trojuhelniku(676))==rovnoramenny trojúhelník) = Správně 
Až sem to vypadá dobře. Ale ty, které selžou, jsou:
4. Uveďte if (String_toLowerCase(triangle_type(000))==není trojúhelník) = Nesprávně 
5. Uveďte if (String_toLowerCase(triangle_type(-6-7-8))==není trojúhelník) = Nesprávně 
6. Uveďte if (String_toLowerCase(triangle_type(528))==není trojúhelník) = Nesprávně 

  • V 4 vstupní hodnoty příkazu jsou (000). Nyní víme, že (000) tvoří bod a ne trojúhelník. Ve skutečnosti, pokud je jakákoliv vstupní hodnota nulová, trojúhelník není možný. Ale v našem případě vrátí rovnostranný trojúhelník!
  • Také 5 příkaz nám připomíná, že délka nikdy nemůže být záporná hodnota. Vidíte měřítko, které je dlouhé -30 cm. Pokud tedy máme byť jen jednu -ve hodnotu délky, trojúhelník není možný. Ale v našem případě v závislosti na hodnotě může vrátit kterýkoli ze 3 výsledků. Zde vrací skalár.
  • A co teď s 6 prohlášení. Všechny hodnoty jsou >= 0 a je to jistě skalární trojúhelník. nebo ano? Pamatujte na pravidlo, že v trojúhelníku je součet libovolných 2 stran vždy větší nebo roven 3.

Zde vidíme:  

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

výstup:  

True  
True
False

Neprojde testem trojúhelníkovosti. Délky (258) tedy netvoří trojúhelník.

Potřebujeme tedy určitý druh ověření trojúhelníku, který nám říká, zda to, co máme, je dokonce trojúhelník nebo ne. Jako součást řešení napíšete další funkci, která vypadá takto:

Algoritmus:   

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še předchozí funkce nyní obsahuje 2 řádky navíc na začátku a wola! nyní všechny testy procházejí.

Toto je jen jednoduchý příklad scénáře, který nám má připomenout, že když píšeme kód na úrovni produkce, musíme být opatrní i s jednoduchými věcmi. Tím, že jsme pamatovali na jednoduchá okrajová pouzdra a kontrolovali s jednotnými pouzdry řetězců, jsme zvýšili pokrytí testů a zajistili, že náš program vrací matematicky správnější výsledky.

Níže je implementace výše uvedeného přístupu:  

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

Výše uvedený program, když byl testován na tvrzeních diskutovaných dříve, nyní projde testovacími případy.

V oboru se vymýšlení rohových případů a následné vyvíjení funkcí, které zajistí, že tyto testovací případy projdou, nazýváno „vývoj řízený testem“. Tento blog je jen záblesk toho, co TDD znamená v praxi.
 

tiskové pole v Javě
Vytvořit kvíz