NUnit TestCaseSource 如何从列表中设置参数

NUnit TestCaseSource how to set parameters from list

我的一个常用 Class methods 生成 listparameters 我想一致地设置它们中的每一个 作为我的 NUnit 测试的参数。

我阅读了一些关于 TestCaseSource attribute 的文档,但不知道如何实现它。

例如我的方法 return 列表

"1","2","3","4"

...我如何将它们中的每一个放入我的测试中。谢谢!

这是我的 method 那 return 一个 list:

        public static List<string> TestCombinationsProvider()
    {
        List<string> resultList = new List<string>();
        List<string> parametersList = new List<string>();

        foreach (var item in ReturnDynamicPararmetersEntityProperties())
        {
            parametersList.Add(item.Name);
        }

        for (int i = 0; i < parametersList.Count; i++)
        {
            for (int j = i + 1; j < parametersList.Count; j++)
            {
                resultList.Add(parametersList[i] + " AND " + parametersList[j]);
            }
        }

        return resultList;
    }

和空 Nunit 测试:

    [Test]
    [TestCaseSource("")]
    public void Test1()
    {

    }

我想运行用列表中的每一行进行测试

文档非常清楚。您需要 return 一个测试用例列表,而不是 returning List<string>,例如直接使用 IEnumerable<TestCaseData>:

public static IEnumerable<TestCaseData> TestCombinationsProvider()
{
    List<string> resultList = new List<string>();
    List<string> parametersList = new List<string>();

    foreach (var item in ReturnDynamicPararmetersEntityProperties())
    {
        parametersList.Add(item.Name);
    }

    for (int i = 0; i < parametersList.Count; i++)
    {
        for (int j = i + 1; j < parametersList.Count; j++)
        {
            yield return new TestCaseData(parametersList[i] + " AND " + parametersList[j]);
        }
    }
}

该方法有多个不同的签名,例如还 return 收集了 object[]。但我不会推荐它们,因为你失去了很多你可以用 TestCaseData 做的事情,例如设置每个测试 Name 或其 Description.

然后装饰你的实际测试方法:

[Test]
[TestCaseSource(nameof(TestCombinationsProvider))]
public void Test1(string p)
{

}

编辑:当您的 TestCombinationsProvider 方法在另一个 class 中时,请改用此方法:

[TestCaseSource(typeof(TheClass), nameof(TheClass.TestCombinationsProvider))]

TestCaseSourceAttribute 构造函数有两个重载,如果你需要从另一个设置数据class你应该使用这个构造函数。

TestCaseSourceAttribute(Type sourceType, string sourceName);

它看起来像这样:

public class TestData {

    public static IEnumerable<string> TestCombinationsProvider()
    {
        var parametersList = ReturnDynamicPararmetersEntityProperties().Select(x => x.Name).ToList();

        for (int i = 0; i < parametersList.Count; i++)
        {
            for (int j = i + 1; j < parametersList.Count; j++)
            {
                yield return  parametersList[i] + " AND " + parametersList[j];
            }
        }
    }
}

public class Tests
{
    [TestCaseSource(typeof(TestData), nameof(TestData.TestCombinationsProvider))]
    public void Test1(string test)
    {
        Assert.Pass();
    }
}