Una introducció al desenvolupament de test drive (TDD)
Imagineu un escenari on voleu escriure la funció següent com a part d'un projecte més gran:
EN escriviu una funció per retornar el tipus de triangle en funció del valor de la longitud dels 3 costats d'un triangle. Fem-ho una mica més fàcil assumint que la prova per al tipus de dades d'entrada ja està al seu lloc, de manera que només rebeu valors numèrics per treballar.
c estructura en estructura
La situació sembla fàcil. Continueu i escriviu la funció que s'assembla a això:
Algorisme:
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
Després de completar la funció, se us donen un parell d'afirmacions per dur a terme. I, per a la vostra sorpresa, trobeu que només van passar el 50% dels casos.
Vegem les declaracions de la prova. Els que passen són:
1. Afirma si (String_toLowerCase(triangle_type(678))==triangle escalar) = Correcte
2. Afirma si (String_toLowerCase(triangle_type(666))==triangle equilàter) = Correcte
3. assert(String_toLowerCase(triangle_type(676))==triangle isòsceles) = Correcte
Doncs les coses es veuen bé fins aquí. Però els que fallen són:
4. Afirma si (String_toLowerCase(triangle_type(000))==no és un triangle) = Incorrecte
5. Afirma si (String_toLowerCase(triangle_type(-6-7-8))==no és un triangle) = Incorrecte
6. Afirma si (String_toLowerCase(triangle_type(528))==no és un triangle) = Incorrecte
- En el 4t els valors d'entrada de la instrucció són (000). Ara sabem que (000) formen un punt i no un triangle. De fet, si qualsevol valor d'entrada és zero, el triangle no és possible. Però en el nostre cas tornarà un triangle equilàter!
- També el 5è afirmació ens recorda que la longitud mai pot ser un valor negatiu. Veus una escala de -30 cm de llarg. Així, si tenim fins i tot un valor -ve de longitud, el triangle no és possible. Però en el nostre cas, depenent del valor, pot tornar qualsevol dels 3 resultats. Aquí retorna un escalar.
- Ara què passa amb el 6è declaració. Tots els valors són >= 0 i segurament és un triangle escalar. O ho és? Recordeu la regla que en un triangle la suma de 2 costats qualsevol és sempre més gran o igual que el tercer.
Aquí ho veiem per:
8 + 2 > 5
8 + 5 > 2
5 + 2 > 8
Sortida:
com centrar una imatge en CSS
True
True
False
Falla la prova de triangularitat. Per tant, les longituds (258) no formen un triangle.
Per tant, el que necessitem és una mena de validació de triangle que ens indiqui si el que tenim és fins i tot un triangle o no. Com a part de la solució, escriviu una altra funció que sembla:
Algorisme:
Carpeta de canvi de nom de Linux
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
La nostra funció anterior ara inclou 2 línies addicionals al principi i wola! totes les proves estan passant ara.
Aquest és només un exemple d'escenari senzill per recordar-nos que quan escrivim codi de nivell de producció hem de tenir cura fins i tot amb coses senzilles. Tenint en compte els casos extrems senzills i comprovant amb casos de cadena uniformes, hem augmentat la nostra cobertura de proves i hem fet que el nostre programa torni resultats més matemàticament correctes.
A continuació es mostra la implementació de l'enfocament anterior:
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');
El programa anterior, quan es prova amb les afirmacions comentades abans, passarà ara els casos de prova.
A la indústria, s'anomena "desenvolupament basat en proves" com a "desenvolupament basat en proves". Aquest bloc és només una visió del que significa TDD a la pràctica.