如何在同一测试中使用TestCaseSource和TestOf属性?

时间:2020-04-03 17:55:49

标签: c# nunit

我正在尝试定义一个parameterized test来使用TestCaseSource属性接收数据。我还需要定义一个属性,以将每个测试与Jira票证相关联,并且按照推荐的here,我正在使用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正确识别的属性?

1 个答案:

答案 0 :(得分:1)

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

                           -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,而不是Test1ATest1B 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");
        }
    }  
}

希望有帮助!