我正在尝试定义一个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正确识别的属性?
答案 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
,而不是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");
}
}
}
希望有帮助!