2009-10-30 4 views
7

나는 예외가 던지면 테스트하는 단위 테스트를 가지고 있지만이 예외는 [조건부 ("DEBUG")] 속성을 통해 디버그 모드에서만 던져 버린다. 릴리스 모드에서이 테스트를 실행하면 실패합니다. 테스트에서 동일한 속성을 적용하려고 시도했지만 고려되지 않았습니다.DEBUG 모드에서만 단위 테스트를 실행할 수 있습니까?

릴리스 모드에서 테스트를 제외하려면 어떻게해야합니까? 릴리스 모드에서 단위 테스트를 실행하는 것이 의미가 있습니까? 아니면 디버그 모드에 고정해야합니까?

+0

관련을 : HTTP : //stackoverflow.com/questions/3133988/make-mstest-respect-conditional-attribute –

답변

10

대부분의 질문에 관해서는, 당신이 사용하는 단위 테스트 도구에 따라 다소 다릅니다. 그러나 일반적으로 당신은 당신의 상황

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

에 대한 preprocessor directives

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

아마도하지만 같은 릴리스 버전에서 단위 테스트를 떠나 여부에 원하는 것을? 나는 울리는 NO를 줄 것이다. 모든 단위 테스트를 자신의 프로젝트로 옮기고 이것을 릴리스에 포함시키지 않을 것을 제안합니다. 당신이 xUnit의를 사용하는 경우

+0

물론 내 모든 단위 테스트는 다른 프로젝트에 있지만 릴리스 모드에서 실행할 수는 있습니다 ... –

+0

릴리스와 디버그에서 왜 서로 다르게하기를 원하십니까? –

+0

디버그 모드와 릴리스 모드에서 나 코드가 동일하게 작동하는지 확인하고 싶습니다. 하지만이 특별한 경우에는 예외가 디버그 모드에서만 던져 져야하기 때문에 릴리스 모드에서 테스트가 실패한다는 것을 알고 있습니다 (설계 상) –

5

이 시도 :

#if DEBUG 

// here is your test 

#endif 
+0

이것은 효과가 있지만 너무 과감한 해결책이라고 생각합니다. 대신, [무시] 속성을 사용했습니다 (여전히 #if! DEBUG ... #endif에 포함되어 있지만 더 좋아합니다). –

3

당신이 NUnit과를 사용하는 경우, 당신은 조건 당신의 단위 테스트 방법을 만들 수 있습니다

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

에만 DEBUG에서 실행됩니다 이런 식으로 작성합니다. Visual Studio 유닛 테스트에 대한 많은 경험이 없지만 VS에서도이 기능이 제대로 작동해야합니다.

편집 : 기타 조건부 컴파일 지시어가 있습니다. 나는 그것이 여러 가지 이유로 아주 좋은 생각이라고 생각하지 않습니다. 조건부 컴파일 지시문과 조건부 속성의 차이점에 대해 자세히 알아 보려면 Eric Lippert's excellent article here을 읽어보십시오.

+2

MSTest를 사용 중이고 조건부 특성이 테스트 엔진에 의해 부여되지 않는 것처럼 보입니다 ... –

+0

UnitTestMethod에서 호출 할 DoUnitTestMethod 도우미 메서드에 조건부 특성을 넣을 수 있습니다. 그러면 항상 릴리스 모드에서 통과하는 빈 테스트가됩니다. 그래도 [ExpectedException]과 같은 것들로 더 까다로워집니다. 전체 테스트 케이스에서 #if 디버그를 사용하는 것이 가장 간단합니다. – yoyo

0

, 당신은 사실 속성 확장하여 다음과 같은 방법 as described by Jimmy Bogard를 사용할 수 있습니다

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

을 다음과 같이 당신이를 사용할 수 있습니다

[RunnableInDebugOnly] 
public void Test_RunOnlyWhenDebugging() 
{ 
    //your test code 
} 
관련 문제