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

str*_*lsi 5 c# unit-testing windows-phone vs-unit-testing-framework windows-phone-8

在下面,您可以在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");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果以调试模式运行测试(在Visual Studio中为Ctrl + R,Ctrl + T),则会在输出面板中看到以下内容:

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

如您所见,TestInitialize仅执行了两次:一次在TestMethod1之前,一次在带有参数c的TestMethod2之前。
对于TestCleanup来说是相同的,它在TestMethod1之后执行一次,并在最后一次执行一次。

我希望无论测试是TestMethod还是DataTestMethod,在每次测试之前和之后都要执行TestInitialize和TestCleanup。否则,一项测试的执行会影响下一项测试。

我希望它是这样的:

TestInitialize
TestMethod1
TestCleanup
TestInitialize
TestMethod2 PARAM = C
TestCleanup
TestInitialize
TestMethod2 PARAM =一个
TestCleanup
TestInitialize
TestMethod2 PARAM = B
TestCleanup

我没有找到其他人遇到相同的问题,我在做什么错?

Cap*_*Bli 4

我对此有点陌生,但我认为如果您也使用属性标记它[DataTestMethod],[TestMethod]它应该为每个测试方法运行初始化和清理。

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

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

当我测试这个时它确实有效。当您说它不起作用时,请提供更多详细信息。

如果您希望每个测试类只运行一次初始化程序,您可以使用属性 TestClass Attribute。请参阅这篇文章。

// 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() { }
Run Code Online (Sandbox Code Playgroud)