![Page 1: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/1.jpg)
¿En qué la estamos regando en pruebas de software?
Agustín Ramos @MachinesAreUs
![Page 2: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/2.jpg)
¿Cuántas pruebas necesita ésta función?
function partition(items, left, right) { var pivot = items[Math.floor((right + left) / 2)], i = left, j = right; while (i <= j) { while (items[i] < pivot) { i++; } while (items[j] > pivot) { j—; } if (i <= j) { swap(items, i, j); i++; j--; } } return i; }
![Page 3: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/3.jpg)
function partition(items, left, right) { var pivot = items[Math.floor((right + left) / 2)], i = left, j = right; while (i <= j) { while (items[i] < pivot) { i++; } while (items[j] > pivot) { j—; } if (i <= j) { swap(items, i, j); i++; j--; } } return i; }
¿Cuántos tipos de pruebas necesita esta función?
![Page 4: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/4.jpg)
¿Cuántos tipos de pruebas necesita esta función?
Valores en rangos esperados
Condiciones de frontera.
Valores no esperados (e.g. nulos)
Combinaciones de los anteriores
Valores que ejerciten las distintas rutas.
![Page 5: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/5.jpg)
¿Cuántas rutas de ejecución tiene este programa?
function partition(items, left, right) { var pivot = items[Math.floor((right + left) / 2)], i = left, j = right; while (i <= j) { while (items[i] < pivot) { i++; } while (items[j] > pivot) { j—; } if (i <= j) { swap(items, i, j); i++; j--; } } return i; }
![Page 6: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/6.jpg)
Complejidad CiclomáticaMétrica.
Thomas J. McCabe, 1976
Mide el número de rutas de ejecución linealmente independientes dentro de un programa.
Formalmente M = E − N + 2P
Aproximador: 2^N - 1 donde N es el número de bifurcaciones en el código (bloques if, where, for, etc.)
![Page 7: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/7.jpg)
Entonces… ¿Cuándo vas a acabar de probar?
![Page 8: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/8.jpg)
Para empezar… ¿Cómo sabes que has probado lo
suficiente?
![Page 9: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/9.jpg)
¿Cobertura?
![Page 10: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/10.jpg)
Cobertura“Tenemos cobertura a nivel de código superior al 90%,
lo cual es indicador de nuestro alto nivel de calidad”
![Page 11: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/11.jpg)
¿Cobertura?
Una línea de código que está “cubierta” (se ha ejecutado durante una prueba) no me dice nada del contexto en el cual se ejecutó (e.g. los parámetros de entrada de la función, el número de iteración si se encuentra dentro de un bloque, etc), y por lo tanto
no me dice que no puede fallar o tener un comportamiento distinto en un contexto distinto.
![Page 12: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/12.jpg)
¡A trabajar!
![Page 13: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/13.jpg)
Data Driven Testing (DDT)
![Page 14: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/14.jpg)
Data Driven Testing
Same test
Many input/output pairs.
Test
![Page 15: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/15.jpg)
DDT en CucumberFeature: Addition I want to be told the sum of two numbers ! Scenario Outline: Add two numbers Given I have entered <input_1> into the calculator And I have entered <input_2> into the calculator When I press <button> Then the result should be <output> on the screen ! Examples: | input_1 | input_2 | button | output | | 20 | 30 | add | 50 | | 2 | 5 | add | 7 | | 0 | 40 | add | 40 |
![Page 16: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/16.jpg)
DDT en Spock
class HelloSpock extends spock.lang.Specification { def "length of Spock's and his friends' names"() { expect: name.size() == length ! where: name | length "Spock" | 5 "Kirk" | 4 "Scotty" | 6 } }
![Page 17: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/17.jpg)
¿De dónde salen los casos?
A mano.
En general, no acabas.
¿Cómo sabes que son suficientes?
¡Son solo los que se te ocurren!
Generación automatizada.
Random.
¿Cómo sabes que son suficientes?
Todas las posibles combinaciones de entradas/condiciones…
![Page 18: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/18.jpg)
¿Cuál es el P.E.X?
Explosión combinatorial
![Page 19: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/19.jpg)
N-wise testing
![Page 20: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/20.jpg)
Pairwise testing
“Pairwise (a.k.a. all-pairs) testing is an effective test case generation technique that is based on the observation that most faults are caused by interactions of at
most two factors. Pairwise-generated test suites cover all combinations of two therefore are much smaller than
exhaustive ones yet still very effective in finding defects.”
http://www.pairwise.org/
most ~ > 90 %
![Page 22: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/22.jpg)
Pairwise Testing
Pairwise Testing In The Real World
![Page 23: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/23.jpg)
Pruebas Basadas en Riesgos
![Page 24: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/24.jpg)
Pruebas Basadas en Riesgos
Dados recursos finitos ¿cómo escoger qué probar más y qué menos?
Estrategia:
Objetivo: Encontrar los defectos más importantes tan pronto como sea posible y con el menor costo.
No hay riesgo => No hay pruebas.
Decisión de negocio
![Page 25: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/25.jpg)
¿Qué es el Riesgo?
!
![Page 26: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/26.jpg)
Pruebas Basadas en Riesgos
La fórmula
R(f) = P(f) * C(f)
R(f) - Riesgo calculado de la función f
P(f) - Probabilidad de falla de la función f
C(f) - Costo de falla de la función f
![Page 27: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/27.jpg)
Análisis de Riesgos + Pruebas
!
![Page 28: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/28.jpg)
Pruebas Basadas en Riesgos
Formulación original (James Bach):
http://www.satisfice.com/articles/hrbt.pdf
Presentación (con más tips):
http://www.cs.tut.fi/tapahtumat/testaus04/schaefer.pdf
![Page 29: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/29.jpg)
Property-Based Testing
![Page 30: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/30.jpg)
Property-Based Testing
Si tenemos una función
reverse :: String -> String
Entonces una propiedad puede definirse como:
reverse (reverse xs) == xs
Y podemos permitir que herramientas como QuickCheck generen “aleatoriamente" ejemplos de xs y verifiquen que estos ejemplos cumplan con la propiedad
![Page 31: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/31.jpg)
Property Based … +
PairWise Testing?
![Page 32: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/32.jpg)
Complexity Brings More Complexity
![Page 33: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/33.jpg)
… and “More is Different”Phillip Anderson
Science, Vol. 177, No. 4047, 1972
![Page 34: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/34.jpg)
Test me M@#3rfvkc3R
Test this M@+3rfükC3r !
![Page 35: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/35.jpg)
Architecture Testing
![Page 36: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/36.jpg)
Testing /= Checking !
http://www.developsense.com/blog/2009/08/testing-vs-checking/
![Page 37: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/37.jpg)
Test Data Generation !
https://gist.github.com/MachinesAreUs/d236e9ca726dd554dad0
![Page 38: ¿En qué la estamos regando en pruebas de software?](https://reader033.vdocumento.com/reader033/viewer/2022052822/554dd713b4c905d10e8b4d40/html5/thumbnails/38.jpg)