SlideShare una empresa de Scribd logo
Pairwise & Property-Based Testing
Agustín Ramos
@MachinesAreUs
1 / 37
Así que ya te decidiste a hacer pruebas
automatizadas...
Unitarias
De integración
De aceptación / funcionales
De desempeño
Solo tengo algo que decir...
2 / 37
Yarrrr so cool!
3 / 37
Ya te vi
4 / 37
Algún día...
5 / 37
Tú...
6 / 37
¿Qué dificultades te has encontrado al
implementar pruebas?
Toma su tiempo
Requiere el uso de varios frameworks y técnicas
Aumenta la cantidad de código a escribir *
Hace que el 'build' sea más lento
etc, etc...
7 / 37
¿Y qué pasa si no automatizas pruebas?
Para probar una función/método:
Tengo que levantar toda la aplicación/ambiente
Tengo que seguir el flujo que me lleva a la llamada a mi función/método
Depende de las configuraciones de mi máquina
Ahora imagina... lo mismo para todas
las funciones del sistema
8 / 37
El problema del testing
9 / 37
Ejemplo 1
¿Cuántos diferentes casos de prueba se necesitan para probar ésta interfaz?
10 / 37
Ejemplo 2
¿Cuántos casos de prueba se necesitan para probar ésta función?
functionpartition(items,left,right){
varpivot=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--;
}
}
returni;
}
Javascript Quicksort
11 / 37
Ejemplo 2
¿Cuántos tipos de prueba se necesitan para probar ésta función?
functionpartition(items,left,right){
varpivot=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--;
}
}
returni;
}
12 / 37
Ejemplo 2
¿Cuántos tipos de prueba se necesitan para probar ésta función?
Valores en rangos esperados
Valores no esperados (Indices fuera de rango, nulos)
Condiciones de frontera (arreglo vacío, arreglo de tamaño máximo)
Valores que ejerciten las distintas rutas de ejecución
13 / 37
Ejemplo 2
¿Cuántos rutas de ejecución tiene ésta función?
functionpartition(items,left,right){
varpivot=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--;
}
}
returni;
}
14 / 37
Complejidad Ciclomática
Métrica.
Thomas J. McCabe, 1976
Mide el número de rutas de ejecución linealmente independientes dentro
de un programa.
Aproximador
2^N - 1
N es el número de bifurcaciones en el código (bloques if, where, for, etc.)
15 / 37
Ejemplo 2
¿Cuántos rutas de ejecución tiene ésta función?
functionpartition(items,left,right){
varpivot=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--;
}
}
returni;
}
2^4 = 16
Necesitas 16 distintos casos de prueba, solo para saber que pasaste por todas
las rutas de ejecución posibles
16 / 37
Ojo:
¿Por qué escribir código si no estás seguro
que se debe ejecutar?
17 / 37
Corolario:
Entre menos código escribas y más sencillo
sea, es más fácil saber que funciona
18 / 37
El problema
es la explosión combinatorial
19 / 37
El PExC
20 / 37
... y hay quienes además, quieren seguir
haciéndolo a mano.
21 / 37
Pairwise Testing
22 / 37
Pairwise Testing
Idea central:
Es una técnica de generación de casos de prueba que se basa en la
observación de que la mayoría de los defectos (~90%) son
causados por interacciones de a lo más dos factores de prueba.
Con ésta técnica se generan todas las posibles combinaciones de
dos valores distintos para cada factor de prueba y por tanto, las
suites de pruebas son mucho más pequeñas que las generadas de
manera exhaustiva y aún así son muy efectivas para encontrar
defectos.
23 / 37
Ejemplo
Tienes que probar un componente web que debe correr en distintos
navegadores (Chrome y Firefox), distintos sistemas operativos (OSX, Linux,
Windows) y con diferentes capacidades de memoria de video (500Mb y 1Gb).
¿Cuántas posibles configuraciones tienes que probar?
Con pairwise testing son 6
Browser OS Video Memory
Chrome Windows 500Mb
Chrome Linux 1Gb
Chrome OSX 1Gb
Firefox Windows 1Gb
Firefox Linux 500Mb
Firefox OSX 500Mb
24 / 37
Pairwise testing vs Exhaustive testing
Pairwise Testing in the Real World
25 / 37
Property Based Testing
26 / 37
Property Based Testing
Es una técnica complementaria a unit testing.
La idea es especificar un conjunto de propiedades que siempre se deben
cumplir (invariantes).
El framework (QuickCheck) genera un conjunto de ejemplos 'aleatorios'
contra los cuales probar si la propiedad se cumple o no.
Si encuentra un ejemplo que invalida la propiedad, trata de reducirlo a su
mínima expresión.
27 / 37
Quick Check - Ejemplo 1
Vamos a verificar si una función que implementa el reverso de una cadena
cumple ciertas propiedades.
Propiedad 1: El reverso del reverso de una cadena, es la misma cadena.
ghci>quickCheck(s->reverse(reverses)==s)
+++OK,passed100tests.
Propiedad 2: El reverso de una cadena, tiene la misma longitud que la cadena
original.
ghci>quickCheck(s->length(reverses)==lengths)
+++OK,passed100tests.
Propiedad 3: El reverso de una cadena palíndroma, es la misma cadena.
ghci>quickCheck(s->isPalindromes==>reverses==s)
+++OK,passed100tests.
28 / 37
Quick Check - Ejemplo 2
La siguiente máquina de estados acepta todas las cadenas cuyo número de 0
es par.
La función 'decide' decide si el autómata acepta la cadena o no. Ejemplos:
decide"00100"==True
decide"00110"==False
29 / 37
Quick Check - Ejemplo 2
Propiedad 1: decidedebe regresar solo Trueo False.
ghci>quickCheck(s->decides`elem`[True,False])
+++OK,passed100tests.
Propiedad 2: decidesólo acepta cadenas con un númpero par de 0's.
ghci>quickCheck(s->isEvenZeross==decides)
+++OK,passed100tests.
Y... ¿si quiero probar 10,000 casos?
ghci>letdeepCheckp=quickCheckWith(stdArgs{maxSuccess=10000})p
ghci>deepCheck(s->isEvenZeroess==decides)
+++OK,passed10000tests.
30 / 37
¿Y Java apá ?
Mira mijo...
Hay varios frameworks
Ninguno me gusta
Pero da un vistazo a
Junit Theories
Quickcheck
Y si eres más atrevido, prueba ScalaCheck
31 / 37
JUnit Theories 1/2
@Theory
publicvoidmultiplyIsInverseOfDivideWithInlineDataPoints(
@Between(first=-100,last=100)intamount,
@Between(first=-100,last=100)intm)
{
assumeThat(m,not(0));
assertThat(newDollar(amount).times(m).divideBy(m).getAmount(),is(amount));
}
32 / 37
JUnit Theories 2/2
@Retention(RetentionPolicy.RUNTIME)
@ParametersSuppliedBy(BetweenSupplier.class)
public@interfaceBetween{
intfirst();
intlast();
}
publicstaticclassBetweenSupplierextendsParameterSupplier{
@Override
publicListgetValues(Objecttest,ParameterSignaturesig){
Betweenannotation=(Between)sig.getSupplierAnnotation();
ArrayListlist=newArrayList();
for(inti=annotation.first();i<=annotation.last();i++)
list.add(i);
returnlist;
}
}
33 / 37
¿Otros lenguajes?
¡Claro!
Google for it!!!
34 / 37
Resúmen
Hacer pruebas es difícil
Si no las haces... tabla
Si no las automatizas... tabla
Hacer buenas pruebas es aún más difícil
Si no estudias y te aplicas... tabla
¡pero no hay de otra!
Salvo vivir en la incertidumbre...
35 / 37
Más información
Property Based Testing (video by @jessitron)
Pairwise testing (community website)
Combinatorial Software Testing (article)
Better than unit tests (article)
Practical Combinatorial Testing (NIST Report)
36 / 37
¡Happy Testing!
Agustín Ramos
@MachinesAreUs
37 / 37
Pairwise and property based testing
Publicidad

Recomendados

PDF
Sistemas Tolerantes a Fallas
Agustin Ramos
 
PDF
Desarrollo de sistemas tolerantes a fallas
Software Guru
 
PPT
Selección múltiple switch
Gabriel Barboza
 
KEY
Ios.s14
ulcurbegi
 
PPTX
Unidad 5: Excepciones Ejercicio 3
Fabiola Valerio Ramirez
 
PDF
Introduccion a Programacion Reactiva
Andres Almiray
 
PPT
Gestión de errores en Java
eccutpl
 
PDF
Jyoc java-cap12 excepciones
Jyoc X
 
PDF
Jyoc java-cap23 j unit
Jyoc X
 
PDF
Programación Reactiva en Android
Droidcon Spain
 
DOCX
Estructuras de control try catch
jbersosa
 
PPT
Sincronizacion
Stefano Salvatori
 
DOCX
Las excepciones standar
jbersosa
 
PDF
Uso de Excepciones en JAVA
innovalabcun
 
PDF
Workshop iOS 4: Closures, generics & operators
Visual Engineering
 
DOCX
Mas sobre excepciones
jbersosa
 
PDF
Programación Reactiva con RxJava
Paradigma Digital
 
DOCX
Pruebas de aceptación 15 11_2013
dayaorte
 
PPT
5.manejo de excepciones
Santiago Bernal
 
PDF
3 java sesin 3 pps
ajplbe
 
PDF
SCJP, Clase 4: Operadores
flekoso
 
PPTX
Chap 15bpin
Alvaro Pino
 
PPTX
SMA1011_BUBAL_Tipos de comportamiento
xoanGz
 
PDF
SCJP, Clase 5: Control de Flujo
flekoso
 
PPT
Tipos De Comportamiento
SegaAlex
 
PPTX
Mecanismos de exclusion mutua y algoritmos
Abimael hernandez
 
PPT
Javaintroduccion 2010
Carlos_Pazmino
 
PPT
Junit y Jmock
kaolong
 
PDF
¿En qué la estamos regando en pruebas de software?
Agustin Ramos
 
PPT
Unit Testing - Trovit
Jordi Gerona
 

Más contenido relacionado

La actualidad más candente (19)

PDF
Jyoc java-cap23 j unit
Jyoc X
 
PDF
Programación Reactiva en Android
Droidcon Spain
 
DOCX
Estructuras de control try catch
jbersosa
 
PPT
Sincronizacion
Stefano Salvatori
 
DOCX
Las excepciones standar
jbersosa
 
PDF
Uso de Excepciones en JAVA
innovalabcun
 
PDF
Workshop iOS 4: Closures, generics & operators
Visual Engineering
 
DOCX
Mas sobre excepciones
jbersosa
 
PDF
Programación Reactiva con RxJava
Paradigma Digital
 
DOCX
Pruebas de aceptación 15 11_2013
dayaorte
 
PPT
5.manejo de excepciones
Santiago Bernal
 
PDF
3 java sesin 3 pps
ajplbe
 
PDF
SCJP, Clase 4: Operadores
flekoso
 
PPTX
Chap 15bpin
Alvaro Pino
 
PPTX
SMA1011_BUBAL_Tipos de comportamiento
xoanGz
 
PDF
SCJP, Clase 5: Control de Flujo
flekoso
 
PPT
Tipos De Comportamiento
SegaAlex
 
PPTX
Mecanismos de exclusion mutua y algoritmos
Abimael hernandez
 
PPT
Javaintroduccion 2010
Carlos_Pazmino
 
Jyoc java-cap23 j unit
Jyoc X
 
Programación Reactiva en Android
Droidcon Spain
 
Estructuras de control try catch
jbersosa
 
Sincronizacion
Stefano Salvatori
 
Las excepciones standar
jbersosa
 
Uso de Excepciones en JAVA
innovalabcun
 
Workshop iOS 4: Closures, generics & operators
Visual Engineering
 
Mas sobre excepciones
jbersosa
 
Programación Reactiva con RxJava
Paradigma Digital
 
Pruebas de aceptación 15 11_2013
dayaorte
 
5.manejo de excepciones
Santiago Bernal
 
3 java sesin 3 pps
ajplbe
 
SCJP, Clase 4: Operadores
flekoso
 
Chap 15bpin
Alvaro Pino
 
SMA1011_BUBAL_Tipos de comportamiento
xoanGz
 
SCJP, Clase 5: Control de Flujo
flekoso
 
Tipos De Comportamiento
SegaAlex
 
Mecanismos de exclusion mutua y algoritmos
Abimael hernandez
 
Javaintroduccion 2010
Carlos_Pazmino
 

Similar a Pairwise and property based testing (20)

PPT
Junit y Jmock
kaolong
 
PDF
¿En qué la estamos regando en pruebas de software?
Agustin Ramos
 
PPT
Unit Testing - Trovit
Jordi Gerona
 
PDF
U7.resumen.ANALISIS DE LOS ALGORITMOS
LuiS YmAY
 
PDF
Tema 9 pruebas unitarias por gio
Robert Wolf
 
PDF
Actividad 14_ Diseño de Algoritmos Paralelos.pdf
alejandrogomezescoto
 
DOCX
Manuales ...
elidetjc
 
PPT
Unit Testing - GTUG
Jordi Gerona
 
PDF
Qunit CookBook español
shadow_of__soul
 
PPTX
2ª unidad de algoritmo
especialidaddesistemas
 
PPTX
Concurrencia en Java
Pedro Gonzalez
 
PDF
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
Víctor Bolinches
 
PDF
Testing efectivo con pytest
Hector Canto
 
PPTX
Java básico
María Luisa Velasco
 
PDF
Ejercicios3
Rubens Velasco Camacho
 
PPTX
pruebas unitarias unitarias en java con JUNIT
Maricarmen Sánchez Ruiz
 
PPT
Javascript
Daniel Grippo
 
DOCX
métodos procedimimientos estructuras de control java
Henry Upla
 
DOCX
Ingenieria de sw Junit
pattyand89
 
PPT
Sentencia if else
UVM
 
Junit y Jmock
kaolong
 
¿En qué la estamos regando en pruebas de software?
Agustin Ramos
 
Unit Testing - Trovit
Jordi Gerona
 
U7.resumen.ANALISIS DE LOS ALGORITMOS
LuiS YmAY
 
Tema 9 pruebas unitarias por gio
Robert Wolf
 
Actividad 14_ Diseño de Algoritmos Paralelos.pdf
alejandrogomezescoto
 
Manuales ...
elidetjc
 
Unit Testing - GTUG
Jordi Gerona
 
Qunit CookBook español
shadow_of__soul
 
2ª unidad de algoritmo
especialidaddesistemas
 
Concurrencia en Java
Pedro Gonzalez
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
Víctor Bolinches
 
Testing efectivo con pytest
Hector Canto
 
Java básico
María Luisa Velasco
 
pruebas unitarias unitarias en java con JUNIT
Maricarmen Sánchez Ruiz
 
Javascript
Daniel Grippo
 
métodos procedimimientos estructuras de control java
Henry Upla
 
Ingenieria de sw Junit
pattyand89
 
Sentencia if else
UVM
 
Publicidad

Más de Agustin Ramos (13)

PDF
Exploring Elixir Codebases with Archeometer
Agustin Ramos
 
PDF
From Elixir to Akka (and back) - ElixirConf Mx 2017
Agustin Ramos
 
PDF
Programación funcional con haskell
Agustin Ramos
 
PDF
Técnicas basadas en matriz de estructura de diseño
Agustin Ramos
 
KEY
Acercándose a la entrega continua
Agustin Ramos
 
KEY
Modelos de paralelismo y concurrencia
Agustin Ramos
 
PPTX
Arquitecturas que crecen y arquitecturas que no
Agustin Ramos
 
PDF
Arqueología de software
Agustin Ramos
 
PPTX
Hola OSGi
Agustin Ramos
 
PPTX
Desarrollo Dirigido por Comportamiento (con Cucumber y Groovy)
Agustin Ramos
 
PPTX
BDD - Desarrollo dirigido por comportamiento
Agustin Ramos
 
PPTX
La nueva imagen del gurú - El maestro artesano dentro del ingeniero
Agustin Ramos
 
PPTX
Modularización efectiva - domando a la hidra
Agustin Ramos
 
Exploring Elixir Codebases with Archeometer
Agustin Ramos
 
From Elixir to Akka (and back) - ElixirConf Mx 2017
Agustin Ramos
 
Programación funcional con haskell
Agustin Ramos
 
Técnicas basadas en matriz de estructura de diseño
Agustin Ramos
 
Acercándose a la entrega continua
Agustin Ramos
 
Modelos de paralelismo y concurrencia
Agustin Ramos
 
Arquitecturas que crecen y arquitecturas que no
Agustin Ramos
 
Arqueología de software
Agustin Ramos
 
Hola OSGi
Agustin Ramos
 
Desarrollo Dirigido por Comportamiento (con Cucumber y Groovy)
Agustin Ramos
 
BDD - Desarrollo dirigido por comportamiento
Agustin Ramos
 
La nueva imagen del gurú - El maestro artesano dentro del ingeniero
Agustin Ramos
 
Modularización efectiva - domando a la hidra
Agustin Ramos
 
Publicidad

Pairwise and property based testing