SlideShare a Scribd company logo
1 of 56
Download to read offline
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

More Related Content

What's hot

Informe tecnico unidad 4
Informe tecnico unidad 4Informe tecnico unidad 4
Informe tecnico unidad 4Irving Che
 
Sincronizar Threads
Sincronizar ThreadsSincronizar Threads
Sincronizar Threadsjubacalo
 
SCJP, Clase 5: Control de Flujo
SCJP, Clase 5: Control de FlujoSCJP, Clase 5: Control de Flujo
SCJP, Clase 5: Control de Flujoflekoso
 
SCJP, Clase 8: Inner Classes
SCJP, Clase 8: Inner ClassesSCJP, Clase 8: Inner Classes
SCJP, Clase 8: Inner Classesflekoso
 
SCJP, Clase 7: Generics
SCJP, Clase 7: GenericsSCJP, Clase 7: Generics
SCJP, Clase 7: Genericsflekoso
 
7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server7090112 Clase Transact Sql Server
7090112 Clase Transact Sql ServerCorfapo
 
SCJP, Clase 3: Asignaciones
SCJP, Clase 3: AsignacionesSCJP, Clase 3: Asignaciones
SCJP, Clase 3: Asignacionesflekoso
 
Workshop iOS 4: Closures, generics & operators
Workshop iOS 4: Closures, generics & operatorsWorkshop iOS 4: Closures, generics & operators
Workshop iOS 4: Closures, generics & operatorsVisual Engineering
 

What's hot (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
 

Viewers also liked

Pedestrian Engineering Article
Pedestrian Engineering ArticlePedestrian Engineering Article
Pedestrian Engineering ArticleMichael Fishman
 
Water Conservation_PeopleAndPollution
Water Conservation_PeopleAndPollutionWater Conservation_PeopleAndPollution
Water Conservation_PeopleAndPollutionyayearth
 
Power Point
Power PointPower Point
Power Pointkara113
 
Sistemas distribuidos observables
Sistemas distribuidos observablesSistemas distribuidos observables
Sistemas distribuidos observablesguillecabeza
 
Boletin 2011
Boletin 2011Boletin 2011
Boletin 2011naxet3
 
Lelylan: story, present and future.
Lelylan: story, present and future.Lelylan: story, present and future.
Lelylan: story, present and future.Andrea Reginato
 

Viewers also liked (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 to 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
 
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 JDBCCarlos Hernando
 
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 unitariosAlberto Perdomo
 
Introducción a JUnit
Introducción a JUnitIntroducción a JUnit
Introducción a JUnitIker Canarias
 
¿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ácticasjaespinmora
 
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptxREVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptxHacheLOrtega
 
Tdd y clean code SG campus
Tdd y clean code SG campusTdd y clean code SG campus
Tdd y clean code SG campusSoftware Guru
 
Unit Testing - Trovit
Unit Testing - TrovitUnit Testing - Trovit
Unit Testing - TrovitJordi Gerona
 
Por que java
Por que javaPor que java
Por que javareivax
 
Ciclos Java - NetsBeans - Algoritmia
Ciclos Java - NetsBeans - AlgoritmiaCiclos Java - NetsBeans - Algoritmia
Ciclos Java - NetsBeans - AlgoritmiaDaniel Gómez
 

Similar to 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
 

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