2009-02-17 7 views
6

Me estoy conectando a un servicio externo simple, aunque idiosincrático.¿Cómo pueden los servicios externos de burla mejorar las pruebas unitarias?

Creo que las pruebas de mi unidad no deben depender de la disponibilidad o implementación de ese servicio externo, por lo que pretendo simularlo.

Necesito el simulacro para aceptar y devolver mensajes y respuestas realistas; de lo contrario, mis pruebas no representarán situaciones reales. Por ejemplo, tiene que arrojar el tipo correcto de errores, y hay al menos 7 formas diferentes en que puede fallar (entre usted y yo no es un servicio externo muy bien diseñado). Por lo tanto, como mínimo, tengo que tener un hash de pares mensaje/respuesta.

De modo que, en lugar de reducir la contingencia, la burla la ha reintroducido en otro lugar. De hecho, como dice el refrán, ahora tengo dos problemas: tengo que estar seguro de que lo que está en mi hash es una representación justa de cómo se comporta el servicio externo. Pero seguramente la fuente canónica de qué objeto de respuesta X da al mensaje m es X sí mismo. Cualquier otra cosa es arriesgada y desordenada.

¿He tomado un giro equivocado? ¿Cómo puedo eliminar esta aparente circularidad?

EDIT He aclarado cuál es el problema a la luz de los útiles comentarios de Justice.

Respuesta

3

Permítanme referirme a my two answers at another question sobre pruebas unitarias para evitar repetirme a mí mismo, primero.

Lo que creo que burla le da en este entorno es que está rigurosamente especificando lo que piensa que el comportamiento de la interfaz externa va a ser. Esto significa que tiene una prueba controlada (algo me dice que este servicio externo cambia cada cierto tiempo). Por lo tanto, no solo puede probar y depurar su código con una conocida "buena" secuencia de respuestas, sino que tiene un conjunto documentado de ejemplos de lo que espera

Si yo estuviera en esa situación, y dependiendo del servicio real, yo estaría tentado a escribir una prueba unitaria o simulacro para el servicio externo, así. De esta forma, si observa una falla en la operación real, puede (1) ejecutar la prueba contra su código utilizando el simulacro de la interfaz externa, y (2) probar el servicio externo contra sus expectativas.

El punto, sin embargo, es tener algo para lo que tenga verdadera confianza y que controle completamente.

+0

Ah sí, eso es todo, gracias.¡El riesgo y el mantenimiento no desaparecen, simplemente por el hecho de que es un servicio externo! Pero al expresar mis expectativas sobre su comportamiento, aíslo la incertidumbre. –

+1

El enlace a "mis dos respuestas en otra pregunta" está roto. ¿Alguien puede encontrar dónde vive ahora? –

+0

Esto debería funcionar. http://stackoverflow.com/questions/513778/what-do-you-think-of-junit-style-unit-testing-do-you-favor-behaviour-driven-tes/513807#513807 –

0

Su simulacro para pruebas unitarias debe no representar con precisión el servicio externo. Debe elegir conjuntos predefinidos de valores de entrada y salida para el servicio externo burlado. Pueden o no ser lo que el servicio externo realmente devolvería (pero deberían ser "algo así como" reales). El objetivo de las pruebas de su unidad es verificar que sus objetos se comporten correctamente, dado este conjunto de entradas y salidas, para un cierto significado de "correctamente".

+0

Gracias - He editado el qu a la luz de sus comentarios aclaratorios. No estoy seguro de que hayas respondido a mi preocupación subyacente. Si tienes un momento, ¿puedes echarle otro vistazo? Aclamaciones. –

-1

Asegúrese de que todo lo que su clase necesita tiene una interfaz (a diferencia de una implementación concreta), y luego puede usar JMock. Esto simplificará sus pruebas inmensamente. Puede hacer cosas como decirle que espere un método llamar a X, devolver un valor particular o lanzar una excepción. Es realmente un ahorro de tiempo.

Cuestiones relacionadas