首页 > 解决方案 > 如何在同一个测试中使用 TestCaseSource 和 TestOf 属性?

问题描述

我正在尝试定义一个使用TestCaseSource属性接收数据的参数化测试。我还需要定义一个属性以将每个测试与 Jira 票证相关联,并且按照此处的建议,我使用TestOf属性,如下所示:

[TestOf("SomeId")]
[TestCaseSource(typeof(SomeProviderClass), "someMethod")]
public void SampleTest(dynamic myData)
{
    //do something with myData
    //assert something
}

但是,在执行测试时,在 TearDown 处,应该具有 TestOf 值的 TestContext.CurrentContext.Test.Properties 的大小为空。我应该如何定义 NUnit 正确识别的属性?

标签: c#nunit

解决方案


当您使用 TestCaseSource 时,您实际上是在创建一个“套件”测试。NUnit 测试以树的形式构建。通常,您的程序集将是树的最高根,并且此树中的每个类都是一个分支,该分支又分支以包含所有单独的测试方法。IE

                           -Test1
              - TestClassA -Test2
                           -Test3
TestAssembly  
                           -Test4
              - TestClassB -Test5
                           -Test6             

如果您查看 TestResults.xml,您可以看到此结构。

当您使用时,TestCaseSource您实际上是在树上创建另一个级别。所以现在你的树看起来像这样。

                                                -Test1A
                           -TestCaseSourceSuite -Test1B
                                                -Test1C
              - TestClassA -Test2
                           -Test3
TestAssembly  
                           -Test4
              - TestClassB -Test5
                           -Test6             

在您的示例中,TestCaseSourceSuite将命名为SampleTest. 您当前拥有的内容不起作用的原因是该TestOf属性当前应用于TestCaseSourceSuite, 而不是Test1A, Test1B Test1C。(像 TestOf 这样的属性不会按层次结构向上或向下复制树。)


反正。我们如何解决它?为您的 TestCaseSource 使用 TestCaseData 似乎是最好的选择。TestOfAttribute 实际上并没有多大用处,因此没有用于设置值的“命名属性”,但您可以使用SetProperty方法和PropertyNames类来代替。试试这样的东西......

public class MyTests
{
    [TestCaseSource(typeof(MyDataClass), "TestCases")]
    public void Test(int n, int d)
    {
        Assert.IsTrue(true);
    }
}

public class MyDataClass
{
    public static IEnumerable TestCases
    {
        get
        {
            yield return new TestCaseData(12, 3).SetProperty(PropertyNames.TestOf, "MethodUnderTest");
            yield return new TestCaseData(12, 2).SetProperty(PropertyNames.TestOf, "MethodUnderTest");
        }
    }  
}

希望有帮助!


推荐阅读