我有一系列测试,我想在其中使用相同的测试用例数据来进行一系列不同的测试。
例如:
[Test, TestCaseSource("TestData")]
public void Test1(Foo foo)
{
// test 1
}
[Test, TestCaseSource("TestData")]
public void Test2(Foo foo)
{
// test 2
}
private static IEnumerable TestData()
{
TestCaseData data;
data = new TestCaseData(new Foo("aaa"));
yield return data;
data = new TestCaseData(new Foo("bbb"));
yield return data;
}
这会导致一系列测试报告如下:
Namespace.That.Is.Very.Long.TestClass.Test1(Namespace.That.Is.Very.Long.Foo)
Namespace.That.Is.Very.Long.TestClass.Test1(Namespace.That.Is.Very.Long.Foo)
Namespace.That.Is.Very.Long.TestClass.Test2(Namespace.That.Is.Very.Long.Foo)
Namespace.That.Is.Very.Long.TestClass.Test2(Namespace.That.Is.Very.Long.Foo)
...当您不知道“foo”失败的原因时,这并没有多大意义。
如果as suggested in this SO question我这样设置名称:
data = new TestCaseData(new Foo("aaa"));
data.SetName("foo=aaa");
yield return data;
...然后我所有的测试结果如下所示:
foo=aaa
foo=bbb
foo=aaa
foo=bbb
所以我想弄清楚如何获取当前的测试方法名称。那会出现,as described in this other SO question通过 TestContext 完成。
但是,尽管存在 TestContext.Current.Test,所有属性(如 Name)在尝试访问它们时都会抛出 NullReferenceException。
是否有其他方法可以实现在测试名称中提供更多有用信息的目标?
最佳答案
TestName
属性在 NUnit 3 中支持字符串格式化。
这是一个示例用法:
private static IEnumerable TestData()
{
TestCaseData data;
data = new TestCaseData(new Foo("aaa"))
.SetName("case 1 {m}");
yield return data;
data = new TestCaseData(new Foo("bbb"));
yield return data;
}
将生成以下输出:
如您所见,第一种情况的测试名称包含自定义前缀 + 方法名称。
使用this link有关 NUnit 的字符串格式化功能的更多信息。
2 个类可用于此操作 NUnitTestCaseBuilder (line 83)和 TestNameGenerator
方法 .GetDisplayName()
。
关于c# - 在 TestCaseSource 中访问 NUnit 测试名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26374265/