SlideShare una empresa de Scribd logo
1 de 41
CURSO DE TESTING OSL
        12 – 16 DE ABRIL 2010




                    Cucumber y BDD


Alberto Perdomo

Web:       http://albertoperdomo.net
Email:     alberto.perdomo@aentos.es
Twitter:   @albertoperdomo             http://www.aentos.com
EL PROBLEMA DEL
           ENTENDIMIENTO

→ Los clientes hablan el lenguaje de su negocio


→ Los desarrolladores hablan lenguaje técnico


→ ¿Cómo escribir especifcaciones que podamos entender
todos?
EL MOVIMIENTO BDD

→ BDD = Behaviour Driven Development


→ una nueva forma de enfocar el TDD


→ Origen: Dan North   →   http://blog.dannorth.net/introducing-bdd/



→ Criterios de aceptación ejecutables
EL MOVIMIENTO DSL


→ DSL = Domain Specifc Languange


→ Lenguaje de programación enfocado a un determinado
problema o dominio en particular
  → Negocios
  → Construcción
  → ...
CUCUMBER

CUCUMBER      =     TESTING +

                    BDD +

                    DSL +

                    Especifcaciones legibles


→ ¡Criterios de aceptación ejecutables!
CUCUMBER




→ Librería de tests de aceptación


→ ¡Historias de usuario! (en texto plano)
como criterios de aceptación y test


→ Web en http://cukes.info/
CUCUMBER




Extraído de http://cukes.info/
FEATURE: CARACTERÍSTICA
                                                             BUSINESS VALUE

Feature: Some terse yet descriptive text of what is desired
   In order to realize a named business value
   As an explicit system actor
   I want to gain some beneficial outcome which furthers the goal

   Scenario: Some determinable business situation
                                                                    ¿Para qué sirve esta
     Given some precondition                                        Funcionalidad?
       And some other precondition
      When some action by the actor
       And some other action
                                                                    ¿Qué valor aporta?
       And yet another action
      Then some testable outcome is achieved                        ¿A quién va dirigida?
       And something else we can check happens too

   Scenario: A different situation
       ...



              ¡HISTORIA DE USUARIO Y TEST EJECUTABLE!

                 No tengas más de 4-6 escenarios por característica
          e intenta separar las características de forma que tengan sentido
SCENARIOS
Una característica puede tener mútiples escenarios                  ESCENARIO
Feature: Some terse yet descriptive text of what is desired
   In order to realize a named business value
   As an explicit system actor
   I want to gain some beneficial outcome which furthers the goal

   Scenario: Some determinable business situation
                                                                    Caso de uso,
     Given some precondition                                        Ejemplo
       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

   Scenario: A different situation
       ...




                                                     GIVEN-WHEN-THEN steps
                                                     ¡uno por línea!
GIVEN-WHEN-THEN

 Given       →     Precondición

 When        →     Acción

 Then        →     Resultado

 And / But   →     conectar steps



    ¡El orden no importa!
CUCUMBER: ELEMENTOS
   FEATURE
                   features/login.feature
   CRITERIOS DE
                       Given a user with email "admin@example.com"
    ACEPTACIÓN

 (TEXTO PLANO)

                              Cucumber busca la
                              defnición de los steps
                              usando expresiones regulares


                   features/step_defnitions/user_steps.rb
STEP DEFINITIONS
                   Given /^a user with email "(.*)"$/ do |email|
                     user = Factory(:user, :email => email)
     (RUBY)        end
CUCUMBER: STEPS
→ ¡Los steps son reusables! (si se escriben bien)
   → Utiliza variables
   → Utiliza parámetros o variables opcionales


               When /^I login as "(.*)"$/ do |login|
                 visit login_path
                 fill_in("Login", :with => login)
                 fill_in("Password", :with => "secret")
                 click_button("Login")
               end
CUCUMBER: PROBLEMA




                    Pero...
el cliente y yo hablamos español, no inglés...
CUCUMBER: IDIOMAS

Cucumber soporta idiomas → ¡español!


Feature              →                 Característica
Scenario             →                     Escenario
Given-When-Then      →     Dado-Cuando-Entonces
And/But              →                        Y/Pero
…
...
CUCUMBER: EJEMPLO EN
     ESPAÑOL

 Hay que defnir el idioma en el que está escrito el feature


     #language: es
     Característica: Empresas gestión
       Para tener una relación de las empresas con las que trabajo
       Como usuario con rol admin
       Administro las empresas en el sistema

       Escenario: Registro de una nueva empresa
         Dado un usuario con rol "admin" "Fred"
         Cuando inicio sesión como "Fred"
         Y visito el listado de empresas
         Cuando pulso el enlace "Nueva empresa"
         Y registro una empresa
         Entonces debería ver "Empresa registrada correctamente"
         Y debería ver "Listado de empresas"
LIBRERÍAS Y STEPS GENÉRICOS

→ Librerías para probar aplicaciones Rails, Javascript y en
general cualquier aplicación (web o no)
   → Rails
   → PHP, Java, .NET
   → una web cualquier, p.ej. Google


→ Steps predefnidos para lo más común:
   → Pulsar botones, seguir enlaces, rellenar campos,
   comprobar la presencia de textos, etc.
CUCUMBER

                               FEATURES


                                 STEPS




Libs. de tests para web            Factorías,   Otras libs.
(emulan o usan un navegador)       Mocks, ...    en Ruby




                               APLICACIÓN
LIBRERÍAS PARA WEB
Capybara, Webrat, etc.


  → Emulando un navegador: más rápido, sin JS


  → Utilizando un navegador: más lento, con JS
     → Culerity (sin interfaz gráfco, ideal)
     → Selenium (Firefox)
     → Watir (Firefox, Safari, Chrome, IE)
     → ...
LA VELOCIDAD IMPORTA
Para probar funcionalidades estándar
   → modo emulación → velocidad


Para probar funcionalidades con AJAX o con efectos JS
   → modo navegador → más lento
      → culerity (relativamente rápido, no hay interfaz gráfca)
      → otros (más lento pero sirve para probar en navegadores
      específcos)
WEBRAT vs. CAPYBARA
Webrat
  → compatible con muchos navegadores
  → se lanzan las pruebas en un modo espec., p.ej. Selenium
  → hay que lanzar las pruebas con/sin JS de forma separada


Capybara
  → más reciente, confguración más sencilla
  → igual o más compatible
  → se puede cambiar la sesión en una misma ejecución de tests
  → API compatible con Webrat
CUCUMBER: VENTAJAS
→ Criterios de aceptación
→ Especifcación y test
   → en un mismo documento
   → en el lenguaje del cliente
   → en su idioma
   → vocabulario compartido


→ Evitamos confusiones al transformar especifcación en
funcionalidades o tests unitarios
→ Ayudar a enfocarnos en las funcionalidades más valiosas
→ Documentación
MUCHO MÁS

→ Hooks
→ Tags
→ Tagged hooks
→ Multiline arguments
→ FIT tables
→ Background
CUCUMBER EN RAILS:
              ESTRUCTURA
features/ → directorio de cucumber
features/*.feature → características
features/login.feature

features/realizar_pedido.feature

...

features/step_defnitions/*.rb → implementación de los steps
features/step_defnitions/web_steps.rb      →   steps para visitar, clickar, etc. (de serie)

features/step_defnitions/web_steps_es.rb   →   traducción al español (de serie)

features/step_defnitions/pedido_steps.rb   →   steps relacionados con pedidos

...

features/support/env.rb → conf. de cucumber
features/support/paths.rb → traducción de rutas
STEPS WEB EN ESPAÑOL I
  Dado /^que estoy en (.+)$/ do |page_name|
    Given %{I am on #{page_name}}
  end

  Cuando /^voy a (.+)$/ do |page_name|
    When %{I go to #{page_name}}
  end

  Cuando /^pulso "([^"]*)"$/ do |button|
    When %{I press "#{button}"}
  end

  Cuando /^hago click en "([^"]*)"$/ do |link|
    When %{I follow "#{link}"}
  end

  Cuando /^completo "([^"]*)" con "([^"]*)"$/ do |field, value|
    When %{I fill in "#{field}" with "#{value}"}
  end




                ¡Vienen de serie!
STEPS WEB EN ESPAÑOL II
  Cuando /^selecciono "([^"]*)" de "([^"]*)"$/ do |value, field|
    When %{I select "#{value}" from "#{field}"}
  end

  Entonces /^debería ver "([^"]*)"$/ do |text|
    Then %{I should see "#{text}"}
  end

  Entonces /^no debería ver "([^"]*)"$/ do |text|
    Then %{I should not see "#{text}"}
  end

  Entonces /^debería estar en (.+)$/ do |page_name|
    Then %{I should be on #{page_name}}
  end

  Entonces /^múestrame la página$/ do
    Then %{show me the page}
  end




                 y muchos más...
IMPLEMENTACIÓN DE STEPS
Given /^(?:|I )am on (.+)$/ do |page_name|
  visit path_to(page_name)
end

When /^(?:|I )go to (.+)$/ do |page_name|
  visit path_to(page_name)
end

When /^(?:|I )press "([^"]*)"(?: within "([^"]*)")?$/ do |button, selector|
  with_scope(selector) do
    click_button(button)
  end
end

When /^(?:|I )follow "([^"]*)"(?: within "([^"]*)")?$/ do |link, selector|
  with_scope(selector) do
    click_link(link)
  end
end

When /^(?:|I )fill in "([^"]*)" with "([^"]*)"(?: within "([^"]*)")?$/ do |field, value, selector|
  with_scope(selector) do
    fill_in(field, :with => value)
  end
end
EJEMPLO BDD: PASO 1

 Defnimos el valor de negocio y un escenario

features/sesion.feature
#language: es
Característica: Iniciar y cerrar sesión
  Para poder identificarme correctamente y realizar mis pedidos de forma segura
  Como usuario
  Quiero poder iniciar y cerrar sesión

  Escenario: Login correcto
    Dado un usuario con email "roger@test.com"
    Cuando voy a la portada
    Y inicio sesión como "roger@test.com"
    Entonces debería ver "Bienvenido"
EJEMPLO BDD: PASO 2
               Ejecutamos el escenario
$ cucumber features/sesion.feature
                                         VERDE: OK

                                         AMARILLO: NO DEFINIDO

                                         AZUL: SALTADO

                                         ROJO: ERROR




                                          Resumen


                                          Ayuda para
                                          Implementar
                                          los steps
EJEMPLO BDD: PASO 3

Implementar el primer step pendiente
             (si lo hay)
    features/step_defnitions/user_steps.rb
    Dado /^un usuario con email "([^"]*)"$/ do |email|
      Factory(:user, :email => email)
    end
EJEMPLO BDD: PASO 4
     Volvemos a ejecutar el escenario




Ejecutar de nuevo
    Si hay errores → paso 5
    Si hay steps pendientes → paso 3
    Si está todo OK → siguiente escenario o característica
EJEMPLO BDD: PASO 3
                 Implementar o arreglar el step




features/step_defnitions/web_steps_es.rb    features/support/paths.rb
Cuando /^voy a (.+)$/ do |page_name|        module NavigationHelpers
  When %{I go to #{page_name}}
end                                           def path_to(page_name)
                                                case page_name

                                                when /la portada/
                                                  '/'

features/step_defnitions/web_steps.rb                ....
When /^(?:|I )go to (.+)$/ do |page_name|
  visit path_to(page_name)
end


                                              Añadimos la ruta
EJEMPLO BDD: PASO 4
     Volvemos a ejecutar el escenario




Ejecutar de nuevo
    Si hay errores → paso 5
    Si hay steps pendientes → paso 3
    Si está todo OK → siguiente escenario o característica
EJEMPLO BDD: PASO 5

       Implementar la funcionalidad para que el step pase


confg/routes.rb

 map.root :controller => "user_sessions", :action => "new" # optional, this just sets the root route
EJEMPLO BDD: PASO 6
     Volvemos a ejecutar el escenario




Ejecutar de nuevo
    Si hay errores → paso 5
    Si hay steps pendientes → paso 3
    Si está todo OK → siguiente escenario o característica
EJEMPLO BDD: PASO 3
  Implementar o arreglar el step




 features/step_defnitions/user_steps.rb
 Cuando /^inicio sesión con email "([^"]*)"$/ do |email|
   fill_in("Email", :with => email)
   fill_in("Contraseña", :with => "secret")
   click_button("Acceder")
 end
EJEMPLO BDD: PASO 4
     Volvemos a ejecutar el escenario




Ejecutar de nuevo
    Si hay errores → paso 5
    Si hay steps pendientes → paso 3
    Si está todo OK → siguiente escenario o característica
EJEMPLO BDD: PASO 5
Implementar la funcionalidad para que el step pase

app/controllers/user_sessions_controller.rb
class UserSessionsController < ApplicationController
  before_filter :require_no_user, :only => [:new, :create]
  before_filter :require_user, :only => :destroy

  def new
    @user_session = UserSession.new
  end


app/views/user_sessions/new.html.erb
<h1>Iniciar sesión</h1>

<% form_for @user_session, :url => user_session_path do |f| %>
  <%= f.error_messages %>
  <%= f.label :email %><br />
  <%= f.text_field :email %><br />
  <br />
  <%= f.label :password, "Contraseña" %><br />
  <%= f.password_field :password %><br />
  <br />
  <%= f.check_box :remember_me, "No cerrar sesión" %><%= f.label :remember_me %><br />
  <br />
  <%= f.submit "Iniciar sesión" %>
<% end %>
EJEMPLO BDD: PASO 6
Ejecutar de nuevo
    Si hay errores → paso 5
    Si hay steps pendientes → paso 3
    Si está todo OK → siguiente escenario o característica
EJEMPLO BDD: PASO 5
Implementar la funcionalidad para que el step pase




app/controllers/user_sessions_controller.rb

 class UserSessionsController < ApplicationController
   before_filter :require_no_user, :only => [:new, :create]
   before_filter :require_user, :only => :destroy

   def new
     @user_session = UserSession.new
   end

   def create
     @user_session = UserSession.new(params[:user_session])
     if @user_session.save
       flash[:notice] = "Bienvenido"
       redirect_back_or_default account_url
     else
       render :action => :new
     end
   end
EJEMPLO BDD: PASO 6
Ejecutar de nuevo
    Si hay errores → paso 5
    Si hay steps pendientes → paso 3
    Si está todo OK → siguiente escenario o característica




     TODO VERDE → HEMOS ACABADO
¿PREGUNTAS?

Más contenido relacionado

La actualidad más candente

jQuery - 01 Conceptos básicos de java script
jQuery - 01 Conceptos básicos de java scriptjQuery - 01 Conceptos básicos de java script
jQuery - 01 Conceptos básicos de java scriptJacob Flores
 
Taller de Introducción a Ruby on Rails (2ª parte)
Taller de Introducción a Ruby on Rails (2ª parte)Taller de Introducción a Ruby on Rails (2ª parte)
Taller de Introducción a Ruby on Rails (2ª parte)Diacode
 
Programacion interpretada (scripting)
Programacion interpretada (scripting)Programacion interpretada (scripting)
Programacion interpretada (scripting)alexand3r1
 
Taller de Introducción a Ruby on Rails
Taller de Introducción a Ruby on RailsTaller de Introducción a Ruby on Rails
Taller de Introducción a Ruby on RailsDiacode
 
Introduccion a java script
Introduccion a java scriptIntroduccion a java script
Introduccion a java scriptLuis Aceituno
 
Programación Reactiva, Javascript Isomorfo y Meteorjs !
Programación Reactiva, Javascript Isomorfo y Meteorjs !Programación Reactiva, Javascript Isomorfo y Meteorjs !
Programación Reactiva, Javascript Isomorfo y Meteorjs !ouuyeah
 

La actualidad más candente (8)

jQuery - 01 Conceptos básicos de java script
jQuery - 01 Conceptos básicos de java scriptjQuery - 01 Conceptos básicos de java script
jQuery - 01 Conceptos básicos de java script
 
Seminario Calabash - VLCTesting 2014
Seminario Calabash - VLCTesting 2014Seminario Calabash - VLCTesting 2014
Seminario Calabash - VLCTesting 2014
 
Java script
Java scriptJava script
Java script
 
Taller de Introducción a Ruby on Rails (2ª parte)
Taller de Introducción a Ruby on Rails (2ª parte)Taller de Introducción a Ruby on Rails (2ª parte)
Taller de Introducción a Ruby on Rails (2ª parte)
 
Programacion interpretada (scripting)
Programacion interpretada (scripting)Programacion interpretada (scripting)
Programacion interpretada (scripting)
 
Taller de Introducción a Ruby on Rails
Taller de Introducción a Ruby on RailsTaller de Introducción a Ruby on Rails
Taller de Introducción a Ruby on Rails
 
Introduccion a java script
Introduccion a java scriptIntroduccion a java script
Introduccion a java script
 
Programación Reactiva, Javascript Isomorfo y Meteorjs !
Programación Reactiva, Javascript Isomorfo y Meteorjs !Programación Reactiva, Javascript Isomorfo y Meteorjs !
Programación Reactiva, Javascript Isomorfo y Meteorjs !
 

Destacado

ATDD - Desarrollo Dirigido por Test de Aceptación
ATDD - Desarrollo Dirigido por Test de AceptaciónATDD - Desarrollo Dirigido por Test de Aceptación
ATDD - Desarrollo Dirigido por Test de AceptaciónPaulo Clavijo
 
Ruby Mola (y por qué)
Ruby Mola (y por qué)Ruby Mola (y por qué)
Ruby Mola (y por qué)Sergio Gil
 
Curso de Ruby on Rails para el Master de Deusto
Curso de Ruby on Rails para el Master de DeustoCurso de Ruby on Rails para el Master de Deusto
Curso de Ruby on Rails para el Master de Deustoestialvarez
 
Desarrollo de Aplicaciones con Ruby on Rails y PostgreSQL
Desarrollo de Aplicaciones con Ruby on Rails y PostgreSQLDesarrollo de Aplicaciones con Ruby on Rails y PostgreSQL
Desarrollo de Aplicaciones con Ruby on Rails y PostgreSQLJosé Alfredo Ramírez
 
Curso de introdução ao ruby
Curso de introdução ao rubyCurso de introdução ao ruby
Curso de introdução ao rubyFrancis Wagner
 
Curso TDD Ruby on Rails #03: Tests unitarios
Curso TDD Ruby on Rails #03: Tests unitariosCurso TDD Ruby on Rails #03: Tests unitarios
Curso TDD Ruby on Rails #03: Tests unitariosAlberto Perdomo
 
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
 
Introducción a Behaviour Driven Development
Introducción a Behaviour Driven DevelopmentIntroducción a Behaviour Driven Development
Introducción a Behaviour Driven DevelopmentRicardo Markiewicz
 
Curso de Ruby on Rails para el Master de Deusto. Día 2
Curso de Ruby on Rails para el Master de Deusto. Día 2Curso de Ruby on Rails para el Master de Deusto. Día 2
Curso de Ruby on Rails para el Master de Deusto. Día 2estialvarez
 
Curso de Ruby on Rails
Curso de Ruby on RailsCurso de Ruby on Rails
Curso de Ruby on RailsASPgems
 
BDD - Desarrollo dirigido por comportamiento
BDD - Desarrollo dirigido por comportamientoBDD - Desarrollo dirigido por comportamiento
BDD - Desarrollo dirigido por comportamientoAgustin Ramos
 
Code Blast 2012 - Ruby on Rails v.2012
Code Blast 2012 - Ruby on Rails v.2012Code Blast 2012 - Ruby on Rails v.2012
Code Blast 2012 - Ruby on Rails v.2012INSIGNIA4U
 

Destacado (20)

ATDD - Desarrollo Dirigido por Test de Aceptación
ATDD - Desarrollo Dirigido por Test de AceptaciónATDD - Desarrollo Dirigido por Test de Aceptación
ATDD - Desarrollo Dirigido por Test de Aceptación
 
Ruby Mola (y por qué)
Ruby Mola (y por qué)Ruby Mola (y por qué)
Ruby Mola (y por qué)
 
Ruby On Rails (Parte II))
Ruby On Rails (Parte II))Ruby On Rails (Parte II))
Ruby On Rails (Parte II))
 
Ruby On Rails (Parte 1. Introducción)
Ruby On Rails (Parte 1. Introducción)Ruby On Rails (Parte 1. Introducción)
Ruby On Rails (Parte 1. Introducción)
 
Curso de Ruby on Rails para el Master de Deusto
Curso de Ruby on Rails para el Master de DeustoCurso de Ruby on Rails para el Master de Deusto
Curso de Ruby on Rails para el Master de Deusto
 
Desarrollo de Aplicaciones con Ruby on Rails y PostgreSQL
Desarrollo de Aplicaciones con Ruby on Rails y PostgreSQLDesarrollo de Aplicaciones con Ruby on Rails y PostgreSQL
Desarrollo de Aplicaciones con Ruby on Rails y PostgreSQL
 
Curso de introdução ao ruby
Curso de introdução ao rubyCurso de introdução ao ruby
Curso de introdução ao ruby
 
Curso TDD Ruby on Rails #03: Tests unitarios
Curso TDD Ruby on Rails #03: Tests unitariosCurso TDD Ruby on Rails #03: Tests unitarios
Curso TDD Ruby on Rails #03: Tests unitarios
 
Tests de aceptación con cucumber
Tests de aceptación con cucumberTests de aceptación con cucumber
Tests de aceptación con cucumber
 
Ruby 101 session 2
Ruby 101 session 2Ruby 101 session 2
Ruby 101 session 2
 
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)
 
Introducción a Behaviour Driven Development
Introducción a Behaviour Driven DevelopmentIntroducción a Behaviour Driven Development
Introducción a Behaviour Driven Development
 
Curso de Ruby on Rails para el Master de Deusto. Día 2
Curso de Ruby on Rails para el Master de Deusto. Día 2Curso de Ruby on Rails para el Master de Deusto. Día 2
Curso de Ruby on Rails para el Master de Deusto. Día 2
 
Curso de Ruby on Rails
Curso de Ruby on RailsCurso de Ruby on Rails
Curso de Ruby on Rails
 
Taller ruby
Taller rubyTaller ruby
Taller ruby
 
BDD - Desarrollo dirigido por comportamiento
BDD - Desarrollo dirigido por comportamientoBDD - Desarrollo dirigido por comportamiento
BDD - Desarrollo dirigido por comportamiento
 
BDD & Cucumber
BDD & CucumberBDD & Cucumber
BDD & Cucumber
 
Ruby Facil
Ruby FacilRuby Facil
Ruby Facil
 
BDD para la mejora de la calidad software
BDD para la mejora de la calidad softwareBDD para la mejora de la calidad software
BDD para la mejora de la calidad software
 
Code Blast 2012 - Ruby on Rails v.2012
Code Blast 2012 - Ruby on Rails v.2012Code Blast 2012 - Ruby on Rails v.2012
Code Blast 2012 - Ruby on Rails v.2012
 

Similar a Curso de Testing OSL con Cucumber y BDD

Curso TDD Ruby on Rails #01: Introducción al testing
Curso TDD Ruby on Rails #01: Introducción al testingCurso TDD Ruby on Rails #01: Introducción al testing
Curso TDD Ruby on Rails #01: Introducción al testingAlberto Perdomo
 
Probando aplicaciones AngularJS
Probando aplicaciones AngularJSProbando aplicaciones AngularJS
Probando aplicaciones AngularJSRodrigo Pimentel
 
Casper JS - Asegurando la calidad en front-end Drupal
Casper JS - Asegurando la calidad en front-end DrupalCasper JS - Asegurando la calidad en front-end Drupal
Casper JS - Asegurando la calidad en front-end DrupalDavid Gil Sánchez
 
Tecnologías para microservicios
Tecnologías para microserviciosTecnologías para microservicios
Tecnologías para microserviciosPedro J. Molina
 
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHPIntroducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHPDaniel Primo
 
Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009Nelson Rojas Núñez
 
56874982 curso-de-delphi-7
56874982 curso-de-delphi-756874982 curso-de-delphi-7
56874982 curso-de-delphi-7Ismael Batista
 
Presentacion remobjects
Presentacion remobjectsPresentacion remobjects
Presentacion remobjectsmamcx
 
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos AiresPresentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Airespeterpunk
 
Curso TDD Ruby on Rails #02: Test Driven Development
Curso TDD Ruby on Rails #02: Test Driven DevelopmentCurso TDD Ruby on Rails #02: Test Driven Development
Curso TDD Ruby on Rails #02: Test Driven DevelopmentAlberto Perdomo
 
El Mal Odiado Javascript
El Mal Odiado JavascriptEl Mal Odiado Javascript
El Mal Odiado JavascriptEl Jota
 
El Javascripto y los Emuladores de la Muerte
El Javascripto y los Emuladores de la MuerteEl Javascripto y los Emuladores de la Muerte
El Javascripto y los Emuladores de la MuerteFernando Larrañaga
 
5-Unidad 1: Introducción a la Plataforma .NET-1.3 Aplicaciones en C# .NET-Int...
5-Unidad 1: Introducción a la Plataforma .NET-1.3 Aplicaciones en C# .NET-Int...5-Unidad 1: Introducción a la Plataforma .NET-1.3 Aplicaciones en C# .NET-Int...
5-Unidad 1: Introducción a la Plataforma .NET-1.3 Aplicaciones en C# .NET-Int...Luis Fernando Aguas Bucheli
 

Similar a Curso de Testing OSL con Cucumber y BDD (20)

Curso TDD Ruby on Rails #01: Introducción al testing
Curso TDD Ruby on Rails #01: Introducción al testingCurso TDD Ruby on Rails #01: Introducción al testing
Curso TDD Ruby on Rails #01: Introducción al testing
 
BDD con Mink y Behat
BDD con Mink y BehatBDD con Mink y Behat
BDD con Mink y Behat
 
Probando aplicaciones AngularJS
Probando aplicaciones AngularJSProbando aplicaciones AngularJS
Probando aplicaciones AngularJS
 
Casper JS - Asegurando la calidad en front-end Drupal
Casper JS - Asegurando la calidad en front-end DrupalCasper JS - Asegurando la calidad en front-end Drupal
Casper JS - Asegurando la calidad en front-end Drupal
 
Workshop Calabash Appium
Workshop Calabash AppiumWorkshop Calabash Appium
Workshop Calabash Appium
 
Tecnologías para microservicios
Tecnologías para microserviciosTecnologías para microservicios
Tecnologías para microservicios
 
Workshop calabash appium
Workshop calabash appiumWorkshop calabash appium
Workshop calabash appium
 
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHPIntroducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
 
Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009
 
56874982 curso-de-delphi-7
56874982 curso-de-delphi-756874982 curso-de-delphi-7
56874982 curso-de-delphi-7
 
Presentacion remobjects
Presentacion remobjectsPresentacion remobjects
Presentacion remobjects
 
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos AiresPresentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
 
JRuby al Rescate de J2EE
JRuby al Rescate de J2EEJRuby al Rescate de J2EE
JRuby al Rescate de J2EE
 
JAVASCRIPT.pptx
JAVASCRIPT.pptxJAVASCRIPT.pptx
JAVASCRIPT.pptx
 
Curso TDD Ruby on Rails #02: Test Driven Development
Curso TDD Ruby on Rails #02: Test Driven DevelopmentCurso TDD Ruby on Rails #02: Test Driven Development
Curso TDD Ruby on Rails #02: Test Driven Development
 
El Mal Odiado Javascript
El Mal Odiado JavascriptEl Mal Odiado Javascript
El Mal Odiado Javascript
 
El Javascripto y los Emuladores de la Muerte
El Javascripto y los Emuladores de la MuerteEl Javascripto y los Emuladores de la Muerte
El Javascripto y los Emuladores de la Muerte
 
Spinach
SpinachSpinach
Spinach
 
5-Unidad 1: Introducción a la Plataforma .NET-1.3 Aplicaciones en C# .NET-Int...
5-Unidad 1: Introducción a la Plataforma .NET-1.3 Aplicaciones en C# .NET-Int...5-Unidad 1: Introducción a la Plataforma .NET-1.3 Aplicaciones en C# .NET-Int...
5-Unidad 1: Introducción a la Plataforma .NET-1.3 Aplicaciones en C# .NET-Int...
 
Php basico
Php basicoPhp basico
Php basico
 

Más de Alberto Perdomo

Primeros pasos con la base de datos de grafos Neo4j
Primeros pasos con la base de datos de grafos Neo4jPrimeros pasos con la base de datos de grafos Neo4j
Primeros pasos con la base de datos de grafos Neo4jAlberto Perdomo
 
Leveraging relations at scale with Neo4j
Leveraging relations at scale with Neo4jLeveraging relations at scale with Neo4j
Leveraging relations at scale with Neo4jAlberto Perdomo
 
Squire: A polyglot application combining Neo4j, MongoDB, Ruby and Scala @ FOS...
Squire: A polyglot application combining Neo4j, MongoDB, Ruby and Scala @ FOS...Squire: A polyglot application combining Neo4j, MongoDB, Ruby and Scala @ FOS...
Squire: A polyglot application combining Neo4j, MongoDB, Ruby and Scala @ FOS...Alberto Perdomo
 
Rails for Mobile Devices @ Conferencia Rails 2011
Rails for Mobile Devices @ Conferencia Rails 2011Rails for Mobile Devices @ Conferencia Rails 2011
Rails for Mobile Devices @ Conferencia Rails 2011Alberto Perdomo
 
Boost your productivity!: Productivity tips for rails developers - Lightning ...
Boost your productivity!: Productivity tips for rails developers - Lightning ...Boost your productivity!: Productivity tips for rails developers - Lightning ...
Boost your productivity!: Productivity tips for rails developers - Lightning ...Alberto Perdomo
 
Strangers In The Night: Ruby, Rack y Sinatra - Herramientas potentes para con...
Strangers In The Night: Ruby, Rack y Sinatra - Herramientas potentes para con...Strangers In The Night: Ruby, Rack y Sinatra - Herramientas potentes para con...
Strangers In The Night: Ruby, Rack y Sinatra - Herramientas potentes para con...Alberto Perdomo
 
Curso TDD Ruby on Rails #08: Buenas prácticas
Curso TDD Ruby on Rails #08: Buenas prácticasCurso TDD Ruby on Rails #08: Buenas prácticas
Curso TDD Ruby on Rails #08: Buenas prácticasAlberto Perdomo
 
Curso TDD Ruby on Rails #06: Mocks y stubs
Curso TDD Ruby on Rails #06: Mocks y stubsCurso TDD Ruby on Rails #06: Mocks y stubs
Curso TDD Ruby on Rails #06: Mocks y stubsAlberto Perdomo
 
Curso TDD Ruby on Rails #05: Shoulda
Curso TDD Ruby on Rails #05: ShouldaCurso TDD Ruby on Rails #05: Shoulda
Curso TDD Ruby on Rails #05: ShouldaAlberto Perdomo
 
Curso TDD Ruby on Rails #04: Factorías de objetos
Curso TDD Ruby on Rails #04: Factorías de objetosCurso TDD Ruby on Rails #04: Factorías de objetos
Curso TDD Ruby on Rails #04: Factorías de objetosAlberto Perdomo
 
Plugins de autenticación en Rails - Lightning talk Las Palmas On Rails 09/02/...
Plugins de autenticación en Rails - Lightning talk Las Palmas On Rails 09/02/...Plugins de autenticación en Rails - Lightning talk Las Palmas On Rails 09/02/...
Plugins de autenticación en Rails - Lightning talk Las Palmas On Rails 09/02/...Alberto Perdomo
 

Más de Alberto Perdomo (11)

Primeros pasos con la base de datos de grafos Neo4j
Primeros pasos con la base de datos de grafos Neo4jPrimeros pasos con la base de datos de grafos Neo4j
Primeros pasos con la base de datos de grafos Neo4j
 
Leveraging relations at scale with Neo4j
Leveraging relations at scale with Neo4jLeveraging relations at scale with Neo4j
Leveraging relations at scale with Neo4j
 
Squire: A polyglot application combining Neo4j, MongoDB, Ruby and Scala @ FOS...
Squire: A polyglot application combining Neo4j, MongoDB, Ruby and Scala @ FOS...Squire: A polyglot application combining Neo4j, MongoDB, Ruby and Scala @ FOS...
Squire: A polyglot application combining Neo4j, MongoDB, Ruby and Scala @ FOS...
 
Rails for Mobile Devices @ Conferencia Rails 2011
Rails for Mobile Devices @ Conferencia Rails 2011Rails for Mobile Devices @ Conferencia Rails 2011
Rails for Mobile Devices @ Conferencia Rails 2011
 
Boost your productivity!: Productivity tips for rails developers - Lightning ...
Boost your productivity!: Productivity tips for rails developers - Lightning ...Boost your productivity!: Productivity tips for rails developers - Lightning ...
Boost your productivity!: Productivity tips for rails developers - Lightning ...
 
Strangers In The Night: Ruby, Rack y Sinatra - Herramientas potentes para con...
Strangers In The Night: Ruby, Rack y Sinatra - Herramientas potentes para con...Strangers In The Night: Ruby, Rack y Sinatra - Herramientas potentes para con...
Strangers In The Night: Ruby, Rack y Sinatra - Herramientas potentes para con...
 
Curso TDD Ruby on Rails #08: Buenas prácticas
Curso TDD Ruby on Rails #08: Buenas prácticasCurso TDD Ruby on Rails #08: Buenas prácticas
Curso TDD Ruby on Rails #08: Buenas prácticas
 
Curso TDD Ruby on Rails #06: Mocks y stubs
Curso TDD Ruby on Rails #06: Mocks y stubsCurso TDD Ruby on Rails #06: Mocks y stubs
Curso TDD Ruby on Rails #06: Mocks y stubs
 
Curso TDD Ruby on Rails #05: Shoulda
Curso TDD Ruby on Rails #05: ShouldaCurso TDD Ruby on Rails #05: Shoulda
Curso TDD Ruby on Rails #05: Shoulda
 
Curso TDD Ruby on Rails #04: Factorías de objetos
Curso TDD Ruby on Rails #04: Factorías de objetosCurso TDD Ruby on Rails #04: Factorías de objetos
Curso TDD Ruby on Rails #04: Factorías de objetos
 
Plugins de autenticación en Rails - Lightning talk Las Palmas On Rails 09/02/...
Plugins de autenticación en Rails - Lightning talk Las Palmas On Rails 09/02/...Plugins de autenticación en Rails - Lightning talk Las Palmas On Rails 09/02/...
Plugins de autenticación en Rails - Lightning talk Las Palmas On Rails 09/02/...
 

Último

Actividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolarActividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolar24roberto21
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersIván López Martín
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxAlexander López
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosAlbanyMartinez7
 
LINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptx
LINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptxLINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptx
LINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptxkimontey
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfKarinaCambero3
 
Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)JuanStevenTrujilloCh
 
Slideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan GerenciaSlideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan Gerenciacubillannoly
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfedepmariaperez
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfcristianrb0324
 
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docxPLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docxhasbleidit
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxtjcesar1
 
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docxobandopaula444
 
Análisis de Artefactos Tecnologicos (3) (1).pdf
Análisis de Artefactos Tecnologicos  (3) (1).pdfAnálisis de Artefactos Tecnologicos  (3) (1).pdf
Análisis de Artefactos Tecnologicos (3) (1).pdfsharitcalderon04
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúCEFERINO DELGADO FLORES
 
Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1ivanapaterninar
 
Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...
Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...
Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...Marketing BRANDING
 
Trabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointTrabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointValerioIvanDePazLoja
 
David_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDavid_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDAVIDROBERTOGALLEGOS
 

Último (20)

Actividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolarActividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolar
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 Testcontainers
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos Juridicos
 
LINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptx
LINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptxLINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptx
LINEA DE TIEMPO LITERATURA DIFERENCIADO LITERATURA.pptx
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdf
 
Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)
 
El camino a convertirse en Microsoft MVP
El camino a convertirse en Microsoft MVPEl camino a convertirse en Microsoft MVP
El camino a convertirse en Microsoft MVP
 
Slideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan GerenciaSlideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan Gerencia
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdf
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdf
 
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docxPLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
 
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
 
Análisis de Artefactos Tecnologicos (3) (1).pdf
Análisis de Artefactos Tecnologicos  (3) (1).pdfAnálisis de Artefactos Tecnologicos  (3) (1).pdf
Análisis de Artefactos Tecnologicos (3) (1).pdf
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
 
Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1
 
Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...
Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...
Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...
 
Trabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointTrabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power Point
 
David_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDavid_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptx
 

Curso de Testing OSL con Cucumber y BDD

  • 1. CURSO DE TESTING OSL 12 – 16 DE ABRIL 2010 Cucumber y BDD Alberto Perdomo Web: http://albertoperdomo.net Email: alberto.perdomo@aentos.es Twitter: @albertoperdomo http://www.aentos.com
  • 2. EL PROBLEMA DEL ENTENDIMIENTO → Los clientes hablan el lenguaje de su negocio → Los desarrolladores hablan lenguaje técnico → ¿Cómo escribir especifcaciones que podamos entender todos?
  • 3. EL MOVIMIENTO BDD → BDD = Behaviour Driven Development → una nueva forma de enfocar el TDD → Origen: Dan North → http://blog.dannorth.net/introducing-bdd/ → Criterios de aceptación ejecutables
  • 4. EL MOVIMIENTO DSL → DSL = Domain Specifc Languange → Lenguaje de programación enfocado a un determinado problema o dominio en particular → Negocios → Construcción → ...
  • 5. CUCUMBER CUCUMBER = TESTING + BDD + DSL + Especifcaciones legibles → ¡Criterios de aceptación ejecutables!
  • 6. CUCUMBER → Librería de tests de aceptación → ¡Historias de usuario! (en texto plano) como criterios de aceptación y test → Web en http://cukes.info/
  • 8. FEATURE: CARACTERÍSTICA BUSINESS VALUE Feature: Some terse yet descriptive text of what is desired In order to realize a named business value As an explicit system actor I want to gain some beneficial outcome which furthers the goal Scenario: Some determinable business situation ¿Para qué sirve esta Given some precondition Funcionalidad? And some other precondition When some action by the actor And some other action ¿Qué valor aporta? And yet another action Then some testable outcome is achieved ¿A quién va dirigida? And something else we can check happens too Scenario: A different situation ... ¡HISTORIA DE USUARIO Y TEST EJECUTABLE! No tengas más de 4-6 escenarios por característica e intenta separar las características de forma que tengan sentido
  • 9. SCENARIOS Una característica puede tener mútiples escenarios ESCENARIO Feature: Some terse yet descriptive text of what is desired In order to realize a named business value As an explicit system actor I want to gain some beneficial outcome which furthers the goal Scenario: Some determinable business situation Caso de uso, Given some precondition Ejemplo 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 Scenario: A different situation ... GIVEN-WHEN-THEN steps ¡uno por línea!
  • 10. GIVEN-WHEN-THEN Given → Precondición When → Acción Then → Resultado And / But → conectar steps ¡El orden no importa!
  • 11. CUCUMBER: ELEMENTOS FEATURE features/login.feature CRITERIOS DE Given a user with email "admin@example.com" ACEPTACIÓN (TEXTO PLANO) Cucumber busca la defnición de los steps usando expresiones regulares features/step_defnitions/user_steps.rb STEP DEFINITIONS Given /^a user with email "(.*)"$/ do |email| user = Factory(:user, :email => email) (RUBY) end
  • 12. CUCUMBER: STEPS → ¡Los steps son reusables! (si se escriben bien) → Utiliza variables → Utiliza parámetros o variables opcionales When /^I login as "(.*)"$/ do |login| visit login_path fill_in("Login", :with => login) fill_in("Password", :with => "secret") click_button("Login") end
  • 13. CUCUMBER: PROBLEMA Pero... el cliente y yo hablamos español, no inglés...
  • 14. CUCUMBER: IDIOMAS Cucumber soporta idiomas → ¡español! Feature → Característica Scenario → Escenario Given-When-Then → Dado-Cuando-Entonces And/But → Y/Pero … ...
  • 15. CUCUMBER: EJEMPLO EN ESPAÑOL Hay que defnir el idioma en el que está escrito el feature #language: es Característica: Empresas gestión Para tener una relación de las empresas con las que trabajo Como usuario con rol admin Administro las empresas en el sistema Escenario: Registro de una nueva empresa Dado un usuario con rol "admin" "Fred" Cuando inicio sesión como "Fred" Y visito el listado de empresas Cuando pulso el enlace "Nueva empresa" Y registro una empresa Entonces debería ver "Empresa registrada correctamente" Y debería ver "Listado de empresas"
  • 16. LIBRERÍAS Y STEPS GENÉRICOS → Librerías para probar aplicaciones Rails, Javascript y en general cualquier aplicación (web o no) → Rails → PHP, Java, .NET → una web cualquier, p.ej. Google → Steps predefnidos para lo más común: → Pulsar botones, seguir enlaces, rellenar campos, comprobar la presencia de textos, etc.
  • 17. CUCUMBER FEATURES STEPS Libs. de tests para web Factorías, Otras libs. (emulan o usan un navegador) Mocks, ... en Ruby APLICACIÓN
  • 18. LIBRERÍAS PARA WEB Capybara, Webrat, etc. → Emulando un navegador: más rápido, sin JS → Utilizando un navegador: más lento, con JS → Culerity (sin interfaz gráfco, ideal) → Selenium (Firefox) → Watir (Firefox, Safari, Chrome, IE) → ...
  • 19. LA VELOCIDAD IMPORTA Para probar funcionalidades estándar → modo emulación → velocidad Para probar funcionalidades con AJAX o con efectos JS → modo navegador → más lento → culerity (relativamente rápido, no hay interfaz gráfca) → otros (más lento pero sirve para probar en navegadores específcos)
  • 20. WEBRAT vs. CAPYBARA Webrat → compatible con muchos navegadores → se lanzan las pruebas en un modo espec., p.ej. Selenium → hay que lanzar las pruebas con/sin JS de forma separada Capybara → más reciente, confguración más sencilla → igual o más compatible → se puede cambiar la sesión en una misma ejecución de tests → API compatible con Webrat
  • 21. CUCUMBER: VENTAJAS → Criterios de aceptación → Especifcación y test → en un mismo documento → en el lenguaje del cliente → en su idioma → vocabulario compartido → Evitamos confusiones al transformar especifcación en funcionalidades o tests unitarios → Ayudar a enfocarnos en las funcionalidades más valiosas → Documentación
  • 22. MUCHO MÁS → Hooks → Tags → Tagged hooks → Multiline arguments → FIT tables → Background
  • 23. CUCUMBER EN RAILS: ESTRUCTURA features/ → directorio de cucumber features/*.feature → características features/login.feature features/realizar_pedido.feature ... features/step_defnitions/*.rb → implementación de los steps features/step_defnitions/web_steps.rb → steps para visitar, clickar, etc. (de serie) features/step_defnitions/web_steps_es.rb → traducción al español (de serie) features/step_defnitions/pedido_steps.rb → steps relacionados con pedidos ... features/support/env.rb → conf. de cucumber features/support/paths.rb → traducción de rutas
  • 24. STEPS WEB EN ESPAÑOL I Dado /^que estoy en (.+)$/ do |page_name| Given %{I am on #{page_name}} end Cuando /^voy a (.+)$/ do |page_name| When %{I go to #{page_name}} end Cuando /^pulso "([^"]*)"$/ do |button| When %{I press "#{button}"} end Cuando /^hago click en "([^"]*)"$/ do |link| When %{I follow "#{link}"} end Cuando /^completo "([^"]*)" con "([^"]*)"$/ do |field, value| When %{I fill in "#{field}" with "#{value}"} end ¡Vienen de serie!
  • 25. STEPS WEB EN ESPAÑOL II Cuando /^selecciono "([^"]*)" de "([^"]*)"$/ do |value, field| When %{I select "#{value}" from "#{field}"} end Entonces /^debería ver "([^"]*)"$/ do |text| Then %{I should see "#{text}"} end Entonces /^no debería ver "([^"]*)"$/ do |text| Then %{I should not see "#{text}"} end Entonces /^debería estar en (.+)$/ do |page_name| Then %{I should be on #{page_name}} end Entonces /^múestrame la página$/ do Then %{show me the page} end y muchos más...
  • 26. IMPLEMENTACIÓN DE STEPS Given /^(?:|I )am on (.+)$/ do |page_name| visit path_to(page_name) end When /^(?:|I )go to (.+)$/ do |page_name| visit path_to(page_name) end When /^(?:|I )press "([^"]*)"(?: within "([^"]*)")?$/ do |button, selector| with_scope(selector) do click_button(button) end end When /^(?:|I )follow "([^"]*)"(?: within "([^"]*)")?$/ do |link, selector| with_scope(selector) do click_link(link) end end When /^(?:|I )fill in "([^"]*)" with "([^"]*)"(?: within "([^"]*)")?$/ do |field, value, selector| with_scope(selector) do fill_in(field, :with => value) end end
  • 27. EJEMPLO BDD: PASO 1 Defnimos el valor de negocio y un escenario features/sesion.feature #language: es Característica: Iniciar y cerrar sesión Para poder identificarme correctamente y realizar mis pedidos de forma segura Como usuario Quiero poder iniciar y cerrar sesión Escenario: Login correcto Dado un usuario con email "roger@test.com" Cuando voy a la portada Y inicio sesión como "roger@test.com" Entonces debería ver "Bienvenido"
  • 28. EJEMPLO BDD: PASO 2 Ejecutamos el escenario $ cucumber features/sesion.feature VERDE: OK AMARILLO: NO DEFINIDO AZUL: SALTADO ROJO: ERROR Resumen Ayuda para Implementar los steps
  • 29. EJEMPLO BDD: PASO 3 Implementar el primer step pendiente (si lo hay) features/step_defnitions/user_steps.rb Dado /^un usuario con email "([^"]*)"$/ do |email| Factory(:user, :email => email) end
  • 30. EJEMPLO BDD: PASO 4 Volvemos a ejecutar el escenario Ejecutar de nuevo Si hay errores → paso 5 Si hay steps pendientes → paso 3 Si está todo OK → siguiente escenario o característica
  • 31. EJEMPLO BDD: PASO 3 Implementar o arreglar el step features/step_defnitions/web_steps_es.rb features/support/paths.rb Cuando /^voy a (.+)$/ do |page_name| module NavigationHelpers When %{I go to #{page_name}} end def path_to(page_name) case page_name when /la portada/ '/' features/step_defnitions/web_steps.rb .... When /^(?:|I )go to (.+)$/ do |page_name| visit path_to(page_name) end Añadimos la ruta
  • 32. EJEMPLO BDD: PASO 4 Volvemos a ejecutar el escenario Ejecutar de nuevo Si hay errores → paso 5 Si hay steps pendientes → paso 3 Si está todo OK → siguiente escenario o característica
  • 33. EJEMPLO BDD: PASO 5 Implementar la funcionalidad para que el step pase confg/routes.rb map.root :controller => "user_sessions", :action => "new" # optional, this just sets the root route
  • 34. EJEMPLO BDD: PASO 6 Volvemos a ejecutar el escenario Ejecutar de nuevo Si hay errores → paso 5 Si hay steps pendientes → paso 3 Si está todo OK → siguiente escenario o característica
  • 35. EJEMPLO BDD: PASO 3 Implementar o arreglar el step features/step_defnitions/user_steps.rb Cuando /^inicio sesión con email "([^"]*)"$/ do |email| fill_in("Email", :with => email) fill_in("Contraseña", :with => "secret") click_button("Acceder") end
  • 36. EJEMPLO BDD: PASO 4 Volvemos a ejecutar el escenario Ejecutar de nuevo Si hay errores → paso 5 Si hay steps pendientes → paso 3 Si está todo OK → siguiente escenario o característica
  • 37. EJEMPLO BDD: PASO 5 Implementar la funcionalidad para que el step pase app/controllers/user_sessions_controller.rb class UserSessionsController < ApplicationController before_filter :require_no_user, :only => [:new, :create] before_filter :require_user, :only => :destroy def new @user_session = UserSession.new end app/views/user_sessions/new.html.erb <h1>Iniciar sesión</h1> <% form_for @user_session, :url => user_session_path do |f| %> <%= f.error_messages %> <%= f.label :email %><br /> <%= f.text_field :email %><br /> <br /> <%= f.label :password, "Contraseña" %><br /> <%= f.password_field :password %><br /> <br /> <%= f.check_box :remember_me, "No cerrar sesión" %><%= f.label :remember_me %><br /> <br /> <%= f.submit "Iniciar sesión" %> <% end %>
  • 38. EJEMPLO BDD: PASO 6 Ejecutar de nuevo Si hay errores → paso 5 Si hay steps pendientes → paso 3 Si está todo OK → siguiente escenario o característica
  • 39. EJEMPLO BDD: PASO 5 Implementar la funcionalidad para que el step pase app/controllers/user_sessions_controller.rb class UserSessionsController < ApplicationController before_filter :require_no_user, :only => [:new, :create] before_filter :require_user, :only => :destroy def new @user_session = UserSession.new end def create @user_session = UserSession.new(params[:user_session]) if @user_session.save flash[:notice] = "Bienvenido" redirect_back_or_default account_url else render :action => :new end end
  • 40. EJEMPLO BDD: PASO 6 Ejecutar de nuevo Si hay errores → paso 5 Si hay steps pendientes → paso 3 Si está todo OK → siguiente escenario o característica TODO VERDE → HEMOS ACABADO