Pruebas de interfaz automatizadas
e introducción a BDD
Santiago Rodríguez Sordo
@santiagorodsor
introducción a BDD
YAGNI
1/234
Aproximacióncumplir las especificacioneslenguaje coloquial
evalúan el código continuamente con las especificaciones
2/234
BDD
Proceso de desarrollo de software
Specification by Example.
Son casos reales3/234
BDD
¿¿¿ 3/234 ???
BDDRequisitos y comportamientos
Historia de usuario
Criterio de aceptación
BDD, ¿qué requisitos?
Historia de usuario Criterio de aceptación
Escenario
BDD, ¿cómo los expreso?
Escenario: Veré mi nombre al entrar en la app.
Como usuario
Quiero entrar en la aplicación
De manera que vea mi nombre
BDD, ¿cómo los expreso?
Escenario: <Descripción de la historia>Como <rol>Quiero <acción>De manera que <suceda algo>
BDD, ¿cómo los expreso?Escenario: Un usuario ve todos los mensajes nuevos
Cómo usuario de la aplicación llego a la pantalla de notificaciones
Dado que veo que tengo 3 notificaciones de mensaje.
Cuando entro en la página de mensajes.
Observo que hay 3 mensajes nuevos.
Dado que entro en cada uno de ellos.
Entonces veo que no tengo ningún mensaje.
BDD, ¿cómo los expreso?Gherkin
GherkinFeatureBackground:Scenario: Some determinable business situation Given some precondition And some other precondition When some action by the actor And some other action And yet another action Then some testable outcome is achieved And something else we can check happens too
Cheatsheet
Given (“dado”), llevará al sistema a un estado conocido
When (“cuando”), describe la acción clave
Then (“entonces”), describe salidas observables
And (“ y ”) But (“ pero “)
https://github.com/cucumber/cucumber/wiki/Given-When-Then
Tus features tu implementación guiar deben,
no esta reflejar.
¿funcionará?
Proceso
1. Se elige un escenario.2. Se implementa el código 3. ¿Pasa la prueba?
No -> Vuelve al paso 24. Cuando pase el test se da por bueno.5. Escenario Done!
Evolutivo1. 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 y
vuelvo a evaluar.C: Si la especificación a cambiado, desecho la prueba.
Todo el procesoHistoria de usuario feature
Feature 1● Scenario1● Scenario2● Scenario3
Feature 2● Scenario1● Scenario2● Scenario3
Feature 3● Scenario1● Scenario2● Scenario3
… pero … … son muchos escenarios ...
… utiliza la fuerza ...
Automatización de interfaz
Disponemos de máquinas, que hagan el trabajo repetitivo.
La fuerz… AUTOMATIZACIÓN
La solución única no existeScenario:
As a Mobile Developer BDD-lover quiero adelantar trabajo.
Given no hay manera buena de desarrollar para Android e iOS a la vez.
When busco una prueba única Android e iOS
Then encuentro una manera buena de automatizar Android e iOS a la vez. FAIL
PASS
PASS
:( :(
AUTOMATIZACIÓNNativo
Instruments - UIAutomation ”.js”UIAutomator (Android) “.java”Appium - Webdriver (iOS, Android).js, ( lento :( y poco fiable)
Apply: Appium http://appium.io/
PROs:- Utiliza las herramientas nativas de cada plataforma.- La interfaz es común (Android e iOS)
CONTRAs:- Lento.- Poco fiable.- No tiene waits bien soportados.
AUTOMATIZACIÓNiOS
Cedar http://pivotallabs.com/test-driven-iphone-development-with-cedar/
KiwiKIF
AUTOMATIZACIÓNCucumber
CalabashFrankiCuke
Apply: Calabash http://calaba.sh/
PROs:- tiene muchos gestos soportados- utiliza una interfaz “común” para iOS y Android.- hay referencias de que se usa
CONTRAs:- intrusivo en iOS Projects- utiliza comandos de muy bajo nivel para muchas cosas
Apply: iCuke https://github.com/unboxed/icuke
PROs:- acceso directo al runtime de la app vía HTTP- acciones inside iOS APIS- podría integrarse con calabash o cucumber
CONTRAs:- parece anticuado (2010)- demasiado incompleto
Apply: Frank http://www.testingwithfrank.com/
PROs:- fácil de cargar entorno- “buena” experiencia simulator/idevice- no “intrusivo” en iOS projects- symbiote
CONTRAs:- mejorables gestos- utiliza comandos de muy bajo nivel para muchas cosas
¿Cómo lo hacen?
Cucumberfeatures/myfeature.feature
features/steps/myfeature_step.rb
Cucumber
Cucumber
Step by step
Step by step
Make your own steps
1. gem server2. browser, localhost:88083. frank-cucumber4.
Make your own steps
selector + comando + parámetro
- (Array) frankly_map(selector, method_name, *method_args)
Ask Frank to execute an arbitrary Objective-C method on each view which matches the specified selector.
Cucumber Wrap Up
Gherkin Steps
Frank
Calabash
iCuke
Si no lo veo no lo creo
Ya lo veo claro ...
Probaré ...
Ya lo veo claro ...
Probaré ...
Ya lo veo claro ...
Probaré ...
Ya lo veo claro ...
Probaré ...
Hasta el infinitoooo ...
No perdamos la especificación
Aplíquese:- no sólo como automatización- no en todas las combinaciones- con criterio- en el desarrollo- sin pensar que va a hacerte el código. ^_^
Entonces... ¡ Cucumber es BDD!
NO !!!!
Se usa Cucumber para BDD
En BDD se tienen las pruebas alineadas con los requerimientos.
Para ayudarnos usamos Cucumber.
Some tricks
Cuidado, pruebas automatizadas
El desarrollo cambia a menudo los puntos en los que se apoyan,hay que fijarlos en el desarrollo y todo el equipo debe responsabilizarse.
Punto de apoyo = identificadorUIAccessibilityIdentification
“protocol used to associate a unique identifier with elements in your user interface”
@property(nonatomic, copy) NSString *accessibilityIdentifier
Page Object Pattern
Page Object Pattern
Page Object Pattern
Page Object Pattern
Queries
Queries
Queries
Queries
wait
wait
wait
services
services
Wrap up:
http://www.testingwithfrank.com/
http://cukes.info/
https://cucumber.pro/
@santiagorodsor
Recommended