我打算将所有测试用例存储在一个excel文件中,其中的列指示测试方法名称,参数和预期结果;但是,我发现TestCaseSource只是将所有测试用例分配给每个测试方法。我想知道是否有任何方法可以根据我放入电子表格的方法名称为NUnit选择测试用例的方法?NUnit:TestCaseSource将测试分配给特定的测试方法
谢谢。
我打算将所有测试用例存储在一个excel文件中,其中的列指示测试方法名称,参数和预期结果;但是,我发现TestCaseSource只是将所有测试用例分配给每个测试方法。我想知道是否有任何方法可以根据我放入电子表格的方法名称为NUnit选择测试用例的方法?NUnit:TestCaseSource将测试分配给特定的测试方法
谢谢。
有一种方法可以做到这一点。例如,正如你所提到的,你可以创建一个自定义属性。
这个想法是通过测试的名称TestCaseSource
。
您可以通过创建TestCaseSource
作为单独的类来实现。
首先,TestCaseSource
类:
public class SpreadSheetTestCaseSource
{
[ThreadStatic]
public static string TestName = String.Empty;
public static IEnumerable TestCases
{
get
{
SpreadSheetTestCaseProvider.GetTestCases()
.Where(testCase => testCase.TestName == TestName);
}
}
}
再到属性:
public class MyTestCaseSourceAttribute : TestCaseSourceAttribute
{
public MyTestCaseSourceAttribute(Type sourceType, string sourceName,
[CallerMemberName] string name = null)
: base(sourceType, sourceName)
{
SpreadSheetTestCaseSource.TestName = name;
}
//Another two members impl.
}
和测试:
[TestFixture]
public class TestClass
{
[MyTestCaseSource(typeof(SpreadSheetTestCaseSource), "TestCases")]
public void TestMethod()
{
//Test logic
}
}
SpeadSheetTestCaseSource.TestName
是线程静态的。所以你可以并行运行测试。
比我的想法更清洁的实现。 +1 –
非常感谢您的回复。只是一个问题,我如何实现SpreadSheetTestCaseSource类。 SpreadSheetTestCaseProvider是从TestCaseProvider继承的吗? –
@LiuGarry,在这种情况下'SpreadSheetTestCaseSource'只是一个虚构的类。您可以通过多种方式实现它。我只是假设它将Excel文档解析为“IEnumerable
这不是NUnit直接支持的功能。各种TestCaseSource类型属性无法根据输入提供测试方法。
一个选项是为每个测试方法创建一个TestCaseSource。其中每一个都是一个简单的包装器,它将方法名称传递给一个内部方法。该内部方法将在Excel文件中读取,并只返回给定方法名称的行。
PseudoCode;
[TestCaseSource(nameof(TestMethodOneSource))]
public void TestMethodOne(int x, int y, int expected)
{
Assert.That(x + y, Is.EqualTo(expected));
}
public static IEnumerable<object[]> TestMethodOneSource() =>
ReadExcel(nameof(TestMethodOne));
private static IEnumerable<object[]> ReadExcel(string method)
{
// Open and start reading Excel
for(var row in rows)
{
if(row[0] == method)
{
// Return objects minus the method
yield return new [] {row[1], ..., row[n]};
}
}
}
非常感谢。我曾考虑过这个问题。问题是我会有很多测试方法,所以我需要为每个测试方法创建包装。我想知道如果有办法,也许可以创建自定义属性来实现这一点。 –
您是否希望使用一个'TestCaseSource'作为不同的测试方法,以便每个测试只会根据其名称运行特殊的测试用例组? – Kote
是的!更确切地说,我会把TestCaseSource属性放在所有的测试方法上。 –