2011-01-05 35 views
14

Ho il seguente problema: Sono a conoscenza dell'esistenza di un attributo Timeout in NUnit. Il mio problema è che i test unitari generano effettivamente un nuovo processo che, se congelato, non viene mai ucciso da NUnit. Come posso implementare un timeout che in realtà eliminerà il processo canaglia?Timeout per test individuali in NUnit

Grazie, R.

risposta

11

È possibile utilizzare timeout per affermazione, invece di timeout per il metodo di prova intero:

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

Assolutamente geniale. Puoi pulire il thread dopo di ciò. – ashes999

+0

Per quanto buono, non potrei farlo funzionare con il mio scenario: generare un altro processo, aprire un dialogo e NUnit non lo ucciderà mai, a meno che non clicchi sul pulsante. –

+1

Bene, quindi non stai facendo test di accettazione, ti consiglio di usare qualcosa come 1) Bianco http://white.codeplex.com/Thread/View.aspx?ThreadId=85842&ANCHOR 2) Moduli NUnit http: //nunitforms.sourceforge.net/ Entrambi sono utili per creare finestre e premere i pulsanti. –

3

Edit: La risposta accettata è uno migliore.

Se il test alla fine volte su (anche se più tardi si spera), si può sempre utilizzare l'attributo MaxTime: http://www.nunit.org/index.php?p=maxtime&r=2.5.1 e ripulire il filo da soli:

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

In caso contrario, la soluzione migliore potrebbe essere quella di implementare il tuo meccanismo di temporizzazione. Usa un timer (o un ciclo while occupato) e se il timeout viene superato, quindi uccidi il processo (magari nel metodo ShutDown se è generico tra i test) e segnala il fallimento.

I timeout NUnit non hanno eventi che consentono di eseguire il codice dopo il test scaduto. Devi tirare il tuo, sembra.

+0

Molto probabilmente dovrò andare al secondo percorso. Proprio come un esempio: se il processo generato genera un messaggio su una macchina di compilazione - nessuno a fare clic su di esso - il timeout di NUnit non verrà mai attivato. Deve quindi esserci un meccanismo di temporizzazione per conto mio. –

+0

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

0

OK. Dopo aver provato tutte le funzionalità integrate in NUnit e non sono riuscito a ottenere ciò di cui avevo bisogno, ho fatto quanto segue: Ho aggiunto un timer che viene impostato in una funzione attribuita a [SetUp] a livello di fixture e quindi viene chiamato prima ogni test. Se il timer fa tic tac prima che il test sia terminato, eseguo semplicemente il clean-up nella richiamata del timer.

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

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

La TimeoutAttribute viene utilizzato per specificare un valore di timeout in millisecondi per un banco di prova. Se il test case viene eseguito più a lungo del tempo specificato, viene immediatamente annullato e segnalato come errore, con un messaggio che indica che il timeout è stato superato.

L'attributo può anche essere specificato su un proiettore o un assieme, nel qual caso indica il timeout predefinito per qualsiasi caso di test subordinato.