如何更改TestCaseData Nunit的测试用例参数

时间:2017-10-30 10:06:11

标签: c# nunit

使用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");,但我无法找到更改测试用例参数的方法。

1 个答案:

答案 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);
}