2011-05-07 15 views
6

Supongamos que se requiere una compilación innecesariamente complicada, difícil de simular (quizás tiene clases concretas sin interfaz virtual) y una biblioteca de terceros no confiable que se integra con algún recurso externo como un socket o una base de datos. Decide crear interfaces/clases de "envoltura" para simplificar en gran medida el uso de esta biblioteca y para permitir que los desarrolladores que usen el contenedor continúen escribiendo código comprobable. La interfaz del contenedor no se parece en nada a la interfaz original.Prueba de envoltorios inteligentes para bibliotecas de terceros

Tengo algunas preguntas sobre cómo probar esta envoltura.

  1. caso de que la envoltura se va a ensayar sin el recurso externo mediante el desarrollo de una capa de método para la método sobre el mal biblioteca que puede ser burlado?

  2. Cuando prueba sus clases contenedoras con la biblioteca de terceros (utilizando los recursos externos) ¿es esta una prueba unitaria o una prueba de integración? Si el recurso externo puede incorporarse en la memoria durante la prueba automatizada, ¿sigue siendo una prueba de integración?

  3. En que punto dejamos de burlarse y decir que tenemos una unidad. Según la wikipedia "Una unidad es la parte más pequeña comprobable de una aplicación". pero estoy encontrando esto difícil de medir. Si la velocidad es un factor que determina si estamos o no probando una unidad, ¿cómo decide qué tan lento es demasiado lento para que la prueba se llame prueba unitaria?

Respuesta

9

TDD no dice que todo debe ser probado en una unidad. TDD dice que primero debe escribir una prueba, pero no tiene por qué ser una prueba unitaria.

  1. Comience con la prueba de integración: probará su lógica dependiendo de la envoltura que se comunicará con un componente real. No se burla aquí. Es una prueba de integración porque prueba múltiples capas de su aplicación y el componente real aún usa sockets o acceso a la base de datos.
  2. La prueba de integración se producirá un error, ya que no tiene su lógica
  3. prueba de la unidad de escritura
  4. con la envoltura burlado para poner a prueba la lógica
  5. La prueba de la unidad fallará debido a que no tiene su lógica
  6. Escribir la lógica para satisfacer la prueba de la unidad (4.)
  7. Repita 3.-5. para obtener toda la lógica necesaria para satisfacer la prueba de integración (1) todo el proceso
  8. Repita con la siguiente prueba de integración

No hay necesidad de escribir pruebas unitarias para envoltura. La función principal del contenedor es envolver el componente. Si escribe la prueba unitaria para el contenedor, probará que llama al método del componente, pero en ese caso ya volvió al principio: ¿cómo burlarse del componente? Si escribe la prueba de integración solo para contestar llamando al componente, está volviendo a probar el componente (OK, esto a veces es útil pero en el escenario normal no lo hace).

Recomiendo leer Growing Object-Oriented Software guided by tests por Steve Freeman y Nat Pryce.

5

creo que el esta pregunta gira en torno a esta declaración:

La interfaz del envoltorio parece en nada a la interfaz original

Esto probablemente indica que hay una cantidad significativa de lógica utilizada en la traducción entre el contenedor y la interfaz original. Eso suena muy parecido a anti-corruption layer, y si esa lógica es compleja, debe ser probada.

La mejor manera de hacerlo es extraer una interfaz 1: 1 de la API original. Sin embargo, esta no es la interfaz que expone al resto de la aplicación. La interfaz que expone al resto de la aplicación puede ser Facade sobre la interfaz extraída. En cierto sentido, podría decirse que la interfaz extraída es un detalle de implementación de la capa anticorrupción y no algo que está expuesto al resto de la aplicación.

Esto le permite probar la traducción entre la interfaz Facade y la interfaz extraída al mismo tiempo que mantiene el componente original y difícil de probar fuera de la prueba.

Lo que queda es la traducción entre la interfaz extraída y el componente original. Sin embargo, si esa interfaz se extrajo como un mapeo 1: 1 del componente original, la implementación debería consistir en una delegación pura. En otras palabras, la implementación tendría una complejidad ciclomática de 1 y por lo tanto sería un Humble Object que no necesita ser probado en unidades.

Es posible que desee realizar algunas pruebas de integración o del sistema en el sistema completo, pero estas pueden tomar el rol de pruebas de humo porque ya debe tener suficiente cobertura de las pruebas unitarias.

+0

1 supongo que si la envoltura/fachada termina siendo más que la delegación de métodos, podría ser lo suficientemente complejo como para justificar el tiempo para crear un contenedor "tonto" 1: 1 para aislar la lógica. Muy buen punto. – insipid

2

Anuncio 1) No es la respuesta corta. Un contenedor no debería hacer otra cosa que envolver. Por lo tanto, las pruebas de integración son lo único que tiene sentido.

Anuncio 2) sí lo es.

ad 3) se detiene cuando el objeto en cuestión hace una cosa única, y dejar objetos fuera - inyectado y mockable - hacer todo lo demás (SRP)

Cuestiones relacionadas