Pes*_*ska 1 c# nunit unit-testing
正如标题所说,我想使用 aTestCase和TestCaseSource/的组合ValueSource。
这是一个例子:
public static string[] Source1 = new string[]
{
"One", "Two", "Three"
};
public static string[] Source2 = new string[]
{
"Four", "Five", "Six"
};
[TestCase("A"), TestCaseSource(nameof(Source1))]
[TestCase("B"), TestCaseSource(nameof(Source2))]
[TestCase("C"), TestCaseSource(nameof(Source1))]
[TestCase("C"), TestCaseSource(nameof(Source2))]
public void MyTest(string x, string y)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
当然这是行不通的,但我想做的是:
有可能实现这样的目标吗?
答案很长,因为我想澄清所涉及的权衡......
我将回答您首先提出的问题:是否可以在 NUnit 中使用 TestCase 和 TestCaseSource/ValueSource 的组合?
是的。NUnit 允许您组合方法上测试用例数据的任何源。
在您的示例中,您总共为该MyTest方法提供了 16 个测试用例。当然,所有这些都是无效的,因为 MyTest 采用两个参数,并且每个测试用例仅提供一个值。
从示例中可以看出,您希望将属性放在相同的括号内以某种方式进行分组。C# 不是这样解释它们的。你写的和写这个完全一样:
[TestCase("A")]
[TestCase("B")]
[TestCase("C")]
[TestCaseSource(nameof(Source1))]
[TestCaseSource(nameof(Source2))]
[TestCaseSource(nameof(Source1))]
[TestCaseSource(nameof(Source2))]
Run Code Online (Sandbox Code Playgroud)
这不是 NUnit 问题。这就是 C# 属性的工作原理。
因此,虽然可以在同一方法上组合属性,但不可能按照您想要的方式将这些属性的值组合到测试用例中。
ValuesNUnit 确实有一种方法可以使用or属性来组合值ValueSource,该属性适用于各个参数而不是方法。
使用ValuesAttribute,您可以像这样重写您的示例......
public void MyTest(
[Values("A", "B", "C")] string x,
[Values("One", "Two", "Three")] string y )
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
这几乎对你有用,但不完全有效。创建了九个案例,其中包含("A", "B", "C")和的每种可能的组合("One", "Two", "Three")。但是,您希望“B”与“四”、“五”和“六”组合,而“C”与第二个论点的所有六个值组合。既不Values也ValueSource不允许你把事情控制到那种程度。
这让我们回到了TestCaseSource。正如评论中所建议的,您可以使用一种方法通过TestCaseSourceAttribute. 这是您编写此类方法的一种方法......
static IEnumerable<TestCaseData> MySource()
{
var source1 = new [] { "One", "Two", "Three" };
var source2 = new [] { "Four", "Five", "Six" };
var source3 = source1.Concat(source2);
foreach (var y in source1)
yield return new TestCaseData("A", y);
foreach (var y in source2)
yield return new TestCaseData("B", y);
foreach (var y in source1)
yield return new TestCaseData("C", y);
}
Run Code Online (Sandbox Code Playgroud)
也就是说,上面的代码需要 12 行(不包括空白行)并生成 12 个测试用例。我自己的方法是避免复杂性以利于清晰,并使用一系列 TestCaseData 项专门枚举您想要的案例,例如......
var MySource = new [] {
new TestCaseData("A", "One"),
new TestCaseData("A", "Two"),
etc...
};
Run Code Online (Sandbox Code Playgroud)
这样做的优点是,以后查看代码的任何人都可以轻松理解,包括几个月后的您自己。:-)
| 归档时间: |
|
| 查看次数: |
2169 次 |
| 最近记录: |