c# - 如何在同一个测试中使用 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 正确识别的属性?
解决方案
当您使用 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");
}
}
}
希望有帮助!
推荐阅读
- java - Java 过滤器适用于一个谓词,但不适用于另一个谓词
- java - 如何从 swt.SelectionListener 中找到事件类型?
- laravel - Laravel Eloquent:在主要语句上应用“with where”过滤器
- jquery - 根据表单输入数创建多维数组
- jquery - JQuery 3.4.1 支持哪个版本的 bootstrap
- docker - 具有特定用户的 Gitlab CI 作业
- javascript - 哈希链接与导航菜单不匹配
- swift - 在 Swift 5 中的 applicationWillResignActive 中显示图像
- flutter - 如何防止关闭 CupertinoActionSheet/showCupertinoModalPopup?
- c# - Sage 200:无法将许多 *.dll 文件添加到我的 Visual Studio C# 项目中以使 Sage 200 基本功能正常工作