2011-01-05 21 views
14

Tengo el siguiente problema: soy consciente de que hay un atributo de tiempo de espera en NUnit. Mi problema es que las pruebas unitarias generan un nuevo proceso que, si se congela, NUnit nunca lo mata. ¿Cómo puedo implementar un tiempo de espera que realmente eliminará el proceso deshonesto?Tiempo de espera para pruebas individuales en NUnit

Gracias, R.

Respuesta

11

Usted puede utilizar el tiempo de espera para la afirmación, en lugar de tiempo de espera para el método de ensayo de conjunto:

Assert.That(actual, Is.EqualTo(expected).After(5000, 50)); 
+0

Absolutamente brillante. Puedes limpiar el hilo después de eso. – ashes999

+0

Tan bueno como este es, no podría hacerlo funcionar con mi escenario: engendrar otro proceso, abrir un diálogo y NUnit nunca lo matará, a menos que haga clic en el botón. –

+1

Bueno, por lo que no está haciendo pruebas de aceptación, le aconsejo que use algo como 1) Blanco http://white.codeplex.com/Thread/View.aspx?ThreadId=85842&ANCHOR 2) NUnit Forms http: //nunitforms.sourceforge.net/ Ambos son buenos para crear ventanas y presionar botones. –

3

Editar: La respuesta aceptada es una mejor.

Si su prueba, finalmente, el tiempo de espera (aunque más tarde de lo que esperas), siempre se puede utilizar el atributo MaxTime: http://www.nunit.org/index.php?p=maxtime&r=2.5.1 y limpiar el hilo de sí mismo:

[Test, Maxtime(2000)] 
public void TimedTest() 
{ 
    ... 
} 

De lo contrario, su mejor opción podría ser la implementación tu propio mecanismo de sincronización. Use un temporizador (o un ciclo while ocupado) y si se excede el tiempo de espera, entonces elimine el proceso (tal vez en el método ShutDown si es genérico en todas las pruebas) y la falla de la señal.

Los tiempos de espera de NUnit no tienen ningún evento que le permita ejecutar el código después de que finalice el tiempo de prueba. Tienes que hacer tu propio, parece.

+0

Lo más probable es que tenga que tomar el segundo camino. Solo a modo de ejemplo: si el proceso generado genera un mensaje en una máquina de compilación, nadie allí para hacer clic en él, el tiempo de espera NUnit nunca se activará. Por lo tanto, tiene que ser un mecanismo de sincronización propio. –

+0

fix build codesample: [Test, MaxTime (2000)] – razon

0

OK. Después de probar todas las características incorporadas en NUnit y no lograr lo que necesitaba, hice lo siguiente: agregué un temporizador que se está configurando en una función atribuida [SetUp] en un nivel de dispositivo y así se llama antes cada prueba. Si el temporizador marca antes de que termine la prueba, solo hago la limpieza en la devolución de llamada del temporizador.

0
[Test, Timeout(2000)] 
public void PotentiallyLongRunningTest() 
{ 
    ... 
} 

http://www.nunit.org/index.php?p=timeout&r=2.5.1:

El TimeoutAttribute se utiliza para especificar un valor de tiempo de espera en milisegundos para una caso de prueba. Si el caso de prueba se ejecuta más tiempo que el especificado, se cancela inmediatamente y se informa como un error, con un mensaje que indica que se excedió el tiempo de espera.

El atributo también se puede especificar en un dispositivo o conjunto, en cuyo caso indica el tiempo de espera predeterminado para cualquier caso de prueba subordinado.

Cuestiones relacionadas