正如標題所說,我想使用 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)
{
// ...
}
當然這行不通,但我想做的是:
- 對 Source1 運行測驗用例 A
- 針對 Source2 運行測驗用例 B
- 對 Source1 和 Source2 運行測驗用例 C
有可能實作這樣的目標嗎?
uj5u.com熱心網友回復:
答案很長,因為我想澄清所涉及的權衡……
我將回答您首先提出的問題:是否可以在 NUnit 中使用 TestCase 和 TestCaseSource/ValueSource 的組合?
是的。NUnit 允許您在方法上組合測驗用例資料的任何來源。
- TestCase 給你一個測驗用例
- TestCase 源為您提供多個測驗用例
- ValueSource 為您提供一個引數的資料(即測驗用例的一部分)
在您的示例中,您為該MyTest方法提供了總共 16 個測驗用例。當然,所有這些都是無效的,因為 MyTest 接受兩個引數,而您的每個測驗用例只提供一個值。
從示例中可以看出,您希望放置在相同括號內的屬性以某種方式分組。這不是 C# 解釋它們的方式。你寫的和寫這個完全一樣:
[TestCase("A")]
[TestCase("B")]
[TestCase("C")]
[TestCaseSource(nameof(Source1))]
[TestCaseSource(nameof(Source2))]
[TestCaseSource(nameof(Source1))]
[TestCaseSource(nameof(Source2))]
這不是 NUnit 問題。這就是 C# 屬性的作業方式。
因此,雖然可以在同一方法上組合屬性,但不可能以您想要的方式將來自這些屬性的值組合到測驗用例中。
NUnit 確實有一種方法可以使用ValuesorValueSource屬性組合組合值,該屬性適用于單個引數而不是方法。
使用ValuesAttribute,你可以像這樣重寫你的例子......
public void MyTest(
[Values("A", "B", "C")] string x,
[Values("One", "Two", "Three")] string y )
{
// ...
}
這幾乎對你有用,但不完全。九宗創建的每一個可能的組合("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);
}
也就是說,上面需要 12 行,不包括空行,并生成 12 個測驗用例。我自己的方法是避免復雜性以求清晰,并使用一組 TestCaseData 專案專門列舉您想要的案例,例如......
var MySource = new [] {
new TestCaseData("A", "One"),
new TestCaseData("A", "Two"),
etc...
};
這樣做的優點是,以后查看代碼的任何人都易于理解,包括幾個月后的您自己。:-)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/400208.html
