Kata Tenis Completa Paso a Paso. Python Sevilla 30/11/2012
Upcoming SlideShare
Loading in...5
×
 

Kata Tenis Completa Paso a Paso. Python Sevilla 30/11/2012

on

  • 1,434 views

Kata tenis en Python paso a paso con

Kata tenis en Python paso a paso con

Statistics

Views

Total Views
1,434
Views on SlideShare
1,432
Embed Views
2

Actions

Likes
2
Downloads
16
Comments
0

2 Embeds 2

http://www.slashdocs.com 1
https://twitter.com 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Kata Tenis Completa Paso a Paso. Python Sevilla 30/11/2012 Kata Tenis Completa Paso a Paso. Python Sevilla 30/11/2012 Presentation Transcript

  • Kata con Python Python-Sevilla
  • Objetivos • Estudiar paso a paso cómo resolver la kata Tenis con TDD y Python • Exponer errores y ver la manera de detectarlos. • Comparar distintas soluciones desarrolladas con TDD.Objetivos 2
  • Índice 1. Repaso de TDD 2. Kata Tennis. 3. PowerPoint-Driven Development. 4. Primer diseño (y pruebas). 5. Continuamos. 6. Refactorizar la clase Player. 7. El Partido de Tenis. 8. Random tennis 9. Conclusiones.Índice 10. Otras soluciones. 11. Extra 3 View slide
  • Repaso de TDD 4 View slide
  • 2. El proceso TDDEl proceso de TDD
  • 2. El Proceso TDDEscribimos un test que ponga de relieve funcionalidad que queremos implementarSi la prueba no falla estudiamos qué está sucediendo y elegimos otra. Escribimos el código mínimo (más corto) para que la prueba pase con éxito. No nos preocupamos de escribirlo bonito, tenemos libertad para tomar atajos
  • 2. El Proceso TDD Ejecutamos la prueba y cambiamos el código hasta que la prueba funciona. Quitamos los atajos y refactorizamos el código y las pruebas.Y cómo Triangulando, completando el conjunto decontinuamos? pruebas o eligiendo una nueva funcionalidad.
  • Kata: Tennis 8
  • Cata - Tenis Reglas • un jugador comienza con puntación 0. • Los puntos se ganan en esta secuencia: 0 -> 15 -> 30 - > 40. • Si un jugador consigue 40 y puntúa de nuevo, el jugador gana el juego si el otro no tiene 40 puntos. • Si los dos jugadores tienen al mismo tiempo 40 puntos, se llama "iguales" (deuce en inglés) • Puntuar durante iguales, da al jugador "ventaja". Si el otro jugador puntúa en ese momento, la puntuación vuelve a iguales. • Si un jugador tiene "ventaja" y puntúa de nuevo, el jugador gana el juego.http://www.solveet.com/exercises/Kata-Tennis/13 9
  • Cata - Tenis Metas: • Los jugadores deben poder ganar puntos. • El juego debe terminar con un ganador. • Debes de manejar la casuística de "iguales" • Después de terminar el juego, debe determinarse quién es el ganador. • Debe ser posible obtener la puntuación de cualquier de los jugadores en cualquier momento del partido. 10
  • PowerPoint-Driven Development 11
  • La primera prueba No intentes hacerlo todo de golpe. • Elige algo pequeño y simple. • Escribe una prueba que lo muestre. • Codifica la prueba. • Por ejemplo: pasar de 0 a 15 o el match aún no ha terminado 12
  • La Segunda Prueba ¿…y ahora? • ¿Cuál es la prueba que te hace avanzar más? • Por ejemplo puedes continuar con las puntuaciones hasta la casuística de los 40. • Recuerda refactorizar. 13
  • Ha pasado el tiempo ¿atascado? • No te preocupes si tienes que volver a empezar. • No es una pérdida de tiempo. Ya verás como la siguiente vez te sale MUCHO MEJOR. 14
  • Esto se acaba ¿Has terminado?• ¿Y si intentas simular una partida de tenis con números aleatorios?. ¿No has terminado?• Refactoriza y que quede bonito 15
  • Primer diseño (y pruebas) 16
  • Primeros pasosMetas:• Los jugadores deben poder ganar puntos. Tenemos que empezar por• El juego debe terminar con algo. ¿Por dónde? un ganador.• Debes de manejar la casuística de "iguales"• Después de terminar el juego, debe determinarse quién es el ganador. Mover• Debe ser posible obtener la puntuación de cualquier de los jugadores en cualquier momento del partido. 17
  • Primeros pasos Ejemplos prácticos (candidatos a casos de prueba)Acción Estado Resultado-- El jugador no ha anotado ningún tanto 0 puntosJugador anota un tanto Sin puntos 15 puntosJugador anota un tanto 15 puntos 30 puntosJugador anota un tanto 30 puntos 40 puntosJugador anota un tanto 40 puntos y el otro jugador no tiene 40 puntos GanaJugador anota un tanto 40 puntos y el otro jugador tiene 40 puntos VentajaJugador anota un tanto 40 puntos y el otro jugador tiene ventaja Se queda como está y el otro jugador vuelve a 40 puntosJugador anota un tanto Ventaja Gana 8 casos de prueba posibles 18
  • Primeros pasos Manos a la obraAcción Estado Resultado-- El jugador no ha anotado ningún tanto 0 puntosJugador anota un tanto Sin puntos 15 puntosJugador anota un tanto 15 puntos 30 puntosJugador anota un tanto 30 puntos 40 puntosJugador anota un tanto 40 puntos y el otro jugador no tiene 40 puntos GanaJugador anota un tanto 40 puntos y el otro jugador tiene 40 puntos VentajaJugador anota un tanto 40 puntos y el otro jugador tiene ventaja Se queda como está y el otro jugador vuelve a 40 puntosJugador anota un tanto Ventaja Gana 8 casos de prueba posibles 19
  • Primeros pasos ¿Cómo será nuestra prueba? 1 • ¿Cómo creamos un jugador? 2 • No hay nada que hacer 3 • ¿Cómo conocemos la puntuación de un jugador? • ¿Cómo se expresa la Con nuestra primera prueba vamos a puntuación del jugadorempezar a contestar a estas preguntas y, así,veremos si elegimos una buena alternativa o no
  • Primeros PasosTambién hemos tomado muchas decisiones de diseño. He decidido crear un módulo Tennis que contiene una clase Player He decidido utilizar un constructor sin parámetros He decidido añadir un método sin parámetros para saber la puntuación de ese jugador He decidido que la puntuación sea una cadena de texto
  • Primeros PasosCentramos nuestro foco en escribir el mínimo códigopara pasar esta prueba…
  • Primeros Pasos Para cambiar esto necesitaré más adelante una prueba que me haga cambiarlo. A por ello.Nada que refactorizar: ni código ni pruebas.
  • Primeros pasos Ejemplos prácticos (candidatos a casos de prueba)Acción Estado Resultado-- El jugador no ha anotado ningún tanto 0 puntosJugador anota un tanto Sin puntos 15 puntosJugador anota un tanto 15 puntos 30 puntosJugador anota un tanto 30 puntos 40 puntosJugador anota un tanto 40 puntos y el otro jugador no tiene 40 puntos GanaJugador anota un tanto 40 puntos y el otro jugador tiene 40 puntos VentajaJugador anota un tanto 40 puntos y el otro jugador tiene ventaja Se queda como está y el otro jugador vuelve a 40 puntosJugador anota un tanto Ventaja Gana 24
  • Primeros Pasos DespuésAntes Triangulación.Podríamos refactorizar algunos detalles.
  • Primeros Pasos Ya tenemos nuestras primeras pruebas listas y nuestro código crece…. Pero, ¿qué estamos haciendo?• Estamos diseñando cómo implementamos la puntuación de un jugador.• Estamos diseñando cómos otras partes del código indicarán que un jugador ha puntuado.• Estamos entrando en foco más en diseñar el código qué nos es útil que en implementar el problema.
  • Continuamos 27
  • Pruebas de anotación Ejemplos prácticos (candidatos a casos de prueba)Acción Estado Resultado-- El jugador no ha anotado ningún tanto 0 puntosJugador anota un tanto Sin puntos 15 puntosJugador anota un tanto 15 puntos 30 puntosJugador anota un tanto 30 puntos 40 puntosJugador anota un tanto 40 puntos y el otro jugador no tiene 40 puntos GanaJugador anota un tanto 40 puntos y el otro jugador tiene 40 puntos VentajaJugador anota un tanto 40 puntos y el otro jugador tiene ventaja Se queda como está y el otro jugador vuelve a 40 puntosJugador anota un tanto Ventaja Gana 28
  • Pruebas de anotación
  • Pruebas de anotación Mal olor: demasiado código repetido, diseño difícil de probar.Esta refactorización nos pone de relieve otro problema…que ignoramos
  • Pruebas de anotación Ejemplos prácticos (candidatos a casos de prueba) Acción Estado Resultado -- El jugador no ha anotado ningún tanto 0 puntos Jugador anota un tanto Sin puntos 15 puntos Jugador anota un tanto 15 puntos 30 puntos Jugador anota un tanto 30 puntos 40 puntos Jugador anota un tanto 40 puntos y el otro jugador no tiene 40 puntos Gana Jugador anota un tanto 40 puntos y el otro jugador tiene 40 puntos Ventaja Jugador anota un tanto 40 puntos y el otro jugador tiene ventaja Se queda como está y el otro jugador vuelve a 40 puntos Jugador anota un tanto Ventaja GanaParece que vamos avanzando. 31
  • El segundo jugador 32
  • Anotando con el segundo jugador Necesitamos al segundo jugador.Acción Estado Resultado-- El jugador no ha anotado ningún tanto 0 puntosJugador anota un tanto Sin puntos 15 puntosJugador anota un tanto 15 puntos 30 puntosJugador anota un tanto 30 puntos 40 puntosJugador anota un tanto 40 puntos y el otro jugador no tiene 40 puntos GanaJugador anota un tanto 40 puntos y el otro jugador tiene 40 puntos VentajaJugador anota un tanto 40 puntos y el otro jugador tiene ventaja Se queda como está y el otro jugador vuelve a 40 puntosJugador anota un tanto Ventaja Gana 33
  • Anotando con el segundo jugadorLas pruebas anteriores ya no se ejecutan porque no les pasaba un jugador (ni los necesitaban). Hay que arreglarlo ?
  • Anotando con el segundo jugadorNo ha sido una buena prueba, no he introducido nada quenecesitara ni que haya hecho crecer mi código.
  • Anotando con el segundo jugador Necesitamos al segundo jugador. Acción Estado Resultado -- El jugador no ha anotado ningún tanto 0 puntos Jugador anota un tanto Sin puntos 15 puntos Mover derecha 15 puntos 30 puntos Mover derecha 30 puntos 40 puntos Mover derecha 40 puntos y el otro jugador no tiene 40 puntos Gana Mover derecha 40 puntos y el otro jugador tiene 40 puntos Ventaja Mover derecha 40 puntos y el otro jugador tiene ventaja Se queda como está y el otro jugador vuelve a 40 puntos Mover derecha Ventaja GanaHace evolucionar mi sistema. 36
  • Anotando con el segundo jugadorLas pruebas anteriores ya no se ejecutan porque a veces el segundo jugador es “None”. Hay que arreglarlo.
  • Anotando con el segundo jugadorUn apaño (añadir a un segundo jugador como parámetro y hacerloNone para que mis pruebas anteriores ejecuten) olor me lleva aotro mal olor (ver si tengo un segundo jugador o no).Mejor simplificar y que todas las pruebas trabajen con un segundojugador refactorizar.
  • Anotando con el segundo jugador Necesitamos al segundo jugador. Acción Estado Resultado -- El jugador no ha anotado ningún tanto 0 puntos Jugador anota un tanto Sin puntos 15 puntos Jugador anota un tanto 15 puntos 30 puntos Jugador anota un tanto 30 puntos 40 puntos Jugador anota un tanto 40 puntos y el otro jugador no tiene 40 puntos Gana Jugador anota un tanto 40 puntos y el otro jugador tiene 40 puntos Ventaja Jugador anota un tanto 40 puntos y el otro jugador tiene ventaja Se queda como está y el otro jugador vuelve a 40 puntos Jugador anota un tanto Ventaja GanaEsta es la última prueba clave. 39
  • Anotando con el segundo jugador
  • Anotando con el segundo jugador La última prueba. Acción Estado Resultado -- El jugador no ha anotado ningún tanto 0 puntos Jugador anota un tanto Sin puntos 15 puntos Jugador anota un tanto 15 puntos 30 puntos Jugador anota un tanto 30 puntos 40 puntos Jugador anota un tanto 40 puntos y el otro jugador no tiene 40 puntos Gana Jugador anota un tanto 40 puntos y el otro jugador tiene 40 puntos Ventaja Jugador anota un tanto 40 puntos y el otro jugador tiene ventaja Se queda como está y el otro jugador vuelve a 40 puntos Jugador anota un tanto Ventaja GanaEsta prueba no sería necesaria. Como vamos a ver 41
  • Anotando con el segundo jugadorFunciona !!!
  • Conclusiones Hemos terminado pero…..• Las pruebas son difíciles de entender.• He escrito código sólo para las pruebas.• He decidido cómo representar las puntuaciones (cadenas). Arreglémoslo.
  • Refactorizar la clase Player 44
  • Refactorizando Player Usamos constantes
  • Refactorizando PlayerUn mal olor que quitamos.
  • Refactorizando Player No nos olvidemos de refactorizar las pruebas
  • Refactorizando Player Adiós a los malos olores.• Ahora as pruebas hablan la lógica del negocio y utilizan sus conceptos, en vez de trabajar con valores numéricos y cadenas.• Lo que más puede cambiar está solo en un sitio.• Tapo el apaño del constructor (a la espera de mocks).
  • El Partido de Tennis 49
  • El Partido de TennisMetas:• Los jugadores deben poder Método winPoint ganar puntos.• El juego debe terminar con un ganador.• Debes de manejar la Método winPoint casuística de "iguales"• Después de terminar el juego, debe determinarse quién es el ganador.• Debe ser posible obtener la puntuación de cualquier de Método getScore los jugadores en cualquier momento del partido. 50
  • El Partido de Tennis Ejemplos prácticos (candidatos a casos de prueba)Acción Estado ResultadoJugador anota un tanto Dos jugadores, ningún ganador El juego continúaJugador anota un tanto Dos jugadores, un único ganador El juego termina. Se indica el ganador2 casos de prueba posibles (de entrada).Estos ejemplos de prueba no son completos. No hay que preocuparse, ya descubriremos qué falla más adelante 51
  • El Partido de Tenis • Crear la clase match • Darle un método playMatch • Hacer que el método anote al jugador A
  • El Partido de TenisPodemos refactorizar el caso de prueba. Aprovechar lo que ya tenemos del otro conjunto de pruebas No exponer detalles de la interfaz. Actuar, no pedir información
  • El Partido de TenisHemos refactorizado el código en desarrollo y las pruebas.
  • El Partido de Tenis Ejemplos prácticos (candidatos a casos de prueba)Acción Estado ResultadoJugador anota un tanto Dos jugadores, ningún ganador El juego continúaJugador anota un tanto Dos jugadores, un único ganador El juego termina. Se indica el ganador ¿Estamos a una prueba de acabar el desarrollo? Comprobémoslo 55
  • El Partido de TennisNo hacemos nada.
  • El Partido de Tenis Ejemplos prácticos (candidatos a casos de prueba)Acción Estado ResultadoJugador anota un tanto Dos jugadores, ningún ganador El juego continúaJugador anota un tanto Dos jugadores, un único ganador El juego termina. Se indica el ganador Aquí falta algo ¿Qué ha pasado? 57
  • El Partido de Tenis• Hay un valor de prueba que no estamos tratando.• ¿Cómo podemos hace que anote el otro jugador?• ¿Cómo podemos tener una prueba que siempre puntúe B y sea ganador¿ ¿y otra en la que puntué primero A y después B?• En verdad lo que queremos decir es….• ¿Cómo podemos cambiar lo que pasa dentro del while en el método playmatch sin montar un follón?• ¿Hemos hecho un mal diseño y tenemos que retroceder?• Veámoslo.
  • El partido de Tennis ¿Cómo podeos hacer que, en algunas pruebas puntúe el jugador A y en otras puntúe el jugador B?Evitamos la sobre ingeniería y buscamos la solución más sencilla que se nos ocurra
  • El Partido de TennisVamos a reescribir las prueba para poder introducir los valores de prueba (en este caso el jugador que anota. Nada de momento.
  • El Partido de TenisQue gane el jugador B. Bucle infinito Ok
  • El Partido de Tenis Hemos terminado pero…..• Hemos hecho un apaño que nos convence poco.• ¿Estamos seguros de que funciona?• ¿Podríamos modificarlo fácilmente?• ¿Es fácil de entender? Arreglémoslo.
  • El Partido de TenisTodo sigo funcionando.
  • El Partido de TenisMetas:• Los jugadores deben poder Método winPoint ganar puntos.• El juego debe terminar con Método winPoint un ganador.• Debes de manejar la Método winPoint casuística de "iguales"• Después de terminar el juego, debe determinarse Método winPoint quién es el ganador.• Debe ser posible obtener la puntuación de cualquier de Método getScore los jugadores en cualquier momento del partido. 64
  • Random Tenis 65
  • Random Tenis• ¿Y si se calcula aleatoriamente el jugador que anota?• ¿Y si ejecuto muchos partidos seguidos y compruebo que todo funciona correctamente?• Esto ya no son pruebas unitarias.• Si podemos hacerlo sin cambiar una coma de nuestro código es una buena indicación.• Si tenemos que cambiar algo, lo estamos mejorando. Vamos a hacerlo
  • Random TenisRandomPlay aún no está hecho
  • Random Tenis Esto no es código de producción ,sino de pruebas Todo funciona a la primera¿Por qué limitarnos a un único partido? ¿Por qué nojugamos 10.000? Vamos a hacerlo
  • Random Tenis 10.000 partidos……Este test no debería de fallar si todo lo hicimos bien (y el test está bien escrito)
  • Random Tenis Ooops, demasiado lento. No vale para prueba unitaria.Pues parece que funciona.
  • Conclusiones denuestra solución 71
  • Conclusiones• Después de 10.000 partidas no hemos detectado ningún error.• ¿Podemos decir que el software funciona?• Nunca.• Solo estamos buscando unos errores concretos, puede tener otros que no estemos buscando.• Los 10.000 partidas se basan en algo que no está probado.• Si RandomScore tiene fallos, las pruebas pueden dar falsos positivos
  • Conclusiones• Notas: – No está contemplado que se siga puntuando después de que un jugador gane (no lo pone en los requisitos pero podemos hacerlo si lo consideramos adecuado).
  • Otras soluciones 74
  • Otras soluciones TDD in Python in 5 minutesSetScore TestSetWinning: 6 pruebas TestScoreNames: 1 prueba http://css.dzone.com/articles/tdd-python-5-minutes
  • Otras solucionesTDD in Python in 5 minutes
  • Otras soluciones Solveet. Kata TDDSin pruebasPlayerMétodo game https://github.com/andrewnix/Kata-Tennis-Python/
  • Otras solucionesMétodo game
  • Otras Soluciones Solveet. Kata TDD Sin pruebas Decorador Métodohttps://github.com/andrewnix/Kata-Tennis-Python/
  • Otras Soluciones Solveet. Kata TDD Sin pruebas Decorador Métodohttps://github.com/andrewnix/Kata-Tennis-Python/
  • Otras Soluciones Solveet. Kata TDDPruebas a ojoGamePlayer
  • Otras SolucionesPruebas a ojoGamePlayer
  • Otras SolucionesSolveet. Kata TDD
  • Actividades • Consulta las soluciones si pruebas • ¿Crees que habrían salido estas soluciones haciendo TDD? • ¿Serías capa de escribir pruebas para ese código tal cuál está escrito, sin modificarlo?Autoevalua TDD 84
  • Extras 85
  • Extras• Repositorio GitHub: https://github.com/javierj/kata-dojous http://www.slideshare.net/Javier_J 86
  • Extra Ejemplo de mocks en Pythonhttp://iwt2-javierj.tumblr.com/post/36695988608/mocks-en-python-previa-python-tddEjemplo de Behave en Pythonhttp://iwt2-javierj.tumblr.com/post/36762766836/atdd-bdd-con-python-y-behave-previa-python-tdd 87
  • Python-Sevilla Python_Sevilla / #PySVQhttp://www.linkedin.com/groups/PythonSevilla-4685758 https://groups.google.com/forum/?fromgroups=#!forum/python-sevilla.