Un'introduzione allo sviluppo di test drive (TDD)
differenza tra due stringhe di Python
Immagina uno scenario in cui desideri scrivere la seguente funzione come parte di un progetto più ampio:
IN rite una funzione per restituire il tipo di triangolo in base al valore della lunghezza di 3 lati di un triangolo. Rendiamolo un po' più semplice presupponendo che il test per il tipo di dati di input sia già in atto in modo da ricevere solo valori numerici con cui lavorare.
La situazione sembra facile. Vai avanti e scrivi la funzione che assomiglia a questa:
Algoritmo:
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
Dopo aver completato la funzione ti verranno fornite un paio di affermazioni da eseguire. E con tua sorpresa scopri che solo il 50% dei casi è passato.
Diamo un'occhiata alle dichiarazioni di prova. Quelli che passano sono:
1. Assert if (String_toLowerCase(triangle_type(678))==triangolo scalare) = Corretto
2. Assert if (String_toLowerCase(triangle_type(666))==triangolo equilatero) = Corretto
3. assert(String_toLowerCase(triangle_type(676))==triangolo isoscele) = Corretto
Beh, le cose sembrano andare bene fino a qui. Ma quelli che falliscono sono:
4. Assert if (String_toLowerCase(triangle_type(000))==non un triangolo) = Errato
5. Assert if (String_toLowerCase(triangle_type(-6-7-8))==non un triangolo) = Errato
6. Assert if (String_toLowerCase(triangle_type(528))==non un triangolo) = Errato
- Nel 4° i valori di input dell'istruzione sono (000). Ora sappiamo che (000) formano un punto e non un triangolo. Infatti se qualsiasi valore di input è zero il triangolo non è possibile. Ma nel nostro caso restituirà un triangolo equilatero!
- Anche il 5° ci ricorda che la lunghezza non può mai essere un valore negativo. Vedi una scala lunga -30 cm. Quindi se abbiamo anche un valore -ve di lunghezza il triangolo non è possibile. Ma nel nostro caso, a seconda del valore, potrebbe restituire uno qualsiasi dei 3 risultati. Qui restituisce uno scalare.
- Ora che dire del 6° dichiarazione. Tutti i valori sono >= 0 ed è sicuramente un triangolo scalare. Oppure lo è? Ricorda la regola secondo cui in un triangolo la somma di 2 lati è sempre maggiore o uguale al 3°.
Qui vediamo per:
8 + 2 > 5
8 + 5 > 2
5 + 2 > 8
Produzione :
True
True
False
Non supera il test di triangolarità. Quindi le lunghezze (258) non formano un triangolo.
Java comparabile
Quindi ciò di cui abbiamo bisogno è una sorta di convalida del triangolo che ci dica se quello che abbiamo è un triangolo oppure no. Come parte della soluzione scrivi un'altra funzione che assomiglia a:
Algoritmo:
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 funzione precedente ora include 2 righe extra all'inizio e wola! tutti i test stanno passando ora.
Questo è solo un semplice scenario di esempio per ricordarci che quando scriviamo codice a livello di produzione dobbiamo stare attenti anche alle cose semplici. Tenendo a mente i casi limite semplici e controllando con casi di stringa uniformi, abbiamo aumentato la copertura dei test e fatto in modo che il nostro programma restituisse risultati matematicamente più corretti.
Di seguito è riportata l'implementazione dell'approccio di cui sopra:
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');
Il programma di cui sopra, una volta testato sulle asserzioni discusse in precedenza, ora supererà i casi di test.
Nel settore, elaborare casi limite e quindi sviluppare funzioni per assicurarsi che tali casi di test passino è definito "sviluppo basato sui test". Questo blog è solo un assaggio di cosa significa TDD nella pratica.