2009-10-30 16 views
7

Mam test jednostki, który sprawdza, czy wyjątek jest rzut, ale ten wyjątek jest tylko rzucić w trybie debugowania (za pomocą [warunkowego ("DEBUG")] Atrybut). Jeśli uruchomię ten test w trybie Release, nie powiedzie się. Próbowałem zastosować ten sam Atrybut w teście, ale nie jest to brane pod uwagę.Jak mogę uruchomić test jednostkowy tylko w trybie DEBUG?

Jak wykluczyć test w trybie zwolnienia? Czy ma sens nawet przeprowadzanie testów jednostkowych w trybie Release lub czy powinienem trzymać się trybu debugowania?

+0

related: http: //stackoverflow.com/questions/3133988/make-mstest-respect-citional-attribute –

Odpowiedz

10

Co do większości pytań, to zależy to od tego, jakie narzędzie do testowania urządzenia używasz. Jednak w ogóle, co chcesz są preprocessor directives

//C# 
#ifndef DEBUG 
    //Unit test 
#endif 

Być może w danej sytuacji

//C# - for NUnit 
#if !DEBUG 
    [Ignore("This test runs only in debug")] 
#endif 

Ale czy zostawić testy jednostkowe w oryginalnej wersji? Dałbym głośny NO. Proponuję przeniesienie wszystkich twoich testów jednostkowych do własnego projektu i NIE włączając tego w twoje wydania.

+0

Oczywiście wszystkie moje testy jednostkowe są w innym projekcie, ale nadal mogę je uruchomić w trybie Release ... –

+0

Dlaczego naprawdę chcesz, aby różniły się pod względem wydania i debugowania? –

+0

Chcę mieć pewność, że kod ja będzie zachowywał się tak samo podczas debugowania i w trybie Release. Ale w tym konkretnym przypadku, * wiem *, że test zakończy się niepowodzeniem w trybie Release, ponieważ wyjątek powinien być zgłaszany tylko w trybie debugowania (według projektu). –

5

Spróbuj tego:

#if DEBUG 

// here is your test 

#endif 
+0

To działa, ale myślę, że to zbyt drastyczne rozwiązanie. Zamiast tego użyłem atrybutu [Ignore] (nadal, jest on zamknięty wewnątrz #if! DEBUG ... #endif, ale lubię go lepiej). –

3

Jeśli używasz NUnit można dokonać metody badań jednostka warunkowy:

[System.Diagnostics.Conditional("DEBUG")] 
public void UnitTestMethod() 
{ 
    // Tests here 
} 

ten sposób zostanie on wykonany tylko w debugowania buduje. Nie mam dużego doświadczenia z testami jednostkowymi programu Visual Studio, ale jestem pewien, że to powinno działać również w VS.

EDYCJA: Inni wymieniali warunkowe dyrektywy kompilacyjne. Nie sądzę, że jest to bardzo dobry pomysł z wielu powodów. Aby dowiedzieć się więcej na temat różnic między dyrektywami kompilacji warunkowej a atrybutem warunkowym, przeczytaj Eric Lippert's excellent article here.

+2

Używam MSTest i wygląda na to, że atrybut warunkowy nie jest honorowany przez silnik testowy ... –

+0

Możesz umieścić atrybut warunkowy na metodzie pomocnika DoUnitTestMethod, którą wywołasz z UnitTestMethod. To stałoby się pustym testem, który zawsze przechodzi w trybie Release. Pobiera trudniejsze rzeczy, takie jak [ExpectedException]. Najprostszy po prostu użyć #if DEBUG wokół całego testu. – yoyo

0

Jeśli używasz xUnit, można użyć następującej metody as described by Jimmy Bogard rozszerzając atrybut fakt:

public class RunnableInDebugOnlyAttribute : FactAttribute 
{ 
    public RunnableInDebugOnlyAttribute() 
    { 
     if (!Debugger.IsAttached) 
     { 
      Skip = "Only running in interactive mode."; 
     } 
    } 
} 

a następnie można użyć to w następujący sposób:

[RunnableInDebugOnly] 
public void Test_RunOnlyWhenDebugging() 
{ 
    //your test code 
} 
Powiązane problemy