2008-11-07 8 views
6

Actualmente estamos utilizando pruebas unitarias para probar nuestro proyecto. Tenemos la mayoría de la funcionalidad cubierta, pero creo que nuestras pruebas son demasiado frágiles.¿Cómo creo pruebas de unidades flexibles?

Me preguntaba si hay cosas específicas que podamos estar haciendo para que las pruebas de la unidad sean más flexibles para que no se rompan por las razones equivocadas.

Un par de respuestas han mencionado tener cuidado de burlarse demasiado ... Entonces, ¿cuáles son los motivos legítimos para burlarse? Creo que ese puede ser uno de nuestros principales problemas, pero cuando su aplicación es principalmente un sitio dinámico, basado en una base de datos, ¿cómo se aleja de la burla?

Respuesta

17

Esta es una respuesta un tanto simplista, pero muestra el derecho de pensar:

  • Una prueba debe romperse si los cambios en el comportamiento de una manera que le interesan.
  • Una prueba debería seguir funcionando si el comportamiento cambia de una manera que no le importe.

Así que en la medida de lo posible - sin ir enormemente fuera de su camino - asegurarse de que está probando el "resultado final" del método sin importar cómo llegó hasta allí. Una cosa a tener en cuenta es la burla: es increíblemente útil, pero puede hacer que tus pruebas sean frágiles.

5

+1 a Jon. Así poner.

He encontrado un gran valor en la estructuración de mis pruebas en un estilo más BDD. Es decir ... rechaza la mentalidad de fijación por clase, en lugar de ir por accesorio por contexto.

También encontré que la sintaxis AAA de RhinoMocks 3.5 es mucho más agradable.

Esas organizaciones de la cubierta y pruebas limpias/legibles.

Para hacer que mis pruebas sean menos frágiles, he comenzado a retirarme de la burla. Los marcos falsos son cruciales para anular las dependencias, pero cuanto más se burle, más la prueba conoce sobre la implementación. Si la implementación cambia (pero el comportamiento no), entonces sus pruebas no deberían romperse.

3

También +1 a Jon.

En la moda de ingeniería típica, la respuesta siempre es "depende".

Sugiero echar un vistazo al libro "xUnit Test Patterns: Refactoring Test Code". (En este contexto, x = {J, N} para cubrir los mundos Java y .NET y no está explícitamente intencionado para la nueva estructura real llamada-xUnit.)

Así como han surgido patrones de diseño en el OO world, también han surgido patrones en el mundo de TDD. Vale la pena echarle un vistazo.

+0

Hay un sitio web para ir con este libro en http://xunitpatterns.com/ –

2

He descubierto que cuando mis pruebas tienen los siguientes atributos que tienden a ser más frágil

1) Complejo de establecer el estado correcto con el fin de la prueba de la lógica real. 2) Muchas expectativas en los simulacros. 3) Poca legibilidad del código de prueba. 4) Diseño deficiente del sistema general.

para abordar estas cuestiones que tratamos de hacer lo siguiente

1) Cambiar el diseño del sistema con el fin de facilitar la instalación de pruebas, por lo general mediante la aplicación de la SRP y en busca de fugas de responsabilidad en nuestra clase.

2) utilizando simulaciones sin expectativas explícitas con respecto al número o el orden de las llamadas realizadas en el simulacro.

3) Tratamiento de código de prueba como el código de producción, la realización de código, revisiones de diseño, etc.

0

Entonces, ¿qué razones legítimas para burla? Creo que puede ser uno de nuestros principales problemas, pero cuando su aplicación es principalmente un sitio dinámico, basado en una base de datos, ¿cómo obtiene lejos de la burla?

Razones para burlarse de un objeto comprenden

  • objeto es o utiliza un recurso externo, tales como la base de datos, red, sistema de archivos
  • objeto es una GUI
  • objeto no es [todavía] disponible
  • comportamiento del objeto no es determinista
  • objeto es caro de instalar
Cuestiones relacionadas