Commit eac46c7d authored by jg5dev's avatar jg5dev 💬
Browse files

better

parent 294b7e17
Loading
Loading
Loading
Loading
+15 −1
Changes for src/fonaments/testing.md: 15 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -98,6 +98,18 @@ void withdraw_withSufficientBalance_leavesRemainingBalance() {

Una **asserció** (assertion) és la comprovació que fa fallar la prova quan la condició no es compleix. Una prova pot acabar de tres maneres: passa, **falla** perquè una asserció no s'ha complert, o dona **error** perquè ha saltat una excepció que ningú esperava.

### Quins casos provar

Cap suite no pot provar totes les entrades possibles, així que provar és triar. Els casos d'una funcionalitat es reparteixen en tres grups:

- **Camí feliç** (happy path): l'ús previst, amb dades vàlides i sense res que vagi malament. Retirar 30 d'un compte amb 100.
- **Casos límit** (edge cases): les entrades a la vora d'un canvi de comportament, que és on s'amaguen la major part dels errors. Retirar exactament 100, retirar 0, retirar el valor màxim d'un `int`.
- **Casos d'error**: les entrades que el codi ha de rebutjar, i la manera com les rebutja. Retirar 150 d'un compte amb 100, o una quantitat negativa.

El camí feliç és el que tothom escriu i el que menys informació dona, perquè és el cas que qui programava ja tenia al cap. Els altres dos són els que troben els bugs.

Per trobar els límits sense endevinar-los, es parteix el domini de cada entrada en classes que haurien de comportar-se igual (**particions d'equivalència**) i es prova un valor de cada classe més els que hi ha just a banda i banda de cada frontera (**anàlisi de valors límit**). Per a `withdraw`, les classes són quantitat negativa, zero, entre zero i el saldo, i per sobre del saldo; les fronteres són el zero i el saldo exacte.

### Com anomenar una prova

El nom d'una prova és el que llegeixes quan falla al pipeline, sovint sense el codi al davant. Compara aquests dos:
@@ -233,7 +245,9 @@ Si a la passa 2 continua verda, la prova no travessa el camí que et penses, o l

Quan el que fas és arreglar un bug no cal sabotejar res: escriu la prova abans de la correcció i el vermell te'l dona el bug, com ja hem vist a les [proves de regressió](#proves-de-regressió).

**Deriva els casos del requisit, no de la implementació.** Llegir el codi línia a línia per decidir què provar té dos efectes: copies el comportament que hi ha en lloc del que hi hauria d'haver, i només cobreixes el camí feliç. La branca que falta és invisible precisament perquè falta, i cap lectura del codi te la mostrarà. Els casos límit i d'error surten del requisit, no del `if` que tens al davant.
**El resultat esperat surt del requisit, no del codi.** Llegir el codi línia a línia per decidir què provar té dos efectes: copies el comportament que hi ha en lloc del que hi hauria d'haver, i només cobreixes el [camí feliç](#quins-casos-provar). La branca que falta és invisible precisament perquè falta, i cap lectura del codi te la mostrarà. Els casos límit i d'error surten del requisit, no del `if` que tens al davant.

El que no pot sortir del codi és el **resultat esperat**. Escollir quins casos exercites és una altra decisió, i aquí mirar la implementació és legítim i de vegades imprescindible: una branca que la [cobertura](#cobertura) marca com a no executada, un [mutant](#testing-de-mutacions) que ha sobreviscut, unes claus que col·lideixen a propòsit per veure si una taula de hash degenera, o l'entrellaçat de fils que només saps que existeix perquè has vist on és l'estat compartit. En tots aquests casos el codi et diu on buscar i el requisit continua dient què ha de passar.

El senyal d'alerta és fàcil de reconèixer: si escrius les proves d'un codi ja fet i totes passen a la primera, no has verificat res, has fotografiat el comportament actual.