6. Desarrollo Dirigido por Pruebas
(TDD)
Solo hay 3 reglas:
1. No se permite escribir código de producción al menos
que sea con el objetivo de escribir una prueba que
esta fallando.
2. No se permite escribir más código de prueba del que
sea necesario para que la prueba falle.
3. No se permite escribir más código de producción del
que es suficiente para pasar la prueba que falla.
7. Desarrollo Dirigido por Pruebas
(TDD)
¡TDD funciona!
No, es broma.
Es broma, ¡en serio!
De manera más precisa:
Es muy difícil de hacer TDD de manera correcta.
Para la mayoría no es posible.
Muchos terminan conformándose con hacer
pruebas unitarias, pero no TDD.
8. Obstáculos para implementar TDD (1/2)
Tiempos comprometidos.
Requiere conocer más técnicas/herramientas.
jUnit y derivados
TestNG y derivados
Mocks
etc
Desconocimiento de los criterios sobre qué constituye una
buena prueba unitaria.
ATRIP
(Automated, Thorough, Repeteable, Independent, Professi
onal).
9. Obstáculos para implementar TDD (2/2)
Malentendidos
Aunque involucra la palabra „test‟…
TDD no es una técnica de pruebas
¡Es una técnica de diseño y codificación!
Las herramientas
No ayudan a asimilar la idea de diseñar mediante la codificación de
pruebas.
11. Descripción de BDD
¿Qué es?
Método de diseño y codificación
Que integra pruebas.
De aceptación
Unitarias
Orienta a un desarrollo “outside -> In”
Define el uso de un DSL para pruebas
Un subconjunto del lenguaje natural
12. Lenguaje específico de dominio (DSL)
¿Qué es?
“Un lenguaje de programación o especificación
dedicado a un dominio de problema particular”
Características:
Especializado en una sola cosa
Mas expresivo, mas eficiente, pero limitado
Ejemplos muy conocidos:
SQL, Wiki Markup, Mathematica, etc.
13. Ejemplo simple (1/2)
1. Escribe un escenario (parte de un feature)
Feature: Search
In order to learn more
As an information seeker
I want to find more information when I need it
Scenario: Find what I‟ looking for
Given I am on the Kvasir search page
When I search for “cucumber github”
Then I should see
“””
Behavior Driven Development
“””
14. Ejemplo simple (1/2)
2. Escribe el código que ejercita el feature
Given /^I am on the Kvasir search page$/ do
visit(„http://www.kvasir.mx/‟)
end
When /^I search for “cucumber github”$/ do
fill_in(„q‟, :with => query)
click_button(„go‟)
end
Then /^I should see $/ do |text|
response_body.should contain(text)
end
3. Escribe el código que implementa la funcionalidad
15. DSL para pruebas de aceptación
Enfoque del DSL en pruebas de aceptación.
Describe las pruebas en el lenguaje del negocio.
Cliente Analista/ Tester
Desarrollador
Leer
Escribir
16. Desarrollo Políglota en la JVM
Java Groovy JRuby Jython Scala Clojure ???
Máquina Virtual Java
17.
18. Aplicación Ejemplo
Desarrollada en un curso de
capacitación
2 módulos: motor y ui
2 interfaces de usuario:
Linea de comandos
Swing
19. Escenario simple (motor)
Feature: pawns can make only valid movements
We want to be sure a pawn can only move
from a given initial position to a valid final position
Scenario: advance 1 position
Given a board with a black Pawn in A7
And no other piece in the board
When I choose to move the Pawn to A6
Then the Pawn should be in A6
20. Definición de pasos en groovy (1/2)
Given(~"a board with a (w+) (w+) in (w)(d+)") { String
color, type, column, row ->
this.board = new Board()
def clazz = "com.certum.training.chess.pieces.${type}" as Class
this."${type}" = clazz.newInstance(board, column, row,
ChessPiece."${color.toUpperCase()}")
board.set(this."${type}", column, row)
}
Given(~"no other piece in the board") {
board.gameStarted()
}
21. Definición de pasos en groovy (2/2)
When(~"I choose to move the (w+) to (w+)(d+)") { String type, column, row ->
this."${type}".move(column, row)
}|
Then(~"the (w+) should be in (w+)(d+)") { String type, column, row ->
assert column == this."${type}".getColumn()
assert row == this."${type}".row
}
22. Plantilla de escenarios
Scenario Outline: advance 2 positions
Given a board with a <color> Pawn in <init_column><init_row>
And no other piece in the board
When I choose to move the Pawn to <final_column><final_row>
Then the Pawn should be in <final_column><final_row>
Scenarios: All valid 2 position movements
| color | init_column | init_row | final_column | final_row |
| white | A | 2 | A | 4 |
| white | B | 2 | B | 4 |
| white | C | 2 | C | 4 |
….
| black | E | 7 | E | 5 |
| black | F | 7 | F | 5 |
| black | G | 7 | G | 5 |
| black | H | 7 | H | 5 |
23. Definición de pasos (groovy)
¡ Ninguno nuevo!
Los pasos ya están implementados =)
De manera tabular puedes probar tantos
escenarios como necesites.
24. Beneficios de BDD
En cuanto a requerimientos
Ejecutables, sin ambigüedades, útiles.
En pequeños fragmentos
En la Administración de proyectos
Las historias pueden ser estimadas (pequeños
fragmentos de información)
25. Pero hay más …
Automatizando las pruebas de aceptación
tenemos…
Capacidad de realizar pruebas de regresión.
Proceso de “release” mas confiable.
Encontramos más bugs con menos esfuerzo.
27. Referencias…
Artículo de Dan North (creador de BDD).
http://bit.ly/ay8sjI
Libro: The Rspec Book
Reflección sobre BDD y TDD
http://bit.ly/dkDcG2
cuke4duke
http://bit.ly/95XUtc