2010-03-25 5 views
17

Visual Studio를 사용하면 테스트 단위 클래스를 생성 할 수 있습니다. 그런 다음 클래스 초기화 메소드에 주석을 달아 라. 그 안에는 testContext 인수를 사용하여 속성을 추가하십시오.TestContext.Properties를 사용할 수 있습니까?

테스트 앱을 시작할 때이 방법은 실제로 테스트 인프라에서 호출됩니다.

//Use ClassInitialize to run code before running the first test in the class 
[ClassInitialize()] 
public static void MyClassInitialize(TestContext testContext) 
{ 
    /* 
    * Any user defined testContext.Properties 
    * added here will be erased after this method exits 
    */ 
    testContext.Properties.Add("key", 1) ; // place the break point here 
} 

MyClassInitialize에서 나가면 사용자가 추가 한 속성이 모두 손실됩니다. 단지 10 개의 "공식적인"것들만 남아 있습니다.

실제로 각 테스트 메소드가 호출되기 전에 TestContext는 inital 공식 스크립트로 덮어 쓰여집니다. 사용자가 테스트 초기화 메소드를 가지고있는 경우에만 덮어 쓰지 않으며, 거기서 변경 한 사항은 테스트에 전달됩니다.

//Use TestInitialize to run code before running each test 
[TestInitialize()]public void MyTestInitialize(){ 
    this.TestContext.Properties.Add("this is preserved",1) ; 
} 

이것은 실제로 사용자를 위해 TestContext.Properties가 "주로"읽기 전용임을 의미합니다. MSDN에 명확히 설명되어 있지 않습니다.

이것은 매우 지저분한 디자인 + 구현입니다. TestContext.Properties를 콜렉션으로 사용하는 이유는 무엇입니까? 사용자는 클래스 와이드 초기화를 위해 다른 많은 솔루션을 수행 할 수 있습니다.

+2

필자는 실제로 그것을 사용하는 테스트 컨텍스트의 목적을 이해하지 못했습니다. –

+0

https://blogs.msdn.microsoft.com/vstsqualitytools/2006/01/09/using-testcontext-in-unit-tests/ –

답변

1

나는 당신이 testContext 사본을 유지해야한다고 믿는다. 그렇지 않으면 testContext가 범위를 벗어난다.

나는 추가 :

private TestContext _tc; 

내가이 새로 추가 된 속성을 포함하는 테스트 중 하나에서 TC 볼 때 초기화

tc = testContext; 

에 추가됩니다.

+2

에서 설명하는 목적 이것은 다음에 의해 생성 된 테스트 단위 클래스의 컨텍스트에서는 작동하지 않습니다. 비주얼 스튜디오. 하나의 매우 분명한 공명은 초기 게시물의 초기화 방법이 정적이라는 것입니다. Visual Studio에서 생성. –

11

TestContext는 각 테스트마다 고유하므로 ClassInitialize에서 초기화하면 작동하지 않습니다. TestInitialize, TestCleanup 및 TestMethod 메서드에만 사용해야합니다.

This post 스레딩을 포함하여 한 클래스의 테스트가 어떻게 실행되는지 설명 할 수 있습니다.

즉, 아직 TestContext에 대한 사용을 찾지 못했지만 MSTest를 처음 사용했습니다. 나는 MSDN 문서가 혼란 스럽다는 것에 동의합니다. 모든 샘플 메소드를 콘솔에 쓰거나 메시지 상자를 던져 버리면 그 가능성을 나타낼 수 없습니다.

+1

동의하지만 ... 내가 만들고있는 요점은 (더 나쁜) 구현이 혼란 스럽기 때문에 (더 나쁜) 구현이 혼란 스럽다는 것입니다. 결과는 "기능"으로 판매되는 버그입니다. –

+0

2 년 전 상태에 대해 알지 못합니다. 그러나 TestInitialize에서 속성을 추가하는이 방법은 작동하지 않습니다. "같은 키를 가진 항목이 이미 추가되었습니다"라는 메시지와 함께 예외가 발생합니다.따라서 ClassInitialize는 완전히 다른 TestContext를 전달 받지만 테스트 자체는 모두 동일한 TestContext를 얻습니다. – Amanduh

0

TestContext는 외부에서 테스트에 정보를 전달하는 데 사용됩니다. 테스트 실행자 또는 .runsettings 파일을 통해 일반적으로 데이터가 한 방향으로 이동합니다.

관련 문제