Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Property Based Testing usando QuickCheck

468 views

Published on

Slides from the talk on testing.uy conference April 2015.

Published in: Software
  • Be the first to comment

  • Be the first to like this

Property Based Testing usando QuickCheck

  1. 1. Property Based Testing (También conocido como Generative Testing) @guilespi
  2. 2. Guillermo Winkler
  3. 3. Guillermo Winkler Ingeniero
  4. 4. Programador Guillermo Winkler Ingeniero
  5. 5. Programador Tester Guillermo Winkler Ingeniero
  6. 6. Property Based Testing O Cómo no escribir mas Unit Tests
  7. 7. Property Based Testing O Cómo no escribir mas Unit Tests
  8. 8. Types vs. Tests
  9. 9. Cuál es la mejor forma de demostrar que nuestros sistemas son correctos? (O sea que hacen lo que tienen que hacer)
  10. 10. Cuál es la mejor forma de demostrar que nuestros sistemas son correctos? (O sea que hacen lo que tienen que hacer)
  11. 11. Types • Sirven como parte de la especificación • Ayudan durante el diseño • Ayudan a capturar requerimientos
  12. 12. Tests • Sirven como parte de la especificación • Sirven como “comentarios ejecutables” • Ayudan durante el diseño • Ayudan a capturar requerimientos
  13. 13. Una lista de timestamps en Scala
  14. 14. Un loop en Ruby
  15. 15. 
 
 “Program testing can be used to show the presence of bugs, but never to show their absence” Edsger Dijkstra
  16. 16. double f1(int x) { return 1/x; }
  17. 17. @Test public void testUnity() { assertEquals(1, f1(1)); }
  18. 18. @Test public void testUnity() { assertEquals(1, f1(1)); } 100% code coverage! double f1(int x) { return 1/x; }
  19. 19. Patch
  20. 20. Quién se morfo el unit test?
  21. 21. 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
  22. 22. Un programa en C con 6 enteros tiene más estados posibles que átomos hay en el planeta…
  23. 23. Un programa en C con 6 enteros tiene más estados posibles que átomos hay en el planeta… ?
  24. 24. 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
  25. 25. Definir propiedades que tiene que cumplir nuestro sistema para cierto dominio de valores. Property based testing
  26. 26. Poner al sistema en la mayor cantidad de estados posibles Property based testing
  27. 27. Precisamos generar valores(De ahí lo de generative testing)
  28. 28. 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)
  29. 29. 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
  30. 30. 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]);
  31. 31. En un array ordenado el primer elemento es siempre menor que el último. Cómo se define una propiedad? Ejemplo:
  32. 32. 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:
  33. 33. 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
  34. 34. 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…
  35. 35. 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…
  36. 36. 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…
  37. 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 Validar que la propiedad se cumple…
  38. 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 Ejecutar 10 casos…
  39. 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
  40. 40. => {:result false, :failing-size 0, :num-tests 1, :fail [[3]], :shrunk {:total-nodes-visited 5, :depth 2, :result false, :smallest [[0]]}}
  41. 41. Shrinking
  42. 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]]}}
  43. 43. (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))))
  44. 44. (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))))
  45. 45. Shrink Tree
  46. 46. http://www.slideshare.net/PhilipKoopman/toyota-unintended-acceleration
  47. 47. http://www.quviq.com/volvo-quickcheck/
  48. 48. 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

×