使用c#,Nunit 3。
我有测试用例源,我的许多测试共享。 类似的东西:
public static IEnumerable TestCaseSourceMethod()
{
foreach (String str in someMethodHere)
{
//do some stuff
yield return new TestCaseData(newString).SetCategory(testCategory);
}
}
我在像
这样的测试中使用它[Test, TestCaseSource("TestCaseSourceMethod")]
...
现在我有了新的测试方法,它应该使用来自TestCaseSourceMethod的相同数据,但需要额外的测试参数。
我想出了类似的东西:
foreach (TestCaseData tcd in TestCaseSourceMethod())
{
//how to change tcd to include new test case argument, or create new test case data based on tcd
yield return newtcd;
}
我可以执行tcd.Returns("aaa");
以更改预期的返回值,或tcd.SetCategory("aaaaa");
,但我无法找到更改测试用例参数的方法。
答案 0 :(得分:3)
您可以随时使用自己的方法移动常用逻辑并重复使用 创建做一些事情并返回测试参数的方法
public static string DoSomeStaff(string someValue)
{
// do some stuff
return newString;
}
然后
public static IEnumerable TestCaseSourceMethod()
{
foreach (String str in someMethodHere)
{
var newString = DoSomeStaff(str);
yield return new TestCaseData(newString).SetCategory(testCategory);
}
}
public static IEnumerable SpecialTestCaseSourceMethod()
{
foreach (String str in someMethodHere)
{
var newString = DoSomeStaff(str);
var otherArgument = GetOtherArgument();
yield return new TestCaseData(newString, otherArgument).SetCategory(testCategory);
}
}
另一种方法 - 创建扩展方法,返回带有额外参数的新TestCaseData
。如果并行执行测试,则返回TestCaseData
的新实例非常重要。
public static TestCaseData AddArguments(this TestCaseData source, params object[] args)
{
var arguments = source.Arguments.Concat(args).ToArray();
return new TestCaseData(arguments);
}
并在产生特殊情况的方法中使用它
public static IEnumerable SpecialTestCaseSourceMethod()
{
foreach (var testcase in TestCaseSourceMethod())
{
yield return testcase.AddArguments(otherArgument, extraArgument);
}
}
您可以在AddArguments
方法中复制原始测试用例中的类别
如前所述,由于在并行执行测试时可能存在问题,因此最好有不同的测试用例数据实例
方法名称AddArguments
public static TestCaseData AddArguments(this TestCaseData source, params object[] args)
{
var arguments = source.Arguments.Concat(args).ToArray();
var category = source.Properties.Get(PropertyNames.Category).ToString();
return new TestCaseData(arguments).SetCategory(category);
}