4. 4 Agenda Desarrollo Dirigido por Pruebas (TDD) Obstáculos al implementar TDD Descripción de BDD Lenguajes específicos de dominio (DSL) Ejemplo simple de BDD Ejemplos ‘en vivo’: Chess Beneficios de BDD
5. DesarrolloDirigidoporPruebas (TDD) En TDD, las pruebas SON LA ESPECIFICACIÓN DEL SISTEMA La cual es ejecutable. Diseñay Codificaprueba EjecutaPrueba Codifica EjecutaPrueba Refactor
6. Obstáculosparaimplementar TDD Tiempos comprometidos. Requiere conocer más técnicas/herramientas. Criterios sobre qué constituye una buena prueba unitaria. ATRIP (Automated, Thorough, Repeteable, Independent, Professional) 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 con pruebas.
8. 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
9. Lenguaje especifico 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 cosa, pero bien hecha Mas expresivo, mas eficiente, pero limitado Muy alto nivel de descripción Ejemplos muy conocidos: SQL, Wiki Markup, Mathematica, etc.
11. Ejemplo simple de BDD 2. Escribe el código que ejercita el feature (el código de prueba) 3. Escribe el código que implementa la funcionalidad
12. DSL para pruebas de aceptación Enfoque del DSL en pruebas de aceptación. Describe las pruebas en el lenguaje del negocio. Aprovecha el interés reciente en la especificación del escenario.
15. AplicaciónEjemplo Desarrollada en un curso de capacitación Estudiantes que no sabían POO Mucho menos Java! 2 módulos: motor y ui 2 interfaces de usuario: Linea de comandos Swing Tiene algunas pruebas unitarias
16. 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
17. Definición de pasos (groovy) 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() } 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 }
18. Plantilla de escenario simple 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 |
22. Beneficios de BDD En la Administración de proyectos Las historias pueden ser estimadas (pequeños fragmentos de información) Se puede medir el “velocity” Se puede medir la eficiencia
23. Pero hay mas … Automatizando las pruebas de aceptación tenemos… Requerimientos ejecutables (y menos ambiguos) Capacidad de realizar pruebas de regresión Proceso de “release” mas confiable Encontramos más bugs.
25. Referencias… Artículo de Dan North (creador de BDD). http://bit.ly/ay8sjI Libro: TheRspecBook Reflección sobre BDD y TDD http://bit.ly/dkDcG2 cuke4duke http://bit.ly/95XUtc