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