Aunque no he estado en un proyecto TDD o BDD, o he estado en algunos que dicen que están haciendo TDD pero están bastante lejos de eso, estas son cosas en las que pienso y realmente intento leer tanto como puedo acerca de.
De vuelta a la pregunta. Cuando esté haciendo BDD, primero debe escribir su "prueba" y hacer que falle, ¿verdad? Y luego implemente esa característica o lo que usted llama. Pero si lleva esto al extremo, ¿no podría ser algún tipo de desarrollo de arriba hacia abajo? Estás mirando tu interfaz de usuario y dices: "Me gustaría tener esta característica / comportamiento aquí". Luego arregla su interfaz de usuario para implementar esa característica y el código que admite la interfaz de usuario. En este punto, no ha implementado ninguna lógica de negocios o lógica de acceso a datos, solo ha implementado su comportamiento. A lo que apunto en lugar de escribir la prueba primero, primero escribe tu código de interfaz de usuario. En algunos casos, debe dar como resultado el mismo código para el acceso a datos y la capa empresarial, ya que utiliza su código de interfaz de usuario para definir lo que su empresa necesita admitir.
Por supuesto, debe complementar esto con pruebas que se utilizan para asegurarse de que la función funciona como debería en la función.
¿Alguna idea?
fuente
main
. En su comentario de arriba hacia abajo, está hablando de pruebas funcionales, que ejecutan todo el programa a través de una solamain
.Respuestas:
Estás hablando de BDD desde una perspectiva de alto nivel de probar tu IU. Las pruebas son un poco más esponjosas en este nivel que en el código lateral de Javascript / servidor.
Varios libros que he leído en TDD dicen que deberías escribir código como si existieran los sistemas subyacentes, y solo escribir lo suficiente para que tu prueba pase. Puede escribir apéndices en el servidor para obtener su pase de pruebas de comportamiento de IU. Luego, comienza en esta costura y escribe algunas pruebas unitarias para el código del lado del servidor y avanza hacia una implementación completa.
A menudo codifico como si existieran capas subyacentes para que una prueba de alto nivel pase, se siente como ir por un agujero de conejo y extraer muchas otras clases para satisfacer la prueba de alto nivel, y luego escribir pruebas para estos niveles más bajos. Como ya has reconocido, te ayuda a mantenerte enfocado comenzando con pruebas de nivel superior.
Como sabe cualquier programador experimentado, existen muchas capas para el desarrollo de software. Tiendo a trabajar más bajo que la interfaz de usuario y pensar en los datos o el comportamiento que mi interfaz de usuario necesita del servidor y comenzar allí (tal vez porque no hago mucho trabajo de interfaz de usuario en estos días).
Si soy realmente honesto, extraer una clase de las capas subyacentes significa que no estoy haciendo la prueba primero, pero ... en cuestión de minutos o algunas horas tendré una prueba para ese código. Esto todavía me resulta beneficioso, ya que ayudo a ver dónde podría necesitar suministrar dependencias a una clase y respetar el principio de responsabilidad única: si es difícil de probar, está haciendo demasiado en un lugar, etc.
fuente
¡Si! De lo contrario, lo que obtienes son pruebas basadas en el desarrollo .
Hablando de manera realista, sin embargo, hay problemas que son difíciles de abordar mediante el uso de TDD "puro". Podría ser más productivo escribiendo escribiendo un código de producción descubierto por adelantado y cubriéndolo con pruebas más adelante (y aprendiendo cómo abordar problemas similares con TDD en el futuro). Mire esta técnica , que su autor llamó enjuagar y repetir TDD por falta de un mejor término.
fuente
Si no escribe sus pruebas primero, no está impulsando el desarrollo a través de sus pruebas. ¡Ergo, no estás haciendo un desarrollo basado en pruebas!
fuente
Si quieres trabajar de esta manera, hazlo. Pero no es un desarrollo basado en pruebas.
fuente
Lo que describe suena muy parecido al enfoque de diseño frontal . Desafortunadamente, Front-Ahead Design es la puñalada satírica de Alex Papadimoulis en los métodos ágiles.
fuente
Personalmente, creo que es fundamental pensar en las pruebas durante la etapa de diseño. Es realmente genial tener una implementación funcional, pero la única forma en que puedes estar seguro de que tienes un producto funcional es si lo has probado pieza por pieza. La forma de cubrir esto es mediante una combinación de pruebas unitarias y un equipo de control de calidad calificado que trabaje en colaboración.
Ahora, la forma en que instales esta diciplina en tu equipo depende de ti. TDD es una de esas estrategias, y tiene su lugar, y hay muchas otras variaciones. Sin embargo, TDD no es particularmente adecuado para desarrollar el diseño de la interfaz de usuario.
fuente