47

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

[ClassInitialize]
public static void InitializBeforeAllTests()
{
}

但是当我在 Debug 中运行单元测试时Test1()

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

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

4

6 回答 6

16

在方法上声明 ClassInitialize 属性时,该方法必须是静态的、公共的、无效的,并且应该采用 TestContext 类型的单个参数

如果您在同一个单元测试中还有其他具有 AssemblyInitialize 属性的方法,则测试将运行但会跳过所有测试方法并直接转到 AssemblyCleanup 或退出。

尝试MSDN 中 ClassInitialize 属性的示例。

于 2014-05-05T07:45:12.090 回答
10

您可以在基类中设置程序集初始化方法。与 ClassInitialize 不太一样,但它是一个可行的选择。来源:此处提到的解决方法。

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

您还可以添加清理方法:

[AssemblyCleanup]
public static void Cleanup()
{
   //clean up stuff here
}
于 2013-07-17T14:34:32.310 回答
9

无论出于何种原因,单元测试框架的 UnitTestExecuter 只允许为每个测试类定义一个 ClassInitialize 和一个 ClassCleanup 方法......不像 TestInitialize 和 TestCleanup 方法,它们在派生和基础测试类中都被调用......

于 2011-12-29T18:34:47.673 回答
4

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

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

注意:您需要 MSTest.TestFramework-Version 2.0.0 包或更新的包才能工作。

于 2021-03-28T11:07:42.850 回答
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
    }
}
于 2015-02-13T17:03:47.320 回答
0

就我而言,我[Ignore]应用了属性(手动运行测试)
这导致[AssemblyInitialize]永远不会被调用

如果我删除了该[Ignore]属性[AssemblyInitialize],则会按预期调用。

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

于 2019-02-06T17:13:56.927 回答