2017-12-07 9 views
1

NUMPERT (3) (3.8.1) 확장을 작성하여 테스트를 실패하면 Debug.Assert(...)이 자동으로 실행되거나 중지되지 않고 실패 할 수 있습니다. 어설 션 대화 상자가 나타나기 때문에).실패한 Debug.Assert에서 NUnit 3 확장 테스트 실패

NUnit 2 addin에서 모든 디버그 추적 수신기의 등록을 취소하고 예외 (예 : here 설명)를 내 자신의 코드를 추가하여 추가 할 수있었습니다. 그러나 이것은 NUnit 3에서 더 이상 작동하지 않는 것 같습니다.

확장 프로그램을 성공적으로 배포 할 수 있으며 코드가 실행 중입니다.

[Extension(Description = "Failed Assertions Tracker", EngineVersion = "3.4")] 
public class TrackerEventListener : ITestEventListener 
{ 
    public void OnTestEvent(string report) 
    { 
     Console.WriteLine(report); // prints -> so I know this method is being called 
     Debug.Listeners.Clear(); 
     Debug.Listeners.Add(new UnitTestTraceListener()); 
    } 
} 

하지만, 내 단위 테스트는 불행하게도 여전히 DefaultTraceListener가 설치되어 있는지 나를 보여줍니다.

[Test] 
public void FailingAssertionShouldNotHang() 
{ 
    foreach (object listener in Debug.Listeners) 
    { 
     Console.WriteLine(listener.GetType().FullName); 
    } 
    Debug.Fail("I'm sorry. I've failed."); 
} 

그래서 테스트는 단순히 실패하는 대신 대화 상자를 표시합니다.

내가 뭘 잘못하고 있니? 실제 테스트가 다른 컨텍스트 (다른 ​​AppDomain, process,?)에서 실행되기 때문에 정적 Listeners 컬렉션에 대한 호출이 비효율적이라고 생각합니다. 그러나 이것이 사실이라면 어떻게하면 내 문제를 해결할 수 있습니까?

+1

이 될 수있다이 댓글 (https://stackoverflow.com/questions/2662041/can-i-configure-nunit-so-that-debug-fail-doesnt-show-a-message-box -when-i-run-m/2798663 # comment61962711_3184631) 도움이 될 것입니다. –

+0

@AluanHaddad : 모든 테스트 픽스쳐에 대해 자신을 반복하고 싶지는 않습니다. 따라서 논리를 확장으로 쓰고 싶습니다. – Dejan

+0

@AluanHaddad : 죄송합니다. 너무 빨리 읽었습니다. SetUpFixtures (https://github.com/nunit/docs/wiki/SetUpFixture-Attribute)를 사용하면 최소한 테스트 된 어셈블리 당 한 번만 로직을 만들 수 있습니다. 그것은 충분히 공정한 해결책 일 것입니다. – Dejan

답변

1

NUnit 3 Extensions는 NUnit 2 Addins를 대체 할 수 있지만 실제로는 완전히 다른 기술이라는 점을 명심해야합니다. NUnit 3 Extensions는 프레임 워크와 별도로 엔진을 확장합니다.

이 경우 확장은 엔진에 의해 생성 된 디버그 추적 또는 어서 트 출력 을 캡처하는 추적 수신기를 설정 중입니다.. 엔진에 Trace 문이 포함되어있는 경우 (그렇지 않은 경우) 출력이 표시됩니다. 한편이 프레임 워크는 계속해서 자체 테스트를 진행하고 있습니다.

추적을 성공적으로 캡처 할 수있는 코드는 실제 프레임 워크를 테스트 실행의 일부로 포함해야합니다. 이것은 두 가지 옵션을 제공합니다.

  1. 추적을 캡처 할 사용자 지정 특성을 만듭니다. 사용자 정의 속성을 사용하면 테스트가 생성되거나 실행될 때 조치를 취할 수 있습니다. 이들은 프레임 워크가 지원하는 다양한 인터페이스를 구현함으로써 만들어집니다. 귀하의 경우 어셈블리에서 생성 된 출력을 모두 으로 캡처하려면 어셈블리 수준에서 특성을 제공해야합니다.

  2. 프레임 워크를 전혀 확장하지 않고 테스트의 일부로 코드를 만듭니다. OneTimeSetUp 특성을 사용하여 어셈블리 수준 SetUpFixture에서 Trace 출력을 캡처하고 OneTimeTearDown 특성 아래에 릴리스하고자 할 것입니다. 이 방법은 사용자 지정 특성을 만드는 것보다 간단하기 때문에 사용하는 방법입니다.

+0

나는 비밀리에 내 질문에 답할 수 있기를 바랐다.) 그 경우에는 2를 구현하려고 노력할 것이다. - 지속적인 공유와 돌봄에 감사드립니다! – Dejan