2010-08-03 10 views
5

Tengo un código de inicialización para usar mi API. La inicialización puede fallar y me gustaría probarla en una prueba NUnit.Pruebas que dependen de la funcionalidad de uso común con NUnit

Después de la inicialización, se puede usar la API. También estoy probando la API, pero todos mis métodos de prueba usarán el mismo código de inicialización común.

Lo que idealmente me gustaría es si este comportamiento:

  1. La prueba se ejecuta la inicialización.
  2. Las otras pruebas se ejecutan si [1] tuvo éxito.

En todos los casos donde [1] fallará, también lo harán todas las demás pruebas. Pero la información valiosa es que [1] falla. Ahí es donde probablemente encuentre el problema. Sería bueno si las otras pruebas se pueden marcar con? o algo así, lo que indica que no se ejecutaron porque la funcionalidad de la que dependen no pasó las pruebas.

Sé que las pruebas no deben ser frágiles. Pero no puedo evitar el hecho de que el código de inicialización es necesario para la correcta ejecución de otras funciones.

Este es un problema más general en el que algunas funciones dependen de otras funciones. Donde la "otra funcionalidad" se utiliza con demasiada frecuencia para proporcionar un valor real al fallar todas las pruebas que dependen de él. Sería mejor si la "otra funcionalidad" se probara por separado.

+0

+1. Lo primero que pensé fue que las pruebas existentes que cubren su inicialización ya funcionan. Solo cuando refactorices tu código de inicialización, deberías volver a ejecutar esos casos hasta que te vuelvas a poner verde. Mi segundo pensamiento fue simplemente callarme y mirar lo que otros piensan. Lo más probable es que esa sea la mejor idea que haya tenido hoy. –

+0

Todos los casos de prueba se ejecutan en nuestro servidor de compilación.El conjunto debe ser capaz de ejecutarse en conjunto, ya que es difícil y fácil perder algo si solo ejecuta las pruebas que cree que le afectan. Estas son pruebas de integración, por lo que se prueba más de una clase a la vez. – Deleted

+0

exactamente lo que quise decir pero no fue capaz de explicar correctamente. –

Respuesta

1

Estuve en contacto con los desarrolladores de NUnit. No es posible en este momento sin escribir un plugin bastante complejo. La característica aparecerá en algún lugar de la base de código 3.x pero no aparecerá en 2.5. Consideraré escribirlo, pero no por el momento.

2

bien aquí es cómo iba a ir sobre esto ...

Ponga la inicialización común en un método de instalación desde su necesaria para todas las pruebas. Si la inicialización genera un error, verías

  • todas las pruebas en una suite (que no he sido entrenado con el tiempo a reconocer como un indicio de que tal instalación/desmontaje ha lanzado una excepción).
  • stacktrace para las pruebas fallidas que contienen el método de instalación.

Si esto es demasiado implícito para usted, puede (aunque yo no lo recomendaría) agregar una prueba vacía con un buen nombre a la misma suite. Si esa prueba se muestra en verde, puede estar seguro de que el programa de instalación/código de inicio común ha tenido éxito.

[Test] 
public void VerifySetup() {} 

Actualización: Parece que tiene un requisito bastante nicho. No conozco ningún mecanismo en NUnit para especificar dicha ejecución condicional de las pruebas, p. Ejecute Test2 hasta 10 solo si pasa Test1.

+0

¡Gracias por tu respuesta! Aunque no puedo decir que lo identifico como una respuesta a mi pregunta. Entonces -1. Eso es exactamente lo que quiero evitar. Quiero que las pruebas que dependen de la funcionalidad común no se ejecuten, ya que no brindan información adicional. Si mi prueba con la funcionalidad común fue la única que falló (y los otros obtuvieron un estado Excluido o algo así) me llevaría al código común inmediatamente. Puede haber situaciones en las que haya muchos códigos comunes, por ejemplo, para usar diferentes partes de una API. Usar Setup y tal vez un método vacío parece asqueroso. – Deleted

+1

Discretamente, no estoy de acuerdo. Todas las pruebas que fallan en un banco de pruebas me dan una pista de que la instalación/desmontaje tiene un problema. Las stacktraces me ayudan a confirmarlo. En cuanto a ignorar las pruebas si falló la instalación, ¿qué importancia tiene? Tener todas las pruebas en una suite que falla frente a la falla de una prueba especialmente nombrada - el hecho es que todas las pruebas en la suite están rotas/no funcionales y alguien tiene que tomar un vistazo. No creo que pueda incluir/excluir pruebas en tiempo de ejecución en NUnit, al menos no sin complicar el código de prueba. – Gishu

+0

+1. No puedo hablar por NUnit, pero con DUnit ciertamente sería posible ejecutar o no las pruebas dependiendo de los resultados de otras pruebas. Veo 2 problemas con esto, complica el código de prueba como mencionaste y en pruebas unitarias puras, los casos de prueba no deben depender uno del otro (estrictamente hablando, esto no sería una dependencia). –

0

Prueba esto:

  1. Definir la "prueba de inicialización" como un TestCase

  2. hacer todas sus otras pruebas de una subclase de esta TestCase

  3. crear un conjunto que se ejecuta sus pruebas en algún orden específico para que su "prueba de inicialización" sea la primera.

+0

-1. Eso no evitará que otros casos de prueba se ejecuten si falla mi prueba de inicialización. – Deleted

+0

@ Binary255. "Si mi prueba con la funcionalidad común ... [falla] me llevaría al código común inmediatamente". Eso resuelve tu problema. No es necesario que sea la prueba ** solo ** a menos que esté diciendo que no puede leer los registros o algo así. Claramente, tienes cerebro. ** Puedes ** leer los registros. Lo común se identificará claramente como un error. –

+0

Claro. No creo que sea un gran problema. Pero no es lo que estoy buscando. Quiero que se ignoren algunas pruebas si falla otro. Si solo fuera el orden, ¿no podría haber colocado primero la prueba de inicialización y separado el código de inicialización real en un método de ayuda privada (no una prueba)? Estamos monitoreando cada caso de prueba y generando estadísticas. Si el código de inicialización falla, queremos que se muestre para la prueba que prueba el código de inicialización. Después de la prueba de inicialización estamos probando partes de una API. Queremos ejecutar las pruebas cuando tengan la oportunidad de tener éxito. – Deleted

-1

Creo que este corte bastante claro.El problema es que te está costando separar tus responsabilidades de API. Tienes dos. Inicialización de API y ejecución de API. Escribir tus pruebas para tener este tipo de dependencia puede matarte.

Así que recomendaría que la API cree un objeto de inicialización y luego varios objetos de comando para ejecutar la API. Los objetos de comando estarán en algún tipo de tienda o podría crear sobre la marcha.

La API utilizará un objeto de inicialización simulado y utilizará objetos de comando simulados.

El objeto de inicialización realmente no tiene ninguna dependencia, excepto lo que necesite inicializar.

Los objetos Command necesitarán un objeto de inicialización falso.

[EDIT]

Hay dos vías para conseguir las otras pruebas para fallar si la prueba falla la inicialización

  1. Agregar una variable privada para el caso de prueba. private isInitialized = false;. Luego, todas sus otras pruebas verifican el estado de esta variable si no es verdadera y luego falla.

  2. Amplíe su caso de prueba con la clase API. Agregar función privada que interrogue el estado de inicialización.

El limpiador de los dos es 2. La implementación más rápida es 1.

mi humilde opinión Esto puede ser un olor código cuando se tiene que acoplar sus pruebas de tal manera. Si como dijiste es una prueba de integración. ¿Por qué tienes una prueba separada para la inicialización? La integración es más parecida a ejecutar alguna acción contra su API. Por lo tanto, cada prueba de integración DEBE inicializar la API.

Es posible que desee volver a pensar su escenario de falla en cascada. Puede ser demasiado ruido al completar las pruebas.

[EDIT1a]

La única manera que puedo ver para satisfacer sus requisitos es extend NUnit. Mire específicamente en Test Case Builders y Decoradores de prueba.

El enlace está fechado en marzo de 2008, así que espero que no esté desactualizado.

+0

-1. Como estoy escribiendo una prueba de integración, no quiero burlarme de nada. Sería diferente si escribiera una prueba de unidad. Y a veces las cosas tienen que ejecutarse en orden, no siempre es un signo de mal diseño. – Deleted

+0

@ Binary255 - Lamento no haber visto ninguna información relevante sobre las pruebas de integración. Su etiqueta fue prueba unitaria. Ver mi edición para más ... – Gutzofter

+0

Ah, perdón por eso. Me doy cuenta ahora que no mencioné que estaba haciendo pruebas de integración en ninguna parte. :-(He cambiado la etiqueta. – Deleted

Cuestiones relacionadas