1. BDD y Test automatizados
1
Universidad Pontificia de Salamanca
Máster Universitario en Informática Móvil
Sofía Swidarowicz Andrade
17 de Abril de 2015
2. 2
Sofía Swidarowicz Andrade
iOS Developer en Medianet Software
www.phyline.com
Pinitos con BDD
Información: ¡Quiero compartirla!
3. ¿De qué hablaremos hoy?
3
Historia del desarrollo ágil
- Scrum
- Kanban
- Programación Extrema
- TDD
Behaviour Driven Development
- Estructura proyecto
4. Historia del Desarrollo Ágil
Edward Deming
Calidad Total
Organización Procesos
Cíclo producción
Esfuerzo en Equipo
4
5. 5
1950 - Ciclo PDCA (Plan, Do, Check,
Act). Walter A, Shewhart
6. Historia del Desarrollo Ágil
Kent Beck
Patrones de diseño de software
Smalltalk
Desarrollo guiado por pruebas
6
Software de programación extrema o
eXtreme Programming
7. Metodología Ágil
• Reconoce las distintas interacciones y cambios que
ocurren en todo desarrollo de software
• Desarrollar software no es un proceso que involucra
sólo al desarrollador (pica código) sino a todos los
participantes del ciclo
7
8. 1995 - Scrum
Product Backlog Sprint Planning Sprint Backlog
N Weeks
Sprint
Retrospective
Finished Work
8
Stakeholders
Product Owner
Scrum Master
Team Members
9. 9
1997 - Desarrollo guiado por
funcionalidades / Feature Driven
Development (FDD)
10. TDD - Test Driven Development
Primero
desarrollamos el
test,
y luego la aplicación
Realizar pruebas
unitarias
para el código que
debemos construir
10
11. 1999 - Programación Extrema /
Extreme Programming (XP)
Historias de Usuario y
Planificación de
Releases
11
13. 2007 - Kanban para el desarrollo de software
Roles y
Procesos
13
14. Desarrollo guiado por comportamiento /
Behaviour Driven Development by Dan North
implementar una aplicación, o parte de
ella, mediante la descripción de su
comportamiento desde la perspectiva del
cliente
+
14
15. BDD - Behaviour Driven Development
Comunicación
Se usan ejemplos para ilustrar comportamientos
“The Business, Developers,
Testers,
Analysts and Managers”
15
17. Imagina que eres parte del equipo técnico (Desarrollador y
Testers) y tienes la tarea de colaborar con el equipo de
negocio (Business owners y Business Analysts).
Tienes que recabar los requerimientos de tu proyecto; estos
requerimientos serán los que el equipo de desarrollo
implementarán y los que el equipo de testing probarán.
Un ejemplo:
17
18. Un ejemplo:
18
Deberás añadir una característica nueva de búsqueda en tu
plataforma de E-Commerce móvil, que permitirá a los usuarios
hacer búsquedas de un producto en tu aplicación.
Esa búsqueda deberá mostrar los productos relacionados con el
patrón dado por el cliente.
19. 1. Requisitos Funcionales
1.1 Funcionalidad de búsqueda
1.1.1 El usuario debe ser capaz de buscar un
producto.
1.1.2 Sólo los productos relacionados al string de
búsqueda deben ser mostrados.
Terminamos con:
19
BDD - Behaviour Driven Development
21. BDD - Behaviour Driven Development
Pero….
No especifican el comportamiento concreto del
sistema
Diseccionemos el primer punto:
1.1.1 El usuario debe ser capaz de buscar un producto.
21
22. BDD - Behaviour Driven Development
- ¿Cuál es la máxima longitud de la cadena en la
búsqueda?
Pero no especifica…
22
- ¿Cuál debería ser el resultado de la búsqueda
para un producto inválido?
- ¿Cuáles son los caracteres válidos que pueden
ser usados para la búsqueda?
23. BDD - Behaviour Driven Development
- Respuesta del Business Owner : La búsqueda
de productos no válidos deberían mostrar el
siguiente mensaje en el área de búsqueda:
Producto no encontrado.
Terminamos preguntando…de nuevo
23
- Pregunta al Business Owner : ¿Cuáles deberían
ser los resultados de la búsqueda si el usuario
busca un producto inválido?
24. BDD - Behaviour Driven Development
Interpretaciones múltiples o dudas
Problemas…
Algunos considerarán que un producto inválido
es aquel que no está presente en el inventario y
otros podrían considerarlo como un error en la
cadena de búsqueda
¿Qué es un producto inválido?
24
25. BDD - Behaviour Driven Development
No ofrecen más explicaciones de comportamiento
Problemas…
“Producto no encontrado”
25
¿se mostrará una nueva opción de
búsqueda al usuario?.
¿deberían mostrarse búsquedas similares/relacionadas?
26. BDD - Behaviour Driven Development
¿Qué concluimos?
1.- Los equipos de negocio y técnico se comunican
en dos niveles diferentes, el primero da requisitos
vagos y el segundo intenta ser muy preciso. Y ambos
obtienen resultados ambiguos.
26
2.- No se le da suficiente información al equipo de
negocio, así que no pueden generar nuevos escenarios.
Algunos detalles del proyecto se pierden en emails y
conversaciones telefónicas.
27. BDD - Behaviour Driven Development
¿Cómo podemos mejorar los requerimientos?
27
28. BDD - Behaviour Driven Development
“Cuándo el usuario busque, sin fallos de ortografía, el nombre
de un producto presente en el inventario. Todos los productos
con nombre similar deberán ser mostrados”.
Escribimos…Historias de Usuario
28
29. BDD - Behaviour Driven Development
Escribimos…Historias de Usuario
29
“Cuándo el usuario busque, sin fallos de ortografía, por el
nombre de un producto presente en el inventario. Los
resultados de la búsqueda deberían mostrar los
coincidentes primero y segundo los similares.”
31. BDD - Behaviour Driven Development
Escribiremos los requisitos empleando
lenguaje natural (Human reading) en
inglés
Es necesario emplear un lenguaje que todo
el equipo pueda entender y exprese los
requisitos que se deben cumplir.
31
¡¡¡Entonces!!!
33. BDD - Behaviour Driven Development
¿Cómo escribimos las Historias de Usuario?
As a [role] I want to [do] [something], so that I
[receive business benefit].
Tal que [rol] quiero [hacer] [algo], de tal forma
que [recibo beneficios].
33
34. BDD - Behaviour Driven Development
De manera que <suceda algo>
Escenario: <Descripción de la historia>
Como <rol>
Quiero <acción>
¿Cómo escribimos las Historias de Usuario?
34
35. BDD - Behaviour Driven Development
Given (Dado)
When (Cuando)
Then (Entonces)
And (Y), But (Pero)
Llevará al sistema a un estado conocido
antes de interactuar con el usuario
https://github.com/cucumber/cucumber/wiki/Given-When-Then
Describe la acción clave que
realiza el usuario
Salida resultados observables
relacionados al valor o beneficio
del negocio
Para separar cuando se tienen
muchos Givens o Then
35
36. BDD - Behaviour Driven Development
Gherkin
When some action by the actor
Feature
Background:
Scenario: Some determinable business situation
Given some precondition
And some other precondition
And some other action
And something else we can check happens too
And yet another action
Then some testable outcome is achieved
36
37. BDD - Behaviour Driven Development
Feature: Search for items in our mobile app
This feature is very important because it will allow users to
filter products
Scenario: When a user searches, without spelling mistake,
for a product name present in inventory. All the products
with equal name should be displayed first and second the
similar
37
38. BDD - Behaviour Driven Development
38
Given User is on the main page of our app
When User goes to the search bar
And searches for iPhones
Then search page should be updated with the lists of iPhone first
And show the similar next
39. BDD - Behaviour Driven Development
Historias de
Usuario
Escenario
+
criterio de
aceptación
39
40. El código debe evaluarse continuamente para asegurar
que se realizan las especificaciones del cliente
BDD - Behaviour Driven Development
¿Cómo compruebo que el proyecto avanza
de acuerdo a las especificaciones?
40
41. BDD - Behaviour Driven Development
…¿Y Ahora? ¿cómo implemento todo esto?
41
42. BDD - Behaviour Driven Development
1.- Se elige un escenario.
2.- Se implementa el código
3.- ¿Pasa la prueba?
No —> Vuelve al paso 2
4.- Cuando pase el test se da por bueno
5.- Done con este escenario
42
43. BDD - Behaviour Driven Development
y vuelvo a evaluar.
Evolutivo
1.- Se hace una modificación.
2. Se pasa un test: ERROR
A: Si escenario correcto, he metido un bug.
B: Si la prueba no se ajusta al código, modifico la prueba
C: Si la especificación a cambiado, desecho la prueba
43
44. BDD - Behaviour Driven Development
1.- Se elige un escenario.
2.- Se implementa el código
3.- ¿Pasa la prueba?
No —> Vuelve al paso 2
4.- Cuando pase el test se da por bueno
5.- Done con este escenario
1.- Se elige un escenario.
2.- Se implementa el código
3.- ¿Pasa la prueba?
No —> Vuelve al paso 2
4.- Cuando pase el test se da por bueno
5.- Done con este escenario
1.- Se elige un escenario.
2.- Se implementa el código
3.- ¿Pasa la prueba?
No —> Vuelve al paso 2
4.- Cuando pase el test se da por bueno
5.- Done con este escenario
44
52. Gestos: tocar, swipes, escribir
Aserciones: comprobar que el elemento existe
o posee cierta información
Screenshots: captura de pantalla del estado del
dispositivo
52
¿Cómo se comunica Cucumber con las diferentes
plataformas?
Conjunto de librerías que permiten probar la
funcionalidad de aplicaciones nativas o híbridas
53. iOS
Client Computer
Calabash ruby client
library
Calabash
http Server
Device / Simulator
UIAutomator
Your App
Calabash
Framework
Features
http://blog.lesspainful.com/2012/03/07/Calabash/
53
¿Cómo se comunica Calabash con las diferentes
plataformas?
54. Android
Client Computer
Calabash ruby client
library
Calabash
http Server
Device / Simulator
Instrumentation
Features
http://blog.lesspainful.com/2012/03/07/Calabash/
Your App
54
¿Cómo se comunica Calabash con las diferentes
plataformas?
58. BDD - Behaviour Driven Development
Escenarios
Feature: Login
@invalid
Scenario: Add site - Invalid login
Given I am about to login
When I enter invalid credentials
Then I am presented with an error message to correct credentials
@valid
Scenario: Add site
Given I am about to login
When I enter valid credentials
Then I am successfully authenticated
And I can see posts for the site
Tags
Tags
58
59. BDD - Behaviour Driven Development
Given(/^I am about to login$/) do
@current_page = page(LoginPage).wait_for_element(timeout: 30)
@current_page.self_hosted_site
end
When(/^I enter invalid credentials$/) do
user = CREDENTIALS[:invalid_user]
@current_page = @current_page.login(user[:username], user[:password],
CREDENTIALS[:site])
end
Then(/^I am presented with an error message to correct credentials$/) do
#TODO
end
Steps
59
61. BDD - Behaviour Driven Development
Estructura de un proyecto en Cucumber
config
├ features <- Dónde irán las features
│ ├ android <- Definiciones concretas para Android
│ │ ├ pages <- Screen Objects para Android
│ │ ├ support <- Soporte para Android
│ ├ ios
│ │ ├ pages <- Definiciones concretas para iOS
│ │ ├ support <- Screen Objects para iOS
│ ├ step_definitions <- Definición de los steps
│ ├ support <- Soporte genérico
├ apps <- Guardaremos los binarios de las apps
61
<- Guardaremos la config genérica
62. BDD - Behaviour Driven Development
VAMOS A PRACTICARRRRRR!!!!!
62
63. BDD - Behaviour Driven Development
63
Debo ser un usuario con credenciales válidas
Quiero realizar una app que liste a mis superheroes
favoritos
¿Qué haremos?
Debo poder registrarme
Debo poder ver el detalle de mis superheroes
ETC, vamos a crear nuevos escenarios
64. BDD - Behaviour Driven Development
64
Given I am in login screen
Then I’m inside my application
Scenario: I want to access Superheroes app
When I fill valid“username” and “password” information
And try to log in successfully
Imperativo
And I see my superheroes list
65. BDD - Behaviour Driven Development
65
Given I am an unauthenticated guest
And I have a valid user account
When I log in
Then I’m inside my application
Scenario: I want to access Superheroes app
When I try to access restricted area
Declarativo
And I see my superheroes list