UFO ET IT

MsTest ClassInitialize 및 상속

ufoet 2020. 12. 9. 20:58
반응형

MsTest ClassInitialize 및 상속


다음과 같은 방식으로 구성된 테스트 용 기본 클래스가 있습니다.

[TestClass]
public abstract class MyBaseTest
{
   protected static string myField = "";

   [ClassInitialize]
   public static void ClassInitialize(TestContext context)
   {
       // static field initialization
       myField = "new value";
   }
}

이제 다음 서명을 사용하여 기본에서 상속되는 새 테스트를 만들려고합니다.

[TestClass]
public class MyTest : MyBaseTest
{
   [TestMethod]
   public void BaseMethod_ShouldHave_FieldInitialized()
   {
       Assert.IsTrue(myField == "new value");
   }
}

ClassInitialize뭐라고입니다 ... 자식 시험에 의해 호출되지 않습니다 현실과 올바른 MSTEST에 상속 테스트 초기화를 사용하는 방법은?


불행히도 ClassInitializeAttribute 클래스 는 상속 될 수 없기 때문에 그렇게 할 수 없습니다.

상속 된 속성은이를 사용하는 클래스의 하위 클래스에서 사용할 수 있습니다. ClassInitializeAttribute상속 될 수 없으므로 MyTest클래스가 초기화되면 클래스의 ClassInitialize메서드를 MyBaseTest호출 할 수 없습니다.

다른 방법으로 해결해보십시오. 덜 효율적인 방법은 ClassInitialize메서드를 다시 정의 MyTest하고 코드를 복제하는 대신 기본 메서드를 호출하는 것입니다.


잠재적 인 해결 방법은 AssemblyInitializeAttribute대신 새 클래스를 정의하는 것입니다. 분명히 다른 범위를 가지고 있지만 나에게는 내 요구를 충족시킵니다 (모든 테스트 클래스와 테스트 방법에 대해 정확히 동일한 설정이 필요한 교차 절단 문제).

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace MyTests
{
  [TestClass]
  public sealed class TestAssemblyInitialize
  {
    [AssemblyInitialize]
    public static void Initialize(TestContext context)
    {
      ...
    }
  }
}

클래스가 실행될 때 클래스의 모든 [TestMethod]에 대해 클래스의 새 인스턴스가 생성된다는 것을 알고 있습니다. 이것이 발생할 때마다 기본 클래스의 매개 변수없는 생성자가 호출됩니다. 기본 클래스에 정적 변수를 만들고 생성자가 실행될 때 테스트 할 수는 없습니까?

이렇게하면 하위 클래스에 초기화 코드를 넣는 것을 잊지 않도록 도와줍니다.

이 접근 방식에 단점이 있는지 확실하지 않습니다.

이렇게 :

public class TestBase
{
    private static bool _isInitialized = false;
    public TestBase()
    {
        if (!_isInitialized)
        {
            TestClassInitialize();
            _isInitialized = true;
        }
    }

    public void TestClassInitialize()
    {
        // Do one-time init stuff
    }
}
public class SalesOrderTotals_Test : TestBase
{
    [TestMethod]
    public void TotalsCalulateWhenThereIsNoSalesTax()
    {
    }
    [TestMethod]
    public void TotalsCalulateWhenThereIsSalesTax()
    {
    }
}

기본 클래스에서 정적 생성자를 사용 하시겠습니까? 설계 상 한 번만 실행되며 ClassInitializeAttribute와 같이 상속에 대한 이상한 제한이 없습니다.

참고 URL : https://stackoverflow.com/questions/15944504/mstest-classinitialize-and-inheritance

반응형