TestInitialize和TestCleanup未在DataTestMethod的每个DataRow之前和之后运行

时间:2013-03-22 21:06:13

标签: c# unit-testing windows-phone-8 windows-phone vs-unit-testing-framework

下面你可以看到在Window Phone Unit Test App中用Mstest编写的一些代码 我有一个名为 TestMethod1 的普通TestMethod,以及一个名为 TestMethod2 的DataTestMethod,它有三个DataRows:

[TestClass]
public class UnitTest1
{
    [TestInitialize]
    public void Setup()
    {
        Debug.WriteLine("TestInitialize");
    }

    [TestMethod]
    public void TestMethod1()
    {
        Debug.WriteLine("TestMethod1");
    }

    [DataTestMethod]
    [DataRow("a")]
    [DataRow("b")]
    [DataRow("c")]
    public void TestMethod2(string param)
    {
        Debug.WriteLine("TestMethod2 param=" + param);
    }

    [TestCleanup]
    public void TearDown()
    {
        Debug.WriteLine("TestCleanup");
    }
}

如果我在调试模式下运行测试(Ctrl + R,在Visual Studio中按Ctrl + T),我会在输出面板中看到这一点:

  

TestInitialize
  TestMethod1
  的 TestCleanup
  的 TestInitialize
  TestMethod2 param = c
  TestMethod2 param = a   TestMethod2 param = b
   TestCleanup

正如您所看到的,TestInitialize只执行了两次:一次在TestMethod1之前,一次在TestMethod2之前一次用param c执行。
TestCleanup也是如此,它在TestMethod1之后执行一次,在最后一次执行。

我希望TestInitialize和TestCleanup在每次测试之前和之后执行,无论它是TestMethod还是DataTestMethod。否则,执行一个测试可能会影响下一个测试。

我预计它会是这样的:

  

TestInitialize
  TestMethod1
  的 TestCleanup
  的 TestInitialize
  TestMethod2 param = c
  的 TestCleanup
  的 TestInitialize
  TestMethod2 param = a   的 TestCleanup
  的 TestInitialize
  TestMethod2 param = b
   TestCleanup

我没有发现其他人有同样的问题,我做错了什么?

1 个答案:

答案 0 :(得分:2)

我对此有点新意,但我认为,如果您使用[DataTestMethod]属性标记[TestMethod],它应该为每个测试方法运行Initialize and Cleanup。

[TestMethod]
[DataTestMethod]
[DataRow("a")]
[DataRow("b")]
[DataRow("c")]
public void TestMethod2(string param)
{
    Debug.WriteLine("TestMethod2 param=" + param);
}

<强>更新 微软表示:TestCleanupAttribute“将在标有TestMethodAttribute的方法后运行......”

当我测试它时它确实有效。当您说它不起作用时,请提供进一步的详细信息。

如果希望每个Test Class只运行一次的初始值设定项,则可以使用属性TestClass Attribute。 See this post.

// Use ClassInitialize to run code before running the first test in the class
[ClassInitialize()]
public static void MyClassInitialize(TestContext testContext) { }

// Use ClassCleanup to run code after all tests in a class have run
[ClassCleanup()]
public static void MyClassCleanup() { }