未调用的基于类的单元测试中的ClassInitialize属性

本文关键字:ClassInitialize 单元测试 属性 于类 调用 | 更新日期: 2023-09-27 18:07:58

我在TestBase类中添加了这些方法:

[ClassInitialize]
public static void InitializBeforeAllTests()
{
}

但是当我运行在调试单元测试Test1():

[TestClass]
public class TestMapping : TestBase
{
    [TestMethod]
    public void Test1()
    {
    }

永远不会调用TestBase.InitializBeforeAllTests()方法。为什么?

未调用的基于类的单元测试中的ClassInitialize属性

在方法上声明ClassInitialize属性时,该方法必须是静态的、公共的、void的(或者Task,如果是异步的),并且应该接受一个TestContext类型的参数

如果您在相同的单元测试上也有其他带有AssemblyInitialize属性的方法,测试将运行,但将跳过所有测试方法,并将直接转到AssemblyCleanup或直接退出。

可以在基类中设置程序集初始化方法。与ClassInitialize不完全相同,但它是一个可行的选择。来源:这里提到的变通方法。

[TestClass]
public abstract class TestBase
{
    [AssemblyInitializeAttribute]
    public static void Initialize(TestContext context)
    {
        // put your initialize code here
    }
}

您还可以添加一个Cleanup方法:

[AssemblyCleanup]
public static void Cleanup()
{
   //clean up stuff here
}

不管什么原因,单元测试框架的UnitTestExecuter只允许每个测试类定义一个ClassInitialize和一个ClassCleanup方法…不像TestInitialize和TestCleanup方法,它们在派生和基测试类中都被调用…

我知道这是一个非常古老的问题,但它的第一个弹出在谷歌搜索时寻找类似的问题,无论如何,这里是一个更新的答案:

 [ClassInitialize(InheritanceBehavior.BeforeEachDerivedClass)]
 public static void YOUR_INIT_METHOD_NAME(TestContext context)

注意:您需要MSTest。testframe - version 2.0.0或更新的包

MS链接不再工作。无论如何,解决这个问题的一种方法是简单地将初始化代码移到基类的构造函数中。这将确保任何子类在实例化时都能被调用。

[TestClass]
public class TestBase
{
    public TestBase()
    {
        // Initialization Code
    }
}
[TestClass]
public class TestMapping : TestBase
{
    [TestMethod]
    public void Test1()
    {
        // At this point the base constructor should have been called
    }
}

在我的例子中,我应用了[Ignore]属性(测试是手动运行的)
这导致[AssemblyInitialize]永远不会被调用

如果我删除[Ignore]属性,[AssemblyInitialize]将按预期调用。

奇怪的是,[AssemblyCleanup]仍然被调用,无论是否将[Ignore]应用于我的测试

在我的情况下,[ClassInitialize]方法从未被调用,因为我没有将TestContext作为参数传递。即使它是可选的,我猜你每次都必须传递它,即使你没有在方法中使用它。

方法签名

[ClassInitialize(InheritanceBehavior.None)]
public static void OnClassInitialize(TestContext context)
{
    // Log in to the system
}