¿Realmente tienes que hacer BDD / TDD en una prueba de primera manera?

11

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?

Tomás Jansson
fuente
Las pruebas bajo TDD son pruebas unitarias , que controlan el módulo directamente, como si fuera por separado main. En su comentario de arriba hacia abajo, está hablando de pruebas funcionales, que ejecutan todo el programa a través de una sola main.
Macneil
@ Macneil: No hablo de pruebas funcionales que prueben todo el programa, incluso si está implementando / diseñando su programa de arriba hacia abajo, aún debe implementar la prueba unitaria para todo su código público. El hecho de que lo haga de arriba hacia abajo no significa que no pueda hacer que las diferentes capas sean abstractas, por lo que puede aislar todas las capas por sí mismo.
Tomas Jansson
1
@ Macneil: este es un error común. Las pruebas TDD no son pruebas unitarias . TDD prueba características , que no tienen escala establecida.
Steven A. Lowe
2
Pero hay una escala establecida: la prueba debe ejecutarse rápidamente en TDD. Hay pruebas que deben ocurrir que también están fuera del alcance de TDD. En general, TDD es un plan de desarrollo, no un plan de prueba.
Macneil
@Macneil: "rápidamente" es un término relativo. El conjunto de pruebas en mi último proyecto se ejecuta en unos 30 minutos. Reemplaza 8 horas de pruebas manuales. ¡Eso es lo suficientemente "rápido"!
Steven A. Lowe

Respuestas:

8

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.

Greg K
fuente
Creo que tienes razón. Esto me sorprendió cuando probé ruby ​​on rails este verano, allí tienen una prueba bdd que impulsa la interfaz de usuario que luego impulsa la implementación de las clases subyacentes.
Tomás Jansson
17

¡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.

azheglov
fuente
3
La primera línea es asombrosa.
EpsilonVector
En comparación con TDD, eso es cierto, pero hacer las cosas de arriba hacia abajo debería alinearse bastante bien con BDD, ¿verdad? Miro la GUI y especifico el comportamiento que quiero, seguro de que no escribo la "prueba de comportamiento" de inmediato, pero sí especifiqué el comportamiento a través de la interfaz de usuario antes de implementarlo.
Tomas Jansson
15

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!

Frank Shearar
fuente
Para ser justos, ¿no es la pregunta más acerca de si al hacer BDD (no TDD) si deberíamos escribir la prueba primero?
bytedev
Siéntase libre de sustituir "prueba" con "comportamiento". No he visto nada que me convenza de que, en el fondo, hay mucha diferencia entre TDD y BDD. Enfoque, tal vez. Pero la idea central? No tanto.
Frank Shearar
No está de acuerdo con el hecho de que no está haciendo un desarrollo basado en pruebas. No lo está haciendo de acuerdo con la definición del término clave, pero siempre que esté desarrollando pruebas para su código, su código definitivamente será impulsado por las pruebas, independientemente de cuándo las escriba.
alternativa
TDD significa específicamente escribir pruebas antes del código. Si no te gusta, tómalo con Kent Beck, quien inventó el término. Escribir pruebas después de su código puede conducir su código hasta cierto punto, pero aún puede engañarse a sí mismo para creer que está manejando el diseño de su código a través de pruebas cuando no lo está. Y es más difícil escribir esas pruebas, porque a menudo tienes que cambiar el código no probado . Lo he visto con demasiada frecuencia para mencionarlo.
Frank Shearar
@FrankShearar Reconocí que no es TDD de acuerdo con lo que dijo Kent Beck, pero francamente no me importa lo que dijo alguna persona al azar. Es perfectamente posible conducir el diseño del código a través de pruebas sin escribir primero las pruebas.
alternativa
4

Si quieres trabajar de esta manera, hazlo. Pero no es un desarrollo basado en pruebas.

Don roby
fuente
3

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.

usuario281377
fuente
Me preguntaba si conoces algún artículo que se defienda en FAD, desacreditando su puñalada satírica.
CL22
3

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.

Michael Shaw
fuente