Només tornem a comprovar funcionalitats del passat quan entrem en mode paranoid.
Sindrome del ‘no ho toquis’
I les UI?
Clickem i clickem fins que peta
Itineraris de proves
Molt feixuc
Automatització
Evitem la validació manual
Permet executar els testos moltes vegades
Evitem regresions, ens envalentona
Frameworks: unittest, nose, pytest, jest, mamba…
Com automatitzar
Fem codi que:
Construeixi la situació de test (fixture)
Comprobi que el resultat és l’esperat
Només ens alerti si no ho és
Si el test és codi, ¿qui testeja el codi de test?
Si el test és codi, caldrà mantenir-ho
Abans o després?
Automatitzar un test quan el codi ja funciona:
Fa mandra, ja funciona
Com sabem que el test funciona?
Si fem el test quan la funcionalitat encara no hi és, estarem comprovant que realment ho detecta.
Per codi antic, que volem cobrir, hi ha estratègies.
Els mantras
Red - Green - Refactor
SetUp - Exercise - Assert - TearDown
Duplicate - Fill - Relay - Clean
Ordre del matí
Tipus de testos
TDD
Trobant els casos
Escrivint testos
Refactoritzant
Solucionant pollos
Tipus de testos
Validació
Test supervisats:
Un humà ha de validar que els resultats son bons
Test automatitzats:
L’ordinador fa la validació
Tests amb referència validada:
Es comprova la sortida del cas la primera vegada y cada cop que canvia el comportament
Transparència
Com de conscients som dels detalls de la implementació quan escrivim el test?
Testos de caixa negra
Testos de caixa grisa
Testos de caixa blanca
Abast (I)
Unitaris vs Funcionals
Component vs Integració
Integració Bottom-up vs Big bang
Important: Els testos d’integració no han de testejar tots els casos dels components només que es delega de forma correcta en els components.
Abast (II)
Aceptació: El que fa l’usuari per donar-ho per bó
Extrem a extrem: Integración total del sistema en entorn realístic
Desplegament: Els que es fan en posar a producció
Smoke: Arrenca, respon… molt ràpids.
Sanity: Els canvis aplicats hi son
Motivació
Per què l’afegeixes?
De progressió: comprova noves funcionalitats
De regresió: quan els seguim executant
De correccio: per aillar un bug detectat
Exploratori: com funciona un codi de tercers?
Cas d’ús
Test de camí daurat:
Comprova la condició d’èxit principal
Test d’extensió:
Comprova una condició d’èxit divergent
Test de fallada:
Comprova una condició de fallada
Segons si cal executar
Dinàmics:
Necessiten executar el codi per fer la comprovació
Estàtics:
Testos que es fan analitzant el codi no executant-ho
Test no funcionals
Comprova requeriments no funcionals:
Usabilitat
Accessibilitat
Compatibilitat
Eficiencia
Seguretat
Rendiment
Test de rendiment
Test de Volum
funciona per tots els tamanys de dades?
Test de Càrrega
funciona per tots els nivells d’us?
Test d’Escalabilitat
s’agafa més recursos quan cal?
Test de Pic
respon be a pics alts puntuals?
Test d’Estress
quin és el límit operacional?
Test de Remull
es degrada mantenint la càrrega un bon temps?
Test de Seguretat
Test de Penetració
El fan els white hat hackers seguint els seus propis procediments
Test de Vulnerabilitat
Cerca de vulnerabilitats conegudes o típiques
TDD
Red-Green-Refactor
Red: Fem un test que falli
Green: Fem lo minim per que passi ràpid
Refactor: Millorem el codi, reduint entropia i preparant per seguent red
Red
Escrivim un nou test que falli
ens fa pensar en la interfície primer
les pensem des del test, interfícies testables
donarà errors (ERROR) fins que creem classes i mètodes buits fins arribar a la fallada (FAIL)
el FAIL és el test del test, obligatori!!
Criteri de limitació:
si no podem fer que el test falli, no calia fer-lo
Green
Fem lo minim per que passi ràpid
No ens preocupa si el codi és correcte
Si no ho podem fer rapid,
tirem enrera el red i refactoritzem per facilitar-ho
o plantejem un altre test més assequible
Molta cura de no afegir funcionalitat no coberta
Refactor
Millorem el codi
No afegim funcionalitat
Reduim entropia i duplicació al codi
O fem espai per la pròxima funcionalitat
Es poden fer diversos abans del seguent Red
Passem els testos a cada canvi
Trobant casos de test
Quan hem testejat prou?
Llei del retorn decreixent.
Compte, no son gratis, si fem masses testos…
Costa implementar-los
Costa mantenir-los
L’execució dels testos triga més
Afegirem només casos que aportin quelcom
Técniques
Montecarlo
Generació aleatoria de casos
(casos petits? casinos?)
Anàlisi de fluxe
Branch testing
cada cami al codi un test
Test de cobertura
eina que detecta codi no exercitat pels testos
Anàlisi domini d’entrada
Valors frontera
A banda i banda d’on canvia el comportament
Particions equivalents
Un cas per partició de comportament equivalent
Montecarlo
És molt difíci donar amb cas de test extrany.
Important: guardar el cas fallat, per reproduir-lo fora del montecarlo
Molt costós d’executar
Hi ha eines per generar-ne
Per definir el domini aleatori, cal un análisi de domini mínim
Ideal per tests de rendiment
Branch testing
Assignar un cas d’us a cada branch de codi if, for…
Compte: No considera comportament divergent per dades quan cridem a terceres funcions o operadors
Exemple: floor(x) vs x//1 amb negatius
Coverage testing
Es fa amb eines d’anàlisi de codi
Serveix per detectar alguns casos no previstos
Al final fas branch testing, amb les seves limitacións.
pip install pytest-covpytest --cov mymodule mymodulecoverage html # to dump an html report at covhtml/coveralls# to publish in [coveralls.io](https://coveralls.io) (for travis.yaml)
Anàlisi de domini d’entrada
Tàndem: Valors frontera + particions equivalents
Un cop definits els valors frontera, generem les particions equivalents
Fem servir els valors frontera com a representants de la partició.
Dos casos son equivalents si tenen el mateix comportament
Escrivint els testos
Estructura d’un test
Comandes i consultes
És práctic tenir els mètodes dividits en
comandes (setters) que modifiquen estat
Els fem servir al setUp, tearDown
consultes (getters) que no alteren l’estat
Els fem servir per l’assert