SlideShare una empresa de Scribd logo
¿En qué la estamos regando
en pruebas de software?
Agustín Ramos
@MachinesAreUs
¿Cuántas pruebas necesita ésta función?
function partition(items, left, right) {
var pivot = 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--;
}
}
return i;
}
¿Cuántos tipos de pruebas necesita esta función?
function partition(items, left, right) {
var pivot = 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--;
}
}
return i;
}
¿Cuántos tipos de pruebas necesita esta función?

Valores en rangos esperados
Condiciones de frontera.
Valores no esperados (e.g. nulos)
Combinaciones de los anteriores
Valores que ejerciten las distintas rutas.
¿Cuántas rutas de ejecución tiene este
programa?
function partition(items, left, right) {
var pivot = 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--;
}
}
return i;
}
Complejidad Ciclomática
Métrica.
Thomas J. McCabe, 1976
Mide el número de rutas de
ejecución linealmente
independientes dentro de un
programa.
Formalmente
M = E − N + 2P
Aproximador: 2^N - 1
donde N es el número de
bifurcaciones en el código (bloques
if, where, for, etc.)
Entonces…
¿Cuándo vas a acabar de probar?
Para empezar…
¿Cómo sabes que has probado lo
suficiente?
¿Cobertura?
Cobertura
“Tenemos cobertura a nivel de código superior al 90%,
lo cual es indicador de nuestro alto nivel de calidad”
¿Cobertura?
Una línea de código que está “cubierta” (se ha
ejecutado durante una prueba) no me dice nada del
contexto en el cual se ejecutó (e.g. los parámetros de
entrada de la función, el número de iteración si se
encuentra dentro de un bloque, etc), y por lo tanto
no me dice que no puede fallar o tener un
comportamiento distinto en un contexto distinto.
¡A trabajar!
Data Driven Testing
(DDT)
Data Driven Testing

Same test
Many input/output
pairs.
Test
DDT en Cucumber
Feature: Addition
I want to be told the sum of two numbers
!
Scenario Outline: Add two numbers
Given I have entered <input_1> into the calculator
And I have entered <input_2> into the calculator
When I press <button>
Then the result should be <output> on the screen
!
Examples:
| input_1 | input_2 | button | output |
| 20
| 30
| add | 50
|
|2
|5
| add | 7
|
|0
| 40
| add | 40
|
DDT en Spock
class HelloSpock extends spock.lang.Specification {
def "length of Spock's and his friends' names"() {
expect:
name.size() == length
!

where:
name | length
"Spock" | 5
"Kirk" | 4
"Scotty" | 6
}
}
¿De dónde salen los casos?
A mano.
En general, no acabas.
¿Cómo sabes que son suficientes?
¡Son solo los que se te ocurren!
Generación automatizada.
Random.
¿Cómo sabes que son suficientes?
Todas las posibles combinaciones de entradas/condiciones…
¿Cuál es el P.E.X?

Explosión combinatorial
N-wise testing
Pairwise testing
“Pairwise (a.k.a. all-pairs) testing is an effective test case
generation technique that is based on the observation
that most faults are caused by interactions of at
most two factors. Pairwise-generated test suites cover all
combinations of two therefore are much smaller than
exhaustive ones yet still very effective in finding defects.”
http://www.pairwise.org/
most ~ > 90 %
Ejemplo de Pairwise Testing

http://www.pairwise.org/tools.asp
Pairwise Testing

Pairwise Testing In The Real World
Pruebas Basadas en Riesgos
Pruebas Basadas en Riesgos
Dados recursos finitos ¿cómo escoger qué probar
más y qué menos?
Estrategia:
Objetivo: Encontrar los defectos más importantes
tan pronto como sea posible y con el menor costo.
No hay riesgo => No hay pruebas.
Decisión de negocio
¿Qué es el Riesgo?

!
Pruebas Basadas en Riesgos
La fórmula
R(f) = P(f) * C(f)
R(f) - Riesgo calculado de la función f
P(f) - Probabilidad de falla de la función f
C(f) - Costo de falla de la función f
Análisis de Riesgos + Pruebas

!
Pruebas Basadas en Riesgos
Formulación original (James Bach):
	 http://www.satisfice.com/articles/hrbt.pdf
Presentación (con más tips):
	 http://www.cs.tut.fi/tapahtumat/testaus04/schaefer.pdf
Property-Based Testing
Property-Based Testing
Si tenemos una función
reverse :: String -> String
Entonces una propiedad puede definirse como:
reverse (reverse xs) == xs
Y podemos permitir que herramientas como
QuickCheck generen “aleatoriamente" ejemplos de xs y
verifiquen que estos ejemplos cumplan con la propiedad
Property Based …
+
PairWise Testing?
Complexity Brings More
Complexity
… and “More is Different”
Phillip Anderson
Science, Vol. 177, No. 4047, 1972
Test me M@#3rfvkc3R

Test this M@+3rfükC3r !
Architecture Testing
Testing /= Checking
!

http://www.developsense.com/blog/2009/08/testing-vschecking/
Test Data Generation
!

https://gist.github.com/MachinesAreUs/
d236e9ca726dd554dad0
¿En qué la estamos regando en pruebas de software?

Más contenido relacionado

La actualidad más candente

Estructuras de control
Estructuras de controlEstructuras de control
Estructuras de control
Veronica Falconi
 
Video 2
Video 2Video 2
Excel - Variables y condicionales
Excel - Variables y condicionalesExcel - Variables y condicionales
Excel - Variables y condicionales
Andres Bedoya Tobon
 
Funciones en C
Funciones en CFunciones en C
Funciones en C
Ronny Parra
 
Programación Algoritmos - Tipos de Datos y Estructuras de Control Básicas
Programación Algoritmos - Tipos de Datos y Estructuras de Control BásicasProgramación Algoritmos - Tipos de Datos y Estructuras de Control Básicas
Programación Algoritmos - Tipos de Datos y Estructuras de Control Básicas
aveas01
 
Metodos en java
Metodos en javaMetodos en java
Metodos en java
Ricardo Garcia
 
Entrada y salida, manejo de cadenas de texto
Entrada y salida, manejo de cadenas de textoEntrada y salida, manejo de cadenas de texto
Entrada y salida, manejo de cadenas de texto
Andres Bedoya Tobon
 
Funciones con vectores c++
Funciones con vectores c++Funciones con vectores c++
Funciones con vectores c++
jose machado
 
Video
VideoVideo
Introducción a las funciones en el lenguaje C
Introducción a las funciones en el lenguaje CIntroducción a las funciones en el lenguaje C
Introducción a las funciones en el lenguaje C
Diego Santimateo
 
Uso de operadores
Uso de operadoresUso de operadores
Uso de operadoresleyohana14
 
Estructuras de control algoritmos
Estructuras de control algoritmosEstructuras de control algoritmos
Estructuras de control algoritmos
Ruby
 
Pseudocódigo apunte segun sea y subrutinas
Pseudocódigo apunte segun sea y subrutinasPseudocódigo apunte segun sea y subrutinas
Pseudocódigo apunte segun sea y subrutinas
Alejandro Canosa
 
Elementos de programacion 02
Elementos de programacion 02Elementos de programacion 02
Elementos de programacion 02
Andres Bedoya Tobon
 
Taller estudio - Estructuras de control VBA - Excel
Taller estudio - Estructuras de control VBA - ExcelTaller estudio - Estructuras de control VBA - Excel
Taller estudio - Estructuras de control VBA - Excel
Andres Bedoya Tobon
 
FUNCIONES EN LENGUAJE C
FUNCIONES EN LENGUAJE CFUNCIONES EN LENGUAJE C
FUNCIONES EN LENGUAJE C
flaquita_dany
 
Sesion 01 funciones y_procedimientos
Sesion 01 funciones y_procedimientosSesion 01 funciones y_procedimientos
Sesion 01 funciones y_procedimientos
Santos Rivera Luján
 
Estructuras de seleccion anidadas
Estructuras de seleccion anidadasEstructuras de seleccion anidadas
Estructuras de seleccion anidadasUVM
 

La actualidad más candente (20)

Estructuras de control
Estructuras de controlEstructuras de control
Estructuras de control
 
Video 2
Video 2Video 2
Video 2
 
Excel - Variables y condicionales
Excel - Variables y condicionalesExcel - Variables y condicionales
Excel - Variables y condicionales
 
Funciones en C
Funciones en CFunciones en C
Funciones en C
 
Programación Algoritmos - Tipos de Datos y Estructuras de Control Básicas
Programación Algoritmos - Tipos de Datos y Estructuras de Control BásicasProgramación Algoritmos - Tipos de Datos y Estructuras de Control Básicas
Programación Algoritmos - Tipos de Datos y Estructuras de Control Básicas
 
Metodos en java
Metodos en javaMetodos en java
Metodos en java
 
Entrada y salida, manejo de cadenas de texto
Entrada y salida, manejo de cadenas de textoEntrada y salida, manejo de cadenas de texto
Entrada y salida, manejo de cadenas de texto
 
Funciones con vectores c++
Funciones con vectores c++Funciones con vectores c++
Funciones con vectores c++
 
Video
VideoVideo
Video
 
Introducción a las funciones en el lenguaje C
Introducción a las funciones en el lenguaje CIntroducción a las funciones en el lenguaje C
Introducción a las funciones en el lenguaje C
 
Uso de operadores
Uso de operadoresUso de operadores
Uso de operadores
 
Estructuras de control algoritmos
Estructuras de control algoritmosEstructuras de control algoritmos
Estructuras de control algoritmos
 
Pseudocódigo apunte segun sea y subrutinas
Pseudocódigo apunte segun sea y subrutinasPseudocódigo apunte segun sea y subrutinas
Pseudocódigo apunte segun sea y subrutinas
 
Elementos de programacion 02
Elementos de programacion 02Elementos de programacion 02
Elementos de programacion 02
 
Presentacion capitulo 6
Presentacion capitulo 6Presentacion capitulo 6
Presentacion capitulo 6
 
Taller estudio - Estructuras de control VBA - Excel
Taller estudio - Estructuras de control VBA - ExcelTaller estudio - Estructuras de control VBA - Excel
Taller estudio - Estructuras de control VBA - Excel
 
FUNCIONES EN LENGUAJE C
FUNCIONES EN LENGUAJE CFUNCIONES EN LENGUAJE C
FUNCIONES EN LENGUAJE C
 
Sesion 01 funciones y_procedimientos
Sesion 01 funciones y_procedimientosSesion 01 funciones y_procedimientos
Sesion 01 funciones y_procedimientos
 
Estructuras de seleccion anidadas
Estructuras de seleccion anidadasEstructuras de seleccion anidadas
Estructuras de seleccion anidadas
 
Acceso al objeto
Acceso al objetoAcceso al objeto
Acceso al objeto
 

Destacado

Diseño caso de pruebas
Diseño caso de pruebasDiseño caso de pruebas
Diseño caso de pruebas
Rocio Camargo Villa
 
Pairwise and property based testing
Pairwise and property based testingPairwise and property based testing
Pairwise and property based testing
Agustin Ramos
 
Sistemas Tolerantes a Fallas
Sistemas Tolerantes a FallasSistemas Tolerantes a Fallas
Sistemas Tolerantes a Fallas
Agustin Ramos
 
La nueva imagen del gurú - El maestro artesano dentro del ingeniero
La nueva imagen del gurú - El maestro artesano dentro del ingenieroLa nueva imagen del gurú - El maestro artesano dentro del ingeniero
La nueva imagen del gurú - El maestro artesano dentro del ingeniero
Agustin Ramos
 
Modularización efectiva - domando a la hidra
Modularización efectiva - domando a la hidraModularización efectiva - domando a la hidra
Modularización efectiva - domando a la hidra
Agustin Ramos
 
Fundamentos de Pruebas de Software - Capítulo 4
Fundamentos de Pruebas de Software - Capítulo 4Fundamentos de Pruebas de Software - Capítulo 4
Fundamentos de Pruebas de Software - Capítulo 4
Professional Testing
 
Pruebas De Software
Pruebas De SoftwarePruebas De Software
Pruebas De Software
aracelij
 

Destacado (7)

Diseño caso de pruebas
Diseño caso de pruebasDiseño caso de pruebas
Diseño caso de pruebas
 
Pairwise and property based testing
Pairwise and property based testingPairwise and property based testing
Pairwise and property based testing
 
Sistemas Tolerantes a Fallas
Sistemas Tolerantes a FallasSistemas Tolerantes a Fallas
Sistemas Tolerantes a Fallas
 
La nueva imagen del gurú - El maestro artesano dentro del ingeniero
La nueva imagen del gurú - El maestro artesano dentro del ingenieroLa nueva imagen del gurú - El maestro artesano dentro del ingeniero
La nueva imagen del gurú - El maestro artesano dentro del ingeniero
 
Modularización efectiva - domando a la hidra
Modularización efectiva - domando a la hidraModularización efectiva - domando a la hidra
Modularización efectiva - domando a la hidra
 
Fundamentos de Pruebas de Software - Capítulo 4
Fundamentos de Pruebas de Software - Capítulo 4Fundamentos de Pruebas de Software - Capítulo 4
Fundamentos de Pruebas de Software - Capítulo 4
 
Pruebas De Software
Pruebas De SoftwarePruebas De Software
Pruebas De Software
 

Similar a ¿En qué la estamos regando en pruebas de software?

software testing
software testingsoftware testing
software testing
Andrés Grosso
 
S9-DAW-2022S1.pptx
S9-DAW-2022S1.pptxS9-DAW-2022S1.pptx
S9-DAW-2022S1.pptx
Luis Fernando Aguas Bucheli
 
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
 
Javascript
JavascriptJavascript
Javascript
Daniel Grippo
 
Charla evento TestingUY 2015 - Property-Based Testing Usando Quickcheck, o có...
Charla evento TestingUY 2015 - Property-Based Testing Usando Quickcheck, o có...Charla evento TestingUY 2015 - Property-Based Testing Usando Quickcheck, o có...
Charla evento TestingUY 2015 - Property-Based Testing Usando Quickcheck, o có...
TestingUy
 
Property Based Testing usando QuickCheck
Property Based Testing usando QuickCheckProperty Based Testing usando QuickCheck
Property Based Testing usando QuickCheck
guillecabeza
 
Mejorar la calidad de los tests con Mutation testing.pdf
Mejorar la calidad de los tests con Mutation testing.pdfMejorar la calidad de los tests con Mutation testing.pdf
Mejorar la calidad de los tests con Mutation testing.pdf
Ismail Ismailov
 
Javascript 1
Javascript 1Javascript 1
Javascript 1Juan C
 
Pruebas de software
Pruebas de softwarePruebas de software
Pruebas de software
Gomez Gomez
 
Insight Brou 2009 11 Encuentro Usr Rational Gur07
Insight Brou 2009 11   Encuentro Usr Rational Gur07Insight Brou 2009 11   Encuentro Usr Rational Gur07
Insight Brou 2009 11 Encuentro Usr Rational Gur07
Irene Pazos Viana
 
Introducción a TDD y PHPUnit
Introducción a TDD y PHPUnitIntroducción a TDD y PHPUnit
Introducción a TDD y PHPUnit
Daniel González Cerviño
 
U7.resumen.ANALISIS DE LOS ALGORITMOS
U7.resumen.ANALISIS DE LOS ALGORITMOSU7.resumen.ANALISIS DE LOS ALGORITMOS
U7.resumen.ANALISIS DE LOS ALGORITMOSLuiS YmAY
 
4 DICIEMBRE.pptx
4 DICIEMBRE.pptx4 DICIEMBRE.pptx
4 DICIEMBRE.pptx
ReynaAlviri1
 
¿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
 
Guía Practica de JavaScript
Guía Practica de JavaScriptGuía Practica de JavaScript
Guía Practica de JavaScript
lissette_torrealba
 
OC_Programación_S2.ppsx
OC_Programación_S2.ppsxOC_Programación_S2.ppsx
OC_Programación_S2.ppsx
DartEstudio
 
Tema 2 - T3: Casos de prueba
Tema 2 - T3:  Casos de pruebaTema 2 - T3:  Casos de prueba
Tema 2 - T3: Casos de prueba
Magemyl Egana
 
Resumen Java Script
Resumen Java ScriptResumen Java Script
Resumen Java Scriptjlgomezri
 
Seminario de Test Development Driven
Seminario de Test Development DrivenSeminario de Test Development Driven
Seminario de Test Development Driven
Paradigma Digital
 

Similar a ¿En qué la estamos regando en pruebas de software? (20)

software testing
software testingsoftware testing
software testing
 
S9-DAW-2022S1.pptx
S9-DAW-2022S1.pptxS9-DAW-2022S1.pptx
S9-DAW-2022S1.pptx
 
Tdd y clean code SG campus
Tdd y clean code SG campusTdd y clean code SG campus
Tdd y clean code SG campus
 
Javascript
JavascriptJavascript
Javascript
 
Charla evento TestingUY 2015 - Property-Based Testing Usando Quickcheck, o có...
Charla evento TestingUY 2015 - Property-Based Testing Usando Quickcheck, o có...Charla evento TestingUY 2015 - Property-Based Testing Usando Quickcheck, o có...
Charla evento TestingUY 2015 - Property-Based Testing Usando Quickcheck, o có...
 
Property Based Testing usando QuickCheck
Property Based Testing usando QuickCheckProperty Based Testing usando QuickCheck
Property Based Testing usando QuickCheck
 
Mejorar la calidad de los tests con Mutation testing.pdf
Mejorar la calidad de los tests con Mutation testing.pdfMejorar la calidad de los tests con Mutation testing.pdf
Mejorar la calidad de los tests con Mutation testing.pdf
 
Javascript 1
Javascript 1Javascript 1
Javascript 1
 
Pruebas de software
Pruebas de softwarePruebas de software
Pruebas de software
 
Insight Brou 2009 11 Encuentro Usr Rational Gur07
Insight Brou 2009 11   Encuentro Usr Rational Gur07Insight Brou 2009 11   Encuentro Usr Rational Gur07
Insight Brou 2009 11 Encuentro Usr Rational Gur07
 
Introducción a TDD y PHPUnit
Introducción a TDD y PHPUnitIntroducción a TDD y PHPUnit
Introducción a TDD y PHPUnit
 
U7.resumen.ANALISIS DE LOS ALGORITMOS
U7.resumen.ANALISIS DE LOS ALGORITMOSU7.resumen.ANALISIS DE LOS ALGORITMOS
U7.resumen.ANALISIS DE LOS ALGORITMOS
 
4 DICIEMBRE.pptx
4 DICIEMBRE.pptx4 DICIEMBRE.pptx
4 DICIEMBRE.pptx
 
¿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
 
Guía Practica de JavaScript
Guía Practica de JavaScriptGuía Practica de JavaScript
Guía Practica de JavaScript
 
OC_Programación_S2.ppsx
OC_Programación_S2.ppsxOC_Programación_S2.ppsx
OC_Programación_S2.ppsx
 
Algoritmos1
Algoritmos1Algoritmos1
Algoritmos1
 
Tema 2 - T3: Casos de prueba
Tema 2 - T3:  Casos de pruebaTema 2 - T3:  Casos de prueba
Tema 2 - T3: Casos de prueba
 
Resumen Java Script
Resumen Java ScriptResumen Java Script
Resumen Java Script
 
Seminario de Test Development Driven
Seminario de Test Development DrivenSeminario de Test Development Driven
Seminario de Test Development Driven
 

Más de Agustin Ramos

Exploring Elixir Codebases with Archeometer
Exploring Elixir Codebases with ArcheometerExploring Elixir Codebases with Archeometer
Exploring Elixir Codebases with Archeometer
Agustin Ramos
 
From Elixir to Akka (and back) - ElixirConf Mx 2017
From Elixir to Akka (and back) - ElixirConf Mx 2017From Elixir to Akka (and back) - ElixirConf Mx 2017
From Elixir to Akka (and back) - ElixirConf Mx 2017
Agustin Ramos
 
Programación funcional con haskell
Programación funcional con haskellProgramación funcional con haskell
Programación funcional con haskell
Agustin Ramos
 
Técnicas basadas en matriz de estructura de diseño
Técnicas basadas en matriz de estructura de diseñoTécnicas basadas en matriz de estructura de diseño
Técnicas basadas en matriz de estructura de diseño
Agustin Ramos
 
Acercándose a la entrega continua
Acercándose a la entrega continuaAcercándose a la entrega continua
Acercándose a la entrega continua
Agustin Ramos
 
Modelos de paralelismo y concurrencia
Modelos de paralelismo y concurrenciaModelos de paralelismo y concurrencia
Modelos de paralelismo y concurrencia
Agustin Ramos
 
Arquitecturas que crecen y arquitecturas que no
Arquitecturas que crecen y arquitecturas que noArquitecturas que crecen y arquitecturas que no
Arquitecturas que crecen y arquitecturas que no
Agustin Ramos
 
Arqueología de software
Arqueología de softwareArqueología de software
Arqueología de software
Agustin Ramos
 
Hola OSGi
Hola OSGiHola OSGi
Hola OSGi
Agustin Ramos
 
Desarrollo Dirigido por Comportamiento (con Cucumber y Groovy)
Desarrollo Dirigido por Comportamiento (con Cucumber y Groovy)Desarrollo Dirigido por Comportamiento (con Cucumber y Groovy)
Desarrollo Dirigido por Comportamiento (con Cucumber y Groovy)
Agustin Ramos
 
BDD - Desarrollo dirigido por comportamiento
BDD - Desarrollo dirigido por comportamientoBDD - Desarrollo dirigido por comportamiento
BDD - Desarrollo dirigido por comportamientoAgustin Ramos
 

Más de Agustin Ramos (11)

Exploring Elixir Codebases with Archeometer
Exploring Elixir Codebases with ArcheometerExploring Elixir Codebases with Archeometer
Exploring Elixir Codebases with Archeometer
 
From Elixir to Akka (and back) - ElixirConf Mx 2017
From Elixir to Akka (and back) - ElixirConf Mx 2017From Elixir to Akka (and back) - ElixirConf Mx 2017
From Elixir to Akka (and back) - ElixirConf Mx 2017
 
Programación funcional con haskell
Programación funcional con haskellProgramación funcional con haskell
Programación funcional con haskell
 
Técnicas basadas en matriz de estructura de diseño
Técnicas basadas en matriz de estructura de diseñoTécnicas basadas en matriz de estructura de diseño
Técnicas basadas en matriz de estructura de diseño
 
Acercándose a la entrega continua
Acercándose a la entrega continuaAcercándose a la entrega continua
Acercándose a la entrega continua
 
Modelos de paralelismo y concurrencia
Modelos de paralelismo y concurrenciaModelos de paralelismo y concurrencia
Modelos de paralelismo y concurrencia
 
Arquitecturas que crecen y arquitecturas que no
Arquitecturas que crecen y arquitecturas que noArquitecturas que crecen y arquitecturas que no
Arquitecturas que crecen y arquitecturas que no
 
Arqueología de software
Arqueología de softwareArqueología de software
Arqueología de software
 
Hola OSGi
Hola OSGiHola OSGi
Hola OSGi
 
Desarrollo Dirigido por Comportamiento (con Cucumber y Groovy)
Desarrollo Dirigido por Comportamiento (con Cucumber y Groovy)Desarrollo Dirigido por Comportamiento (con Cucumber y Groovy)
Desarrollo Dirigido por Comportamiento (con Cucumber y Groovy)
 
BDD - Desarrollo dirigido por comportamiento
BDD - Desarrollo dirigido por comportamientoBDD - Desarrollo dirigido por comportamiento
BDD - Desarrollo dirigido por comportamiento
 

¿En qué la estamos regando en pruebas de software?

  • 1. ¿En qué la estamos regando en pruebas de software? Agustín Ramos @MachinesAreUs
  • 2. ¿Cuántas pruebas necesita ésta función? function partition(items, left, right) { var pivot = 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--; } } return i; }
  • 3. ¿Cuántos tipos de pruebas necesita esta función? function partition(items, left, right) { var pivot = 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--; } } return i; }
  • 4. ¿Cuántos tipos de pruebas necesita esta función? Valores en rangos esperados Condiciones de frontera. Valores no esperados (e.g. nulos) Combinaciones de los anteriores Valores que ejerciten las distintas rutas.
  • 5. ¿Cuántas rutas de ejecución tiene este programa? function partition(items, left, right) { var pivot = 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--; } } return i; }
  • 6. Complejidad Ciclomática Métrica. Thomas J. McCabe, 1976 Mide el número de rutas de ejecución linealmente independientes dentro de un programa. Formalmente M = E − N + 2P Aproximador: 2^N - 1 donde N es el número de bifurcaciones en el código (bloques if, where, for, etc.)
  • 7. Entonces… ¿Cuándo vas a acabar de probar?
  • 8. Para empezar… ¿Cómo sabes que has probado lo suficiente?
  • 10. Cobertura “Tenemos cobertura a nivel de código superior al 90%, lo cual es indicador de nuestro alto nivel de calidad”
  • 11. ¿Cobertura? Una línea de código que está “cubierta” (se ha ejecutado durante una prueba) no me dice nada del contexto en el cual se ejecutó (e.g. los parámetros de entrada de la función, el número de iteración si se encuentra dentro de un bloque, etc), y por lo tanto no me dice que no puede fallar o tener un comportamiento distinto en un contexto distinto.
  • 14. Data Driven Testing Same test Many input/output pairs. Test
  • 15. DDT en Cucumber Feature: Addition I want to be told the sum of two numbers ! Scenario Outline: Add two numbers Given I have entered <input_1> into the calculator And I have entered <input_2> into the calculator When I press <button> Then the result should be <output> on the screen ! Examples: | input_1 | input_2 | button | output | | 20 | 30 | add | 50 | |2 |5 | add | 7 | |0 | 40 | add | 40 |
  • 16. DDT en Spock class HelloSpock extends spock.lang.Specification { def "length of Spock's and his friends' names"() { expect: name.size() == length ! where: name | length "Spock" | 5 "Kirk" | 4 "Scotty" | 6 } }
  • 17. ¿De dónde salen los casos? A mano. En general, no acabas. ¿Cómo sabes que son suficientes? ¡Son solo los que se te ocurren! Generación automatizada. Random. ¿Cómo sabes que son suficientes? Todas las posibles combinaciones de entradas/condiciones…
  • 18. ¿Cuál es el P.E.X? Explosión combinatorial
  • 20. Pairwise testing “Pairwise (a.k.a. all-pairs) testing is an effective test case generation technique that is based on the observation that most faults are caused by interactions of at most two factors. Pairwise-generated test suites cover all combinations of two therefore are much smaller than exhaustive ones yet still very effective in finding defects.” http://www.pairwise.org/ most ~ > 90 %
  • 21. Ejemplo de Pairwise Testing http://www.pairwise.org/tools.asp
  • 24. Pruebas Basadas en Riesgos Dados recursos finitos ¿cómo escoger qué probar más y qué menos? Estrategia: Objetivo: Encontrar los defectos más importantes tan pronto como sea posible y con el menor costo. No hay riesgo => No hay pruebas. Decisión de negocio
  • 25. ¿Qué es el Riesgo? !
  • 26. Pruebas Basadas en Riesgos La fórmula R(f) = P(f) * C(f) R(f) - Riesgo calculado de la función f P(f) - Probabilidad de falla de la función f C(f) - Costo de falla de la función f
  • 27. Análisis de Riesgos + Pruebas !
  • 28. Pruebas Basadas en Riesgos Formulación original (James Bach): http://www.satisfice.com/articles/hrbt.pdf Presentación (con más tips): http://www.cs.tut.fi/tapahtumat/testaus04/schaefer.pdf
  • 30. Property-Based Testing Si tenemos una función reverse :: String -> String Entonces una propiedad puede definirse como: reverse (reverse xs) == xs Y podemos permitir que herramientas como QuickCheck generen “aleatoriamente" ejemplos de xs y verifiquen que estos ejemplos cumplan con la propiedad
  • 33. … and “More is Different” Phillip Anderson Science, Vol. 177, No. 4047, 1972
  • 34. Test me M@#3rfvkc3R Test this M@+3rfükC3r !