2017-10-24 6 views
0

내역 : nUnit 3. 복잡한 상속 테스트가 있습니다. 특정 개체가 SetUp 또는 OneTimeSetUp 내에 만들어집니다. 그 방법은 가상입니다. 이 개체가 닫히지 않으면 누수가 발생합니다.테스트와 동일한 어셈블리에서 유닛 확장을 사용합니다.

문제 : 개체는 TearDown 또는 OneTimeTearDown 파괴되지만 SetUp 또는 OneTimeSetUp이 성공하면 그에만 호출된다. 따라서 TearDown 또는 OneTimeTearDown의 예외가 발생하면 누수가 발생합니다. 앞서 언급했듯이 다중 상속 수준이 있으므로 예외 및 중요 객체 생성은 여러 클래스에서 서로 다른 스택 프레임에서 발생할 수 있습니다.

내가 원하는 작업 : 초기화가 완료되고 중요한 개체를 정리하기 전에 ITestEventListener에 실패한 경우 반응하도록하고 싶습니다. I 클래스 만들어 내 테스트 어셈블리에 : 나는을 시도 무엇

그런

namespace My.Whatever.Tests.Web.Util 
{ 
    [Extension(EngineVersion = "3.4")] 
    public class NunitEventListener : ITestEventListener 
    { 
     public void OnTestEvent(string report) 
     { 
      Debug.WriteLine(report); 
     } 
    } 
} 

내가

  • VS (NUNIT 3 테스트 어댑터)를 통해 테스트를 실행 시도를
  • nUnit 콘솔

아무도 확장 프로그램을로드하지 못했습니다.

질문 : 내가 뭘 잘못하고 있니? 정보의

출처 : https://github.com/nunit/docs/wiki/Event-Listeners, https://github.com/nunit/docs/wiki/Writing-Engine-Extensions

답변

1

확장이 당신이 언급 두 참조의 두 번째에서 링크 된 https://github.com/nunit/docs/wiki/Engine-Extensibility#locating-addins에서 찾을 수있는 방법에 대한 정보.

테스트 어셈블리에서 확장 프로그램을 검색하지 않습니다. 우리는 확장 기능을 테스트 할 수있는 쉬운 방법으로 NUnit Addins 용 V2에서 제공했지만, 엔진 확장을 위해 그렇게하는 것은 좀 더 복잡합니다. 우리가 그 일을 할 수 있다면 IMO가 좋은 기능이지만, 새로운 테스트 어셈블리가 실행될 때 모든 익스텐션을로드 및 언로드 할 수 있어야합니다. 이는 확장 서비스의 주요 내부 변경 사항입니다.

엔진 어셈블리가있는 디렉토리에서 .addins 유형의 파일을 하나 이상 찾을 수 있습니다. 하나가 있는지, 얼마나 많이 그리고 무엇이 포함되어 있는지는 러너와 엔진을 어떻게 설치했는지에 달려 있습니다. 이 파일에는 해당 엔진 사본에 설치된 확장을 가리키는 항목이 있습니다. 자세한 내용은 위의 참조 페이지를 참조하십시오. 이가지 경우에

은, 확장의 위치 인해 .addins 파일에 와일드 카드 항목의 존재로, 더 많거나 적은 자동으로 :

  1. 당신은 NuGet을 설치 한 모든 확장 기능을 사용하여 콘솔 러너를 설치하는 경우 너겟 패키지가 발견되면

  2. Chocolatey를 사용하여 콘솔 러너를 설치하면 chocolatey로 설치된 모든 확장 프로그램이 설치됩니다.

다른 모든 경우에는 수동으로 .addins 파일을 편집해야합니다.

어댑터의 특정 경우에는 .addins 파일이 없으므로 확장명이로드되지 않습니다. 이론적으로, 당신은 손으로 그러한 파일을 생성 할 수 있고 엔진이 접근 할 수있는 디렉토리에 엔진이 설치되어있는 경우 확장 기능이로드되게 할 수 있습니다. 너겟 패키지를 사용하는 경우에 해당됩니다. 나는 당신이 콘솔 러너 (console runner) 아래에서 추가 합병증을 동반하기 때문에 이것을 시도하기 전에 자신의 확장자를 인식하도록 먼저 해보는 것이 좋습니다.

현재, 모든 타사 주자가 엔진을 사용하지는 않습니다. 물론 엔진을 전혀 사용하지 않으면 확장 기능을 제공 할 수 없습니다.

업데이트 : TearDownOneTimeTearDownSetUp or OneTimeSetUp 성공시에만 실행되는 것으로 나타났습니다. 그것은 진실이 아닙니다. 두 가지 종류의 해체는 해당 설정이 인 경우이 성공했는지 여부와 관계없이 실행됩니다. 물론, 해당 설정이 완료되지 않았을 수 있다는 사실을 고려하여 분해가 작성되어야합니다. 까다로울 수 있습니다.

+0

Mr. Poole, 저는 이것을 답변으로 받아 들였습니다.하지만 내 사건과 관련하여 "테스트에 실패했습니다"라는 이벤트를 구독하는 다른 방법이있을 수 있습니까? 그렇지 않으면 지금까지 내가 볼 수있는 가장 쉬운 일은 AOP를 사용하거나 동적으로 IL을 내보내고 런타임에 코드를 패치하는 것입니다. –

+0

내 대답은 업데이트를 참조하십시오. 테스트에 실패했음을 알리기 만하면 테스트 중 하나에서 테스트를 수행 할 수 있어야합니다. 특히, 마지막 분해 실행에서 수행하십시오. 이는 첫 번째 설정 실행에 해당합니다. 그 해체가 실행되지 않는 상황을 생각할 수 없습니다. – Charlie

+0

안녕하세요. Mr Poole, 저는 여러 번 검증했고 다음 시나리오를 쳤습니다. 1) 내 테스트에 OneTimeSetUp 및 SetUp이 있습니다. 2) SetUp은 비어있는 기본 클래스의 가상 메소드입니다. 3) OneTimeSetup은 객체를 생성합니다. 4) 팀시 로그에 표시되는 내용 : SetUp Error는 OneTimeSetup을 가리키며 invalidOperationException은 개체 초기화 내에서 가리키고 OneTimeTearDown은 실행되지 않습니다. 내 oneTimeTearDown은이 경우를 예상하며 호출되면 실행됩니다 (로그 생성). 하지만 그렇지 않았습니다. –