Úvod do vývoja testovacích diskov (TDD)
Predstavte si scenár, v ktorom chcete napísať nasledujúcu funkciu ako súčasť nejakého väčšieho projektu:
IN opíšte funkciu, ktorá vráti typ trojuholníka na základe hodnoty dĺžky 3 strán trojuholníka. Uľahčime si to tým, že predpokladáme, že test pre typ vstupných údajov je už zavedený, takže na prácu dostanete iba číselné hodnoty.
Situácia vyzerá jednoducho. Pokračujte a napíšte funkciu, ktorá vyzerá asi 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í funkcie dostanete niekoľko tvrdení, ktoré musíte vykonať. A na vaše prekvapenie zistíte, že iba 50 % prípadov prešlo.
Pozrime sa na testovacie vyhlásenia. Tie, ktoré prejdú, sú:
1. Uveďte, ak (String_toLowerCase(typ_trojuholníka(678))==skalárny trojuholník) = Správne
2. Uveďte, ak (String_toLowerCase(typ_trojuholníka(666))==rovnostranný trojuholník) = Správne
3. tvrdiť(String_toLowerCase(typ_trojuholníka(676))==rovnoramenný trojuholník) = Správne
Až sem veci vyzerajú dobre. Ale tie, ktoré zlyhajú, sú:
4. Uveďte, ak (String_toLowerCase(typ_trojuholníka(000))==nie je trojuholník) = Nesprávne
5. Uveďte, ak (String_toLowerCase(typ_trojuholníka(-6-7-8))==nie je trojuholník) = Nesprávne
6. Uveďte, ak (String_toLowerCase(typ_trojuholníka(528))==nie je trojuholník) = Nesprávne
- V 4 vstupné hodnoty príkazu sú (000). Teraz vieme, že (000) tvorí bod a nie trojuholník. V skutočnosti, ak je akákoľvek vstupná hodnota nula, trojuholník nie je možný. Ale v našom prípade vráti rovnostranný trojuholník!
- Tiež 5 vyhlásenie nám pripomína, že dĺžka nikdy nemôže byť záporná hodnota. Vidíte stupnicu, ktorá je dlhá -30 cm. Ak teda máme čo i len jednu -ve hodnotu dĺžky, trojuholník nie je možný. Ale v našom prípade v závislosti od hodnoty môže vrátiť ktorýkoľvek z 3 výsledkov. Tu vracia skalár.
- Teraz čo s tým 6 vyhlásenie. Všetky hodnoty sú >= 0 a určite ide o skalárny trojuholník. Alebo je to tak? Pamätajte na pravidlo, že v trojuholníku je súčet akýchkoľvek 2 strán vždy väčší alebo rovný 3.
Tu vidíme:
8 + 2 > 5
8 + 5 > 2
5 + 2 > 8
výstup:
True
True
False
Neprejde testom trojuholníkovosti. Dĺžky (258) teda netvoria trojuholník.
Potrebujeme teda určitý druh overenia trojuholníka, ktorý nám povie, či to, čo máme, je dokonca trojuholník alebo nie. Ako súčasť riešenia napíšete ďalšiu funkciu, ktorá vyzerá 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ša predchádzajúca funkcia teraz obsahuje 2 ďalšie riadky na začiatku a wola! všetky testy teraz prechádzajú.
Toto je len jednoduchý príklad scenára, ktorý nám má pripomenúť, že keď píšeme kód na úrovni produkcie, musíme byť opatrní aj pri jednoduchých veciach. Tým, že sme pamätali na jednoduché okrajové prípady a kontrolovali sme s jednotnými puzdrami reťazcov, zvýšili sme pokrytie testov a náš program dosiahol matematicky správnejšie výsledky.
Nižšie je uvedená implementácia vyššie uvedeného prí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');
Vyššie uvedený program, keď je testovaný na tvrdeniach diskutovaných predtým, teraz prejde testovacími prípadmi.
V tomto odvetví sa vymýšľanie rohových prípadov a následné vyvíjanie funkcií, aby sa zabezpečilo, že tieto testovacie prípady prešli, nazýva „vývoj riadený testom“. Tento blog je len letmý pohľad na to, čo TDD znamená v praxi.