SlideShare una empresa de Scribd logo
Property Based
Testing
(También conocido como Generative Testing)
@guilespi
Guillermo Winkler
Guillermo Winkler
Ingeniero
Programador
Guillermo Winkler
Ingeniero
Programador
Tester
Guillermo Winkler
Ingeniero
Property Based
Testing
O Cómo no escribir mas Unit Tests
Property Based
Testing
O Cómo no escribir mas Unit Tests
Types vs. Tests
Cuál es la mejor forma de
demostrar que nuestros
sistemas son correctos?
(O sea que hacen lo que tienen que hacer)
Cuál es la mejor forma de
demostrar que nuestros
sistemas son correctos?
(O sea que hacen lo que tienen que hacer)
Types
• Sirven como parte de la especificación
• Ayudan durante el diseño
• Ayudan a capturar requerimientos
Tests
• Sirven como parte de la especificación
• Sirven como “comentarios ejecutables”
• Ayudan durante el diseño
• Ayudan a capturar requerimientos
Una lista de timestamps en
Scala
Un loop en Ruby




“Program testing can be used to show
the presence of bugs, but never to show
their absence”
Edsger Dijkstra
double f1(int x) {
return 1/x;
}
@Test
public void testUnity() {
assertEquals(1, f1(1));
}
@Test
public void testUnity() {
assertEquals(1, f1(1));
}
100% code
coverage!
double f1(int x) {
return 1/x;
}
Patch
Quién se morfo el unit test?
Joe Armstrong
(Erlang)
Átomos en la tierra:
1.33 x 10^50
2^k=10^50
k=50log(10)/log(2)
k=166.09
k/32=5.18https://www.youtube.com/watch?v=lKXe3HUG2l4
Un programa en C con 6 enteros
tiene más estados posibles que
átomos hay en el planeta…
Un programa en C con 6 enteros
tiene más estados posibles que
átomos hay en el planeta…
?
Digital computers are more complex than most things that
people build. They have large numbers of states. Software
systems have orders of magnitude more states than
computers do.
Fred Brooks
No Silver Bullet
Essence and Accidents of Software Engineering
Definir propiedades que tiene
que cumplir nuestro sistema
para cierto dominio de valores.
Property based testing
Poner al sistema en la
mayor cantidad de
estados posibles
Property based testing
Precisamos generar valores(De ahí lo de generative testing)
0 1 1 0 2 -4 0 5 -7 -8 4 5 3 11 -9 -4 6 -5 -3 0
[] [] [1] [1] [] [] [5 6 6 2 0 1] [3 7 5] [2 0 0 6 2 5 8] [9 1 9 3 8 3 5]
Enteros int
Vectores de enteros [int]
() () (false) (false true false) (false true) (false true true true) (true)
(false false true true) () (true)
Listas de booleanos (bool)
{:user-name "kWodcsE2",
:user-id 1,
:email "r2ed3VE@computer.org",
:active? true}
Estructuras compuestas
“hZO*3" “m-W2@KL” ",P+po0#2 “ "tlt^[ ui`V"
Alfanuméricos (string)
QuickCheck
• C
• C++
• Chicken Scheme
• Clojure
• Common Lisp
• D
• Elm
• Erlang
• F#
• Factor
• Io
• Java
• Javascript
• Node.js
• Objective-C
• OCaml
• Perl
• Prolog
• Python
• R
• Ruby
• Scala
• Scheme
• Smalltalk
• Standard ML
function sort(values) {
var length = values.length - 1;
do {
var swapped = false;
for(var i = 0; i < length; ++i) {
if (values[i] > values[i+1]) {
var temp = values[i];
values[i] = values[i+1];
values[i+1] = temp;
swapped = true;
}
}
}
while(swapped == true)
};
sort([7, 4, 5, 2, 9, 1]);
En un array ordenado el primer elemento
es siempre menor que el último.
Cómo se define una
propiedad?
Ejemplo:
En un array ordenado el primer elemento
es siempre menor que el último.
Cómo se define una
propiedad?
Promueve una visión de más alto nivel con
restricciones que se deben satisfacer de manera
universal.
Ejemplo:
JSC.reps(10);
JSC.test(
"First is lower than last after sort",
function (verdict, v) {
var sorted = v.sort();
return verdict(sorted[0] < sorted[sorted.length - 1]);
},
[
JSC.array([JSC.integer()]])
]
);
(def prop-sorted-first-less-than-last
(prop/for-all [v (gen/vector gen/int)]
(let [s (sort v)]
(< (first s) (last s)))))
(tc/quick-check 10 prop-sorted-first-less-than-last)
Javascript
Clojure
JSC.reps(10);
JSC.test(
"First is lower than last after sort",
function (verdict, v) {
var sorted = v.sort();
return verdict(sorted[0] < sorted[sorted.length - 1]);
},
[
JSC.array([JSC.integer()]])
]
);
(def prop-sorted-first-less-than-last
(prop/for-all [v (gen/vector gen/int)]
(let [s (sort v)]
(< (first s) (last s)))))
(tc/quick-check 10 prop-sorted-first-less-than-last)
Javascript
Clojure
Un nombre para la propiedad…
JSC.reps(10);
JSC.test(
"First is lower than last after sort",
function (verdict, v) {
var sorted = v.sort();
return verdict(sorted[0] < sorted[sorted.length - 1]);
},
[
JSC.array([JSC.integer()]])
]
);
(def prop-sorted-first-less-than-last
(prop/for-all [v (gen/vector gen/int)]
(let [s (sort v)]
(< (first s) (last s)))))
(tc/quick-check 10 prop-sorted-first-less-than-last)
Javascript
Clojure
Un generador de valores
para la función a testear…
JSC.reps(10);
JSC.test(
"First is lower than last after sort",
function (verdict, v) {
var sorted = v.sort();
return verdict(sorted[0] < sorted[sorted.length - 1]);
},
[
JSC.array([JSC.integer()]])
]
);
(def prop-sorted-first-less-than-last
(prop/for-all [v (gen/vector gen/int)]
(let [s (sort v)]
(< (first s) (last s)))))
(tc/quick-check 10 prop-sorted-first-less-than-last)
Javascript
Clojure
Invocar a la función para el
valor generado…
JSC.reps(10);
JSC.test(
"First is lower than last after sort",
function (verdict, v) {
var sorted = v.sort();
return verdict(sorted[0] < sorted[sorted.length - 1]);
},
[
JSC.array([JSC.integer()]])
]
);
(def prop-sorted-first-less-than-last
(prop/for-all [v (gen/vector gen/int)]
(let [s (sort v)]
(< (first s) (last s)))))
(tc/quick-check 10 prop-sorted-first-less-than-last)
Javascript
Clojure
Validar que la propiedad
se cumple…
JSC.reps(10);
JSC.test(
"First is lower than last after sort",
function (verdict, v) {
var sorted = v.sort();
return verdict(sorted[0] < sorted[sorted.length - 1]);
},
[
JSC.array([JSC.integer()]])
]
);
(def prop-sorted-first-less-than-last
(prop/for-all [v (gen/vector gen/int)]
(let [s (sort v)]
(< (first s) (last s)))))
(tc/quick-check 10 prop-sorted-first-less-than-last)
Javascript
Clojure
Ejecutar 10 casos…
JSC.reps(10);
JSC.test(
"First is lower than last after sort",
function (verdict, v) {
var sorted = v.sort();
return verdict(sorted[0] < sorted[sorted.length - 1]);
},
[
JSC.array([JSC.integer()]])
]
);
(def prop-sorted-first-less-than-last
(prop/for-all [v (gen/vector gen/int)]
(let [s (sort v)]
(< (first s) (last s)))))
(tc/quick-check 10 prop-sorted-first-less-than-last)
Javascript
Clojure
=> {:result false,
:failing-size 0,
:num-tests 1,
:fail [[3]],
:shrunk {:total-nodes-visited 5,
:depth 2,
:result false,
:smallest [[0]]}}
Shrinking
(def prop-no-42
(prop/for-all [v (gen/vector gen/int)]
(not (some #{42} v))))
(tc/quick-check 100 prop-no-42)
;; => {:result false,
:failing-size 45,
:num-tests 46,
:fail [[10 1 28 40 11 -33 42 -42 39 -13 13
-44 -36 11 27 -42 4 21 -39]],
:shrunk {:total-nodes-visited 38,
:depth 18,
:result false,
:smallest [[42]]}}
(tc/quick-check 100 prop-no-42)
;; => {:result false,
:failing-size 45,
:num-tests 46,
:fail [[10 1 28 40 11 -33 42 -42 39 -13 13
-44 -36 11 27 -42 4 21 -39]],
:shrunk {:total-nodes-visited 38,
:depth 18,
:result false,
:smallest [[42]]}}
(def prop-no-42
(prop/for-all [v (gen/vector gen/int)]
(not (some #{42} v))))
(tc/quick-check 100 prop-no-42)
;; => {:result false,
:failing-size 45,
:num-tests 46,
:fail [[10 1 28 40 11 -33 42 -42 39 -13 13
-44 -36 11 27 -42 4 21 -39]],
:shrunk {:total-nodes-visited 38,
:depth 18,
:result false,
:smallest [[42]]}}
(def prop-no-42
(prop/for-all [v (gen/vector gen/int)]
(not (some #{42} v))))
Shrink Tree
http://www.slideshare.net/PhilipKoopman/toyota-unintended-acceleration
http://www.quviq.com/volvo-quickcheck/
Property Based Testing
• Es complementario con unit tests y/o type systems.
• Promueve una visión de más alto nivel sobre las
definiciones en nuestras pruebas.
• Permite poner a nuestro sistema en una cantidad de
estados solo alcanzable de forma computacional.
• Antes que los errores ocurran para prevenir
• Después que ocurran para diagnosticar
Property Based Testing usando QuickCheck

Más contenido relacionado

La actualidad más candente

Interfaces con Java
Interfaces con JavaInterfaces con Java
Interfaces con Java
Alma Mireles Cacique
 
Informe tecnico unidad 4
Informe tecnico unidad 4Informe tecnico unidad 4
Informe tecnico unidad 4
Irving Che
 
Sincronizar Threads
Sincronizar ThreadsSincronizar Threads
Sincronizar Threads
jubacalo
 
Resumen java
Resumen javaResumen java
Resumen java
Emerson Garay
 
Ajax
AjaxAjax
Ajax
ousli07
 
Componentes del E-studio
Componentes del E-studioComponentes del E-studio
Componentes del E-studio
Universidad de Concepcion
 
Pruebas de escritorio con objetos
Pruebas de escritorio con objetosPruebas de escritorio con objetos
Pruebas de escritorio con objetos
Isael Gonzalez Yañez
 
SCJP, Clase 5: Control de Flujo
SCJP, Clase 5: Control de FlujoSCJP, Clase 5: Control de Flujo
SCJP, Clase 5: Control de Flujo
flekoso
 
Documento Margarita
Documento MargaritaDocumento Margarita
Documento Margarita
Carlos Fernando
 
Comandos Java
Comandos JavaComandos Java
Comandos Java
Ricardo Daniel
 
Grails
GrailsGrails
SCJP, Clase 8: Inner Classes
SCJP, Clase 8: Inner ClassesSCJP, Clase 8: Inner Classes
SCJP, Clase 8: Inner Classes
flekoso
 
SCJP, Clase 7: Generics
SCJP, Clase 7: GenericsSCJP, Clase 7: Generics
SCJP, Clase 7: Generics
flekoso
 
Toi Tdd 20080409
Toi Tdd 20080409Toi Tdd 20080409
Toi Tdd 20080409
Jose Manuel Beas
 
Taller interfaz 2
Taller interfaz 2Taller interfaz 2
Taller interfaz 2
Řỉgö VẻGầ
 
Introducción a Groovy
Introducción a GroovyIntroducción a Groovy
Introducción a Groovy
David Santamaria
 
7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server
Corfapo
 
SCJP, Clase 3: Asignaciones
SCJP, Clase 3: AsignacionesSCJP, Clase 3: Asignaciones
SCJP, Clase 3: Asignaciones
flekoso
 
Workshop iOS 4: Closures, generics & operators
Workshop iOS 4: Closures, generics & operatorsWorkshop iOS 4: Closures, generics & operators
Workshop iOS 4: Closures, generics & operators
Visual Engineering
 

La actualidad más candente (19)

Interfaces con Java
Interfaces con JavaInterfaces con Java
Interfaces con Java
 
Informe tecnico unidad 4
Informe tecnico unidad 4Informe tecnico unidad 4
Informe tecnico unidad 4
 
Sincronizar Threads
Sincronizar ThreadsSincronizar Threads
Sincronizar Threads
 
Resumen java
Resumen javaResumen java
Resumen java
 
Ajax
AjaxAjax
Ajax
 
Componentes del E-studio
Componentes del E-studioComponentes del E-studio
Componentes del E-studio
 
Pruebas de escritorio con objetos
Pruebas de escritorio con objetosPruebas de escritorio con objetos
Pruebas de escritorio con objetos
 
SCJP, Clase 5: Control de Flujo
SCJP, Clase 5: Control de FlujoSCJP, Clase 5: Control de Flujo
SCJP, Clase 5: Control de Flujo
 
Documento Margarita
Documento MargaritaDocumento Margarita
Documento Margarita
 
Comandos Java
Comandos JavaComandos Java
Comandos Java
 
Grails
GrailsGrails
Grails
 
SCJP, Clase 8: Inner Classes
SCJP, Clase 8: Inner ClassesSCJP, Clase 8: Inner Classes
SCJP, Clase 8: Inner Classes
 
SCJP, Clase 7: Generics
SCJP, Clase 7: GenericsSCJP, Clase 7: Generics
SCJP, Clase 7: Generics
 
Toi Tdd 20080409
Toi Tdd 20080409Toi Tdd 20080409
Toi Tdd 20080409
 
Taller interfaz 2
Taller interfaz 2Taller interfaz 2
Taller interfaz 2
 
Introducción a Groovy
Introducción a GroovyIntroducción a Groovy
Introducción a Groovy
 
7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server
 
SCJP, Clase 3: Asignaciones
SCJP, Clase 3: AsignacionesSCJP, Clase 3: Asignaciones
SCJP, Clase 3: Asignaciones
 
Workshop iOS 4: Closures, generics & operators
Workshop iOS 4: Closures, generics & operatorsWorkshop iOS 4: Closures, generics & operators
Workshop iOS 4: Closures, generics & operators
 

Destacado

Pedestrian Engineering Article
Pedestrian Engineering ArticlePedestrian Engineering Article
Pedestrian Engineering Article
Michael Fishman
 
Water Conservation_PeopleAndPollution
Water Conservation_PeopleAndPollutionWater Conservation_PeopleAndPollution
Water Conservation_PeopleAndPollution
yayearth
 
Smallpox
SmallpoxSmallpox
Smallpox
Passchendaele
 
Power Point
Power PointPower Point
Power Point
kara113
 
Sistemas distribuidos observables
Sistemas distribuidos observablesSistemas distribuidos observables
Sistemas distribuidos observables
guillecabeza
 
Boletin 2011
Boletin 2011Boletin 2011
Boletin 2011
naxet3
 
Lelylan: story, present and future.
Lelylan: story, present and future.Lelylan: story, present and future.
Lelylan: story, present and future.
Andrea Reginato
 
Areas Of Expertise
Areas Of ExpertiseAreas Of Expertise
Areas Of Expertise
Michael Fishman
 
Mash Your Home Up
Mash Your Home UpMash Your Home Up
Mash Your Home Up
Andrea Reginato
 

Destacado (9)

Pedestrian Engineering Article
Pedestrian Engineering ArticlePedestrian Engineering Article
Pedestrian Engineering Article
 
Water Conservation_PeopleAndPollution
Water Conservation_PeopleAndPollutionWater Conservation_PeopleAndPollution
Water Conservation_PeopleAndPollution
 
Smallpox
SmallpoxSmallpox
Smallpox
 
Power Point
Power PointPower Point
Power Point
 
Sistemas distribuidos observables
Sistemas distribuidos observablesSistemas distribuidos observables
Sistemas distribuidos observables
 
Boletin 2011
Boletin 2011Boletin 2011
Boletin 2011
 
Lelylan: story, present and future.
Lelylan: story, present and future.Lelylan: story, present and future.
Lelylan: story, present and future.
 
Areas Of Expertise
Areas Of ExpertiseAreas Of Expertise
Areas Of Expertise
 
Mash Your Home Up
Mash Your Home UpMash Your Home Up
Mash Your Home Up
 

Similar a Property Based Testing usando QuickCheck

¿En qué la estamos regando en pruebas de software?
¿En qué la estamos regando en pruebas de software?¿En qué la estamos regando en pruebas de software?
¿En qué la estamos regando en pruebas de software?
Agustin Ramos
 
Getting deeper with TPL & async (Spanish version)
Getting deeper with TPL & async (Spanish version)Getting deeper with TPL & async (Spanish version)
Getting deeper with TPL & async (Spanish version)
Iran Reyes Fleitas
 
Clase 7 objetos globales de javaScript
Clase 7 objetos globales de javaScriptClase 7 objetos globales de javaScript
Clase 7 objetos globales de javaScript
José Ricardo Tillero Giménez
 
Bases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBCBases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBC
Carlos Hernando
 
TOminer-1.2
TOminer-1.2TOminer-1.2
TOminer-1.2
Francisco Boato
 
5 c iterative
5 c iterative5 c iterative
5 c iterative
Yulisa Reyes Custodio
 
Curso TDD Ruby on Rails #03: Tests unitarios
Curso TDD Ruby on Rails #03: Tests unitariosCurso TDD Ruby on Rails #03: Tests unitarios
Curso TDD Ruby on Rails #03: Tests unitarios
Alberto Perdomo
 
Testeo y depuración en R
Testeo y depuración en RTesteo y depuración en R
Testeo y depuración en R
Virginia Peón García
 
Introducción a JUnit
Introducción a JUnitIntroducción a JUnit
Introducción a JUnit
Iker Canarias
 
Secure txscalacsharp
Secure txscalacsharpSecure txscalacsharp
Secure txscalacsharp
Alvaro Rodriguez
 
¿Cómo mantener tu javascript?: Buenas prácticas
¿Cómo mantener tu javascript?: Buenas prácticas¿Cómo mantener tu javascript?: Buenas prácticas
¿Cómo mantener tu javascript?: Buenas prácticas
jaespinmora
 
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptxREVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
HacheLOrtega
 
Tdd y clean code SG campus
Tdd y clean code SG campusTdd y clean code SG campus
Tdd y clean code SG campus
Software Guru
 
Resultset
ResultsetResultset
Unit Testing - Trovit
Unit Testing - TrovitUnit Testing - Trovit
Unit Testing - Trovit
Jordi Gerona
 
Testing 101 con Arquillian
Testing 101 con ArquillianTesting 101 con Arquillian
Testing 101 con Arquillian
Víctor Leonel Orozco López
 
Por que java
Por que javaPor que java
Por que java
reivax
 
Introducción a Scala
Introducción a ScalaIntroducción a Scala
Introducción a Scala
Jose Emilio Labra Gayo
 
Ciclos Java - NetsBeans - Algoritmia
Ciclos Java - NetsBeans - AlgoritmiaCiclos Java - NetsBeans - Algoritmia
Ciclos Java - NetsBeans - Algoritmia
Daniel Gómez
 
Introducción a Clojure
Introducción a ClojureIntroducción a Clojure
Introducción a Clojure
Denis Fuenzalida
 

Similar a Property Based Testing usando QuickCheck (20)

¿En qué la estamos regando en pruebas de software?
¿En qué la estamos regando en pruebas de software?¿En qué la estamos regando en pruebas de software?
¿En qué la estamos regando en pruebas de software?
 
Getting deeper with TPL & async (Spanish version)
Getting deeper with TPL & async (Spanish version)Getting deeper with TPL & async (Spanish version)
Getting deeper with TPL & async (Spanish version)
 
Clase 7 objetos globales de javaScript
Clase 7 objetos globales de javaScriptClase 7 objetos globales de javaScript
Clase 7 objetos globales de javaScript
 
Bases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBCBases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBC
 
TOminer-1.2
TOminer-1.2TOminer-1.2
TOminer-1.2
 
5 c iterative
5 c iterative5 c iterative
5 c iterative
 
Curso TDD Ruby on Rails #03: Tests unitarios
Curso TDD Ruby on Rails #03: Tests unitariosCurso TDD Ruby on Rails #03: Tests unitarios
Curso TDD Ruby on Rails #03: Tests unitarios
 
Testeo y depuración en R
Testeo y depuración en RTesteo y depuración en R
Testeo y depuración en R
 
Introducción a JUnit
Introducción a JUnitIntroducción a JUnit
Introducción a JUnit
 
Secure txscalacsharp
Secure txscalacsharpSecure txscalacsharp
Secure txscalacsharp
 
¿Cómo mantener tu javascript?: Buenas prácticas
¿Cómo mantener tu javascript?: Buenas prácticas¿Cómo mantener tu javascript?: Buenas prácticas
¿Cómo mantener tu javascript?: Buenas prácticas
 
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptxREVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
 
Tdd y clean code SG campus
Tdd y clean code SG campusTdd y clean code SG campus
Tdd y clean code SG campus
 
Resultset
ResultsetResultset
Resultset
 
Unit Testing - Trovit
Unit Testing - TrovitUnit Testing - Trovit
Unit Testing - Trovit
 
Testing 101 con Arquillian
Testing 101 con ArquillianTesting 101 con Arquillian
Testing 101 con Arquillian
 
Por que java
Por que javaPor que java
Por que java
 
Introducción a Scala
Introducción a ScalaIntroducción a Scala
Introducción a Scala
 
Ciclos Java - NetsBeans - Algoritmia
Ciclos Java - NetsBeans - AlgoritmiaCiclos Java - NetsBeans - Algoritmia
Ciclos Java - NetsBeans - Algoritmia
 
Introducción a Clojure
Introducción a ClojureIntroducción a Clojure
Introducción a Clojure
 

Último

Introduccion al Lenguaje de Programación C++
Introduccion al Lenguaje de Programación  C++Introduccion al Lenguaje de Programación  C++
Introduccion al Lenguaje de Programación C++
PaulDelgadoSoto
 
primer manual de nuestra compañía de soporte
primer manual de nuestra compañía de soporteprimer manual de nuestra compañía de soporte
primer manual de nuestra compañía de soporte
eliersin13
 
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
Maria Celeste Trujillo Cruz
 
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptxTARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
dayronfabricioruizmo
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
micarnavaltupatrimon
 
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcelherramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
Eduardo455921
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
micarnavaltupatrimon
 

Último (7)

Introduccion al Lenguaje de Programación C++
Introduccion al Lenguaje de Programación  C++Introduccion al Lenguaje de Programación  C++
Introduccion al Lenguaje de Programación C++
 
primer manual de nuestra compañía de soporte
primer manual de nuestra compañía de soporteprimer manual de nuestra compañía de soporte
primer manual de nuestra compañía de soporte
 
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
 
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptxTARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
 
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcelherramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
 

Property Based Testing usando QuickCheck

  • 1. Property Based Testing (También conocido como Generative Testing) @guilespi
  • 6. Property Based Testing O Cómo no escribir mas Unit Tests
  • 7. Property Based Testing O Cómo no escribir mas Unit Tests
  • 9. Cuál es la mejor forma de demostrar que nuestros sistemas son correctos? (O sea que hacen lo que tienen que hacer)
  • 10. Cuál es la mejor forma de demostrar que nuestros sistemas son correctos? (O sea que hacen lo que tienen que hacer)
  • 11. Types • Sirven como parte de la especificación • Ayudan durante el diseño • Ayudan a capturar requerimientos
  • 12. Tests • Sirven como parte de la especificación • Sirven como “comentarios ejecutables” • Ayudan durante el diseño • Ayudan a capturar requerimientos
  • 13. Una lista de timestamps en Scala
  • 14. Un loop en Ruby
  • 15. 
 
 “Program testing can be used to show the presence of bugs, but never to show their absence” Edsger Dijkstra
  • 16. double f1(int x) { return 1/x; }
  • 17. @Test public void testUnity() { assertEquals(1, f1(1)); }
  • 18. @Test public void testUnity() { assertEquals(1, f1(1)); } 100% code coverage! double f1(int x) { return 1/x; }
  • 19.
  • 20.
  • 21. Patch
  • 22. Quién se morfo el unit test?
  • 23. Joe Armstrong (Erlang) Átomos en la tierra: 1.33 x 10^50 2^k=10^50 k=50log(10)/log(2) k=166.09 k/32=5.18https://www.youtube.com/watch?v=lKXe3HUG2l4
  • 24.
  • 25. Un programa en C con 6 enteros tiene más estados posibles que átomos hay en el planeta…
  • 26. Un programa en C con 6 enteros tiene más estados posibles que átomos hay en el planeta… ?
  • 27.
  • 28. Digital computers are more complex than most things that people build. They have large numbers of states. Software systems have orders of magnitude more states than computers do. Fred Brooks No Silver Bullet Essence and Accidents of Software Engineering
  • 29. Definir propiedades que tiene que cumplir nuestro sistema para cierto dominio de valores. Property based testing
  • 30. Poner al sistema en la mayor cantidad de estados posibles Property based testing
  • 31. Precisamos generar valores(De ahí lo de generative testing)
  • 32. 0 1 1 0 2 -4 0 5 -7 -8 4 5 3 11 -9 -4 6 -5 -3 0 [] [] [1] [1] [] [] [5 6 6 2 0 1] [3 7 5] [2 0 0 6 2 5 8] [9 1 9 3 8 3 5] Enteros int Vectores de enteros [int] () () (false) (false true false) (false true) (false true true true) (true) (false false true true) () (true) Listas de booleanos (bool) {:user-name "kWodcsE2", :user-id 1, :email "r2ed3VE@computer.org", :active? true} Estructuras compuestas “hZO*3" “m-W2@KL” ",P+po0#2 “ "tlt^[ ui`V" Alfanuméricos (string)
  • 33. QuickCheck • C • C++ • Chicken Scheme • Clojure • Common Lisp • D • Elm • Erlang • F# • Factor • Io • Java • Javascript • Node.js • Objective-C • OCaml • Perl • Prolog • Python • R • Ruby • Scala • Scheme • Smalltalk • Standard ML
  • 34. function sort(values) { var length = values.length - 1; do { var swapped = false; for(var i = 0; i < length; ++i) { if (values[i] > values[i+1]) { var temp = values[i]; values[i] = values[i+1]; values[i+1] = temp; swapped = true; } } } while(swapped == true) }; sort([7, 4, 5, 2, 9, 1]);
  • 35. En un array ordenado el primer elemento es siempre menor que el último. Cómo se define una propiedad? Ejemplo:
  • 36. En un array ordenado el primer elemento es siempre menor que el último. Cómo se define una propiedad? Promueve una visión de más alto nivel con restricciones que se deben satisfacer de manera universal. Ejemplo:
  • 37. JSC.reps(10); JSC.test( "First is lower than last after sort", function (verdict, v) { var sorted = v.sort(); return verdict(sorted[0] < sorted[sorted.length - 1]); }, [ JSC.array([JSC.integer()]]) ] ); (def prop-sorted-first-less-than-last (prop/for-all [v (gen/vector gen/int)] (let [s (sort v)] (< (first s) (last s))))) (tc/quick-check 10 prop-sorted-first-less-than-last) Javascript Clojure
  • 38. JSC.reps(10); JSC.test( "First is lower than last after sort", function (verdict, v) { var sorted = v.sort(); return verdict(sorted[0] < sorted[sorted.length - 1]); }, [ JSC.array([JSC.integer()]]) ] ); (def prop-sorted-first-less-than-last (prop/for-all [v (gen/vector gen/int)] (let [s (sort v)] (< (first s) (last s))))) (tc/quick-check 10 prop-sorted-first-less-than-last) Javascript Clojure Un nombre para la propiedad…
  • 39. JSC.reps(10); JSC.test( "First is lower than last after sort", function (verdict, v) { var sorted = v.sort(); return verdict(sorted[0] < sorted[sorted.length - 1]); }, [ JSC.array([JSC.integer()]]) ] ); (def prop-sorted-first-less-than-last (prop/for-all [v (gen/vector gen/int)] (let [s (sort v)] (< (first s) (last s))))) (tc/quick-check 10 prop-sorted-first-less-than-last) Javascript Clojure Un generador de valores para la función a testear…
  • 40. JSC.reps(10); JSC.test( "First is lower than last after sort", function (verdict, v) { var sorted = v.sort(); return verdict(sorted[0] < sorted[sorted.length - 1]); }, [ JSC.array([JSC.integer()]]) ] ); (def prop-sorted-first-less-than-last (prop/for-all [v (gen/vector gen/int)] (let [s (sort v)] (< (first s) (last s))))) (tc/quick-check 10 prop-sorted-first-less-than-last) Javascript Clojure Invocar a la función para el valor generado…
  • 41. JSC.reps(10); JSC.test( "First is lower than last after sort", function (verdict, v) { var sorted = v.sort(); return verdict(sorted[0] < sorted[sorted.length - 1]); }, [ JSC.array([JSC.integer()]]) ] ); (def prop-sorted-first-less-than-last (prop/for-all [v (gen/vector gen/int)] (let [s (sort v)] (< (first s) (last s))))) (tc/quick-check 10 prop-sorted-first-less-than-last) Javascript Clojure Validar que la propiedad se cumple…
  • 42. JSC.reps(10); JSC.test( "First is lower than last after sort", function (verdict, v) { var sorted = v.sort(); return verdict(sorted[0] < sorted[sorted.length - 1]); }, [ JSC.array([JSC.integer()]]) ] ); (def prop-sorted-first-less-than-last (prop/for-all [v (gen/vector gen/int)] (let [s (sort v)] (< (first s) (last s))))) (tc/quick-check 10 prop-sorted-first-less-than-last) Javascript Clojure Ejecutar 10 casos…
  • 43. JSC.reps(10); JSC.test( "First is lower than last after sort", function (verdict, v) { var sorted = v.sort(); return verdict(sorted[0] < sorted[sorted.length - 1]); }, [ JSC.array([JSC.integer()]]) ] ); (def prop-sorted-first-less-than-last (prop/for-all [v (gen/vector gen/int)] (let [s (sort v)] (< (first s) (last s))))) (tc/quick-check 10 prop-sorted-first-less-than-last) Javascript Clojure
  • 44. => {:result false, :failing-size 0, :num-tests 1, :fail [[3]], :shrunk {:total-nodes-visited 5, :depth 2, :result false, :smallest [[0]]}}
  • 46. (def prop-no-42 (prop/for-all [v (gen/vector gen/int)] (not (some #{42} v)))) (tc/quick-check 100 prop-no-42) ;; => {:result false, :failing-size 45, :num-tests 46, :fail [[10 1 28 40 11 -33 42 -42 39 -13 13 -44 -36 11 27 -42 4 21 -39]], :shrunk {:total-nodes-visited 38, :depth 18, :result false, :smallest [[42]]}}
  • 47. (tc/quick-check 100 prop-no-42) ;; => {:result false, :failing-size 45, :num-tests 46, :fail [[10 1 28 40 11 -33 42 -42 39 -13 13 -44 -36 11 27 -42 4 21 -39]], :shrunk {:total-nodes-visited 38, :depth 18, :result false, :smallest [[42]]}} (def prop-no-42 (prop/for-all [v (gen/vector gen/int)] (not (some #{42} v))))
  • 48. (tc/quick-check 100 prop-no-42) ;; => {:result false, :failing-size 45, :num-tests 46, :fail [[10 1 28 40 11 -33 42 -42 39 -13 13 -44 -36 11 27 -42 4 21 -39]], :shrunk {:total-nodes-visited 38, :depth 18, :result false, :smallest [[42]]}} (def prop-no-42 (prop/for-all [v (gen/vector gen/int)] (not (some #{42} v))))
  • 50.
  • 51.
  • 52.
  • 55. Property Based Testing • Es complementario con unit tests y/o type systems. • Promueve una visión de más alto nivel sobre las definiciones en nuestras pruebas. • Permite poner a nuestro sistema en una cantidad de estados solo alcanzable de forma computacional. • Antes que los errores ocurran para prevenir • Después que ocurran para diagnosticar