2012-05-01 16 views
20

Sé que una de las intenciones de Dan North al diseñar BDD fue alejar el vocabulario de la complejidad del dominio de prueba. Sin embargo, al implementar un enfoque de afuera a adentro, parece que todavía necesitamos cierta comprensión del comportamiento burlado (o comportamiento obstinado, si lo prefiere). North sugiere en this video que si comienzo con los objetos de dominio más externos y me abro camino hacia adentro, me burlo de los colaboradores cuando los descubro y luego los reemplazo con las implementaciones adecuadas. Entonces, al final, termino con un conjunto de pruebas de extremo a extremo.Cómo/qué burlarse en BDD

Martin Fowler parecía verlo un poco diferente en this blog post cuando definió dos campos de TDD: "TDD clásico" que usa objetos reales siempre que es posible y un simulacro cuando es necesario, y "mockist TDD" que prefiere burlarse en la mayoría de las situaciones . Él vio BDD como tendiendo hacia el último. Es decir, que al final de desarrollar una función, el enfoque "burlón" dejaría burlas en las pruebas reales (siento usar esa palabra en una discusión BDD).

Para ser justos, ambos materiales tienen años de antigüedad, y tal vez las cosas se volvieron más claras a medida que BDD evolucionó a lo largo de la línea entre la aplicación a nivel de la unidad y el nivel de aceptación.

Pero mi pregunta para la comunidad es básicamente: cuando mi historia esté completa, ¿cuánto de una prueba de extremo a extremo deberían ser mis escenarios en realidad? North explains que BDD requiere abstracciones. Por ejemplo, cuando estoy probando el comportamiento de inicio de sesión, mis escenarios detallarán lo que significa el proceso de inicio de sesión. Sin embargo, cuando estoy haciendo algún otro escenario que requiere, pero no se trata de de inicio de sesión, no quiero tener que hacer esos pasos una y otra vez. Quiero una abstracción fácil que simplemente diga "Dado que estoy conectado", así puedo ejecutar mi otro comportamiento.

Parece que mi enfoque de la abstracción se debe a que me burlo de ciertos colaboradores (o proporciono un "doble de prueba"), y algunos escenarios pueden usarlos más que otros. Por ejemplo, ¿siempre simulé recursos externos, como un DB o un servidor de correo?

Quizás estoy haciendo la pregunta incorrecta. BDD tiene que ver con la comunicación, acortando el ciclo de retroalimentación y descubriendo lo que no sabes. Tal vez qué-y-qué-no-simular es una pregunta irrelevante, siempre y cuando el comportamiento que nos interesa realmente funcione. Tengo curiosidad por los enfoques de los demás aquí.

Respuesta

6

Creo que la clave es centrarse en la B de BDD: comportamientos.

Por el momento, tiendo a ignorar los elementos de UI y burlar las capas de persistencia - después de todos estos días hay poca o ninguna lógica de negocios en esas capas (tendemos a vincular modelos de objetos directamente a la UI o DB usando marcos preexistentes y fuertemente probados).

Como ejemplo de ejemplo, en una aplicación WPF reciente (simple) que estaba construyendo: las pruebas de aceptación utilizan ViewModel como el punto de entrada/exterior de la aplicación, y todo lo que se tomó de los Repositorios de datos fue burlado. Todas las reglas y la lógica de la aplicación existían en algún lugar entre los dos, y en realidad, esos son los comportamientos de la aplicación que deben ser especificados y probados.

1

Lo que se burla depende de la arquitectura. Para MVVM puede burlarse del modelo para probar el modelo de vista. Para MVP puede burlarse de la vista y/o del modelo para probar al presentador. Si desea escribir pruebas de extremo a extremo en lugar de pruebas unitarias, pruebe a través del modelo/presentador de vista en el otro extremo de la aplicación (capa de servicio/base de datos).

7

Para mí BDD, permítame verificar que he construido lo correcto. Eso significa que si conecto mi aplicación a una base de datos real y uso la IU real, debería comportarse correctamente.Ese es el extremo al que estás hablando.

Ahora si conecto mi aplicación a un almacenamiento en memoria y hablo con la aplicación a través de su nivel de API (por lo tanto, justo debajo de la IU). Esperaré que se comporte exactamente de la misma manera.

Ahora que es la cosa, tenemos que ser claros sobre lo que queremos decir con comportamiento, cuál es el comportamiento que nos interesa cuando hacemos BDD.

En mi caso, si comienzo desde una historia de usuario y escribo escenarios, me interesa principalmente el comportamiento que pasa por mi API de aplicación, capa de servicio, entidades de dominio, ayudante, etc. ... principalmente estoy no tan interesado en lo que sucederá en la interfaz de usuario ni en la base de datos. La verdadera carne es todo el código escrito en el lado del servidor. Ese es el comportamiento que me interesa. Si piensas así, tiene sentido deshacerse de la interfaz de usuario y la base de datos, porque no nos importan estos tipos. El comportamiento esperado de la interfaz de usuario es mostrar los datos que proporciona mi aplicación. La interfaz de usuario es una tontería. El comportamiento esperado del DB es almacenar y recuperar entidades que mi aplicación da o quiere. Eso también es una tontería. Ahora todo lo demás, ahí es donde está toda la inteligencia y yo soy responsable.

Así que felizmente ejecutaré mis escenarios de BDD sin una IU y utilizando una versión en memoria de mis repositorios. La ventaja que obtengo de eso es realmente pruebas muy rápidas, enfocadas y mantenibles.

En cuanto a la UI y la base de datos, escribiría pruebas de unidad de JavaScript para probar el comportamiento allí, hoy algunas UI pueden tener mucha lógica de visualización para ocultar y mostrar cosas, pero ese tipo de comportamiento es diferente del comportamiento en mis historias de usuario bdd escenarios (no deberían hablar sobre la interfaz de usuario).

Para la base de datos Escribo pruebas de integración solo para verificar que mis repositorios reales puedan leer y escribir cosas en la base de datos.

Y, por último, escribiría algunas pruebas de extremo a extremo para comprobar que todo esté bien cuando se conecten entre sí.