1 / 11
jun. 2017

Hace poco que estoy empezando a practicar TDD y me parece muy interesante pero tengo un problema.

Cuando lo veo aplicado en ejemplos "triviales" estupendo. Todo está claro y tiene sentido. Por ejemplo:

Pero cuando intento aplicarlo en mi trabajo real me encuentro con muchas dificultades. Los sistemas son muy complejos como para intentar desarrollar el código a partir de pequeñísimos test unitarios. Siento que me bloqueo y no sé ni por donde empezar. También tengo muchas dificultades ya que hay bases de datos, llamadas a servicios web... bufff :sweat:

Hola, cuando se parte de código legado siempre es dificil aplicar TDD ya que suele haber código muy acoplado y no están bien definidas las responsabilidades de cada clase o método. Lo ideal es que el principio de resonsabilidad única impere en ese código, pero no siempre es así, de ahí que existan dificultades para crear tests unitarios.

TDD debería ser lo último si estas en esta situación, así que yo empezaría refactorizando, por ejemplo extrayendo métodos o clases, y aplicando tests unitarios a esa refactorización. Incluso puedes empezar aplicando TDD en esa refactorización si puedes crear el test antes que la extracción de código. Eso sería un inicio. Puedes hacer TDD para extraer una responsabilidad de otro método creando uno nuevo y adpatar el código extraido para satisfacer ese test.

También puedes, si añades nuevo código, crearlo en un método independiente y llamarlo desde el que incluye toda la lógica. Aquí haría TDD con ese método nuevo aunque dejases sin testear el método con múltiples responsabilidades. Esta es una forma rápida de empezar sin meterte a hacer grandes refactorizaciones.

Si hay llamadas a base de datos u otros servicios hay que desacoplar y pasar objetos falsos que emulen ese comportamiento; volvemos a lo mismo, antes hay que refactorizar apoyandose en tests y hacer inyección de dependencias para poder pasar los objetos falsos.

Si un test llama a una base de datos o a terceros no es un test unitario, es otro tipo de test que puedes crear (yo los hago), pero no son test unitarios y no son validos para hacer TDD.

Así que si tienes código muy acoplado y complejo:

  • Empieza refactorizando para desacoplar el código.
  • Crear los test unitarios que puedas aunque sea tras refactorizar (El test despues de extraer código).
  • Hacer TDD pensando en esa refactorización si es posible (El test antes que el código que vas a modificar).

Saludos.

Los consejos de @altorsaz son buenos. Hazle caso e intenta aplicarlos :wink:

TDD es una técnica simple de entender pero compleja de aplicar, así que tener dificultades como las tuyas y sentirse un poco perdido es totalmente normal. Primero tienes que tener muy claros los conceptos relacionados con los tests unitarios (independientemente de aplicar TDD o escribir los tests después del código de producción).

Te recomiendo este libro (está centrado en Java pero los conceptos e ideas pueden servir para todo):

Este libro de Carlos Ble también está muy bien (y gratis y en español):

http://www.carlosble.com/downloads/disenoAgilConTdd_ebook.pdf14

Para bases de datos y otros servicios externos, como bien dice @altorsaz , hay que utilizar mocks y para eso hace falta inyectar objetos y para eso hace falta que el código esté bien desacoplado...

Lo importante es que empieces dando pequeños pasos y poco a poco irás cogiendo confianza y soltura. Como con todo hay que practicar y practicar.

Un saludo!

Graicas por los consejos. La verdad es que no me había ni planteado aplicar TDD a la refactoración de un proyecto existente pero con tus ideas veo que podría hacerse de manera incremental. Aunque no sé si podría considerarse exactamente TDD o más bien sería meter tests unitarios a un código que no los tenía. Ya veo que en tu comentario habías aclarado la distinción, es lo que tiene leer rápido :sweat_smile:

El problema que me he encontrado es al intentar aplicar TDD a una nueva aplicación web (básicamente operaciones CRUD). Y el problema como dices es que estoy muy acostumbrado a tener el código que se encarga de las operaciones de base de datos muy acoplado al resto. :sob:

Es complicado dar ese "salto", sobre todo al principio. Creo que hay que hacer unas cuantas katas para meterse con código de producción y aún así no va a ser fácil. Yo como lo veo es que para aprender a programar fin soltura necesite 2años, pues para hacer TDD bien voy a necesitar lo mismo.

A mí para empezar me han servido mucho los vídeos de codely.tv sobre todo este de http://codely.tv/screencasts/testear-codigo-acoplado/9 y los vídeos de Carlos Buenosvinos.

Por otro lado si quieres un libro a mí me gusto mucho TDD by example de kent beck

Gracias @jeslopcru

Veo que todos pensáis que no es fácil esto así que me tranquiliza saber que no es que sea un zoquete integral :smile:

Me apunto el vídeo y libro para echarles un vistazo

Un saludo.

Gracias por la mención. Nuestro libro esta ya muy viejito. Me gustaria sacar edición nueva un día pero no sé cuando será. Mientras tanto yo sigo recomendando todos los de Kent Beck y Test Driven de Lasse Koskela además del GOOS (Growing object oriented software guided by tests) de Nat Pryce y Steve Freeman.

Mi consejo es que intentes practicar TDD con gente que ya lleve tiempo practicando TDD. Ve a alguna kata, lía a alguien del curro, a alguien que conozcas, etc.

Al final el abanico de problemas a los que te enfrentas es finito. Es cierto que las formas de resolverlos es más amplica, pero si tienes acceso a personas con experiencia aplicando TDD, la diferencia para tu aprendizaje va a ser brutal.

Si no tienes gente cerca, seguro que tienes alguna comunidad de desarrolladores cerca que organiza katas y cosas así :wink:

Una buena cosa sería que todo desarrolllador junior empezara haciendo pair-programming con alguien más senior, de modo que pudiese ver este tipo de cosas (no sólo TDD, sino clean code, IoC y SOLID en general) realizadas por alguien con más experiencia.

Porque si... al principio cuesta :wink: #noestassolo

2 meses después

separó este tema 13 sep., '17

5 posts fueron trasladados a un nuevo tema: La figura del mentor