我有两个共享相同数据的不同测试:
[TestCaseSource(nameof(ProvideTestCases))]
public void SubtractSegmentsTests(IPolyline polyline, IPolyline toRemove, double tol, IGeometry expected)
{
GeometryTools.SubtractSegments(polyline, toRemove, tol, null);
AssertEqualPoints((IPointCollection) expected, (IPointCollection) polyline);
}
[TestCaseSource(nameof(ProvideTestCases))]
public void SubtractSegmentsTests_With_Esri(IPolyline polyline, IPolyline toRemove, double tol, IGeometry expected)
{
var actual = ((ITopologicalOperator)polyline).Difference(toRemove);
AssertEqualPoints((IPointCollection)expected, (IPointCollection)actual);
}
所以我要实现的是测试两种不同的方法,如果它们都返回完全相同的结果。因此,这两种测试方法都指的是完全相同的测试用例:
public IEnumerable<TestCaseData> ProvideTestCases()
{
yield return new TestCaseData(...).SetName("Test1");
}
当我使用ReSharper在VS中执行测试时,此方法效果很好。测试运行程序能够将属于SubtractSegmentsTests
的测试与属于SubtractSegmentsTests_With_Esri
的测试分开。
现在,我从Jenkins服务器中运行这些测试:
call "C:\Program Files (x86)\NUnit.org\nunit-console\nunit3-console.exe" MySuT.dll --result:testresults/result.xml;format=nunit2
此处,NUnit将所有测试归类在同一节点下-测试类-使得无法区分从Test1
调用的SubtractSegmentsTests
和从Test1
调用的SubtractSegmentsTests_With_Esri
。
是否还有办法在CI服务器上获得该级别的聚合?
答案 0 :(得分:1)
好吧,为了重述一下您可能已经知道的内容,您的两个测试仅具有相同的名称,因为您给它们指定了相同的名称。 :-)
一些跑步者认为名称是唯一的。为了处理不作此假设的NUnit,它们通常添加一些前缀。 NUnit控制台运行程序对所有具有相同名称的测试感到满意,因为它们实际上是由(隐藏)ID标识的。因此,即使有足够多的人问,NUnit控制台也不会麻烦地以不同的方式显示它们。
但是,NUnit还使您能够在设置名称时使自己的名称唯一。在这种情况下,只需在用于设置名称的字符串中包括“ {m}”,然后将在该位置使用测试方法的名称。
有关设置名称的更多信息,请参见https://github.com/nunit/docs/wiki/Template-Based-Test-Naming
中的文档答案 1 :(得分:-1)
一种快速而肮脏的方法是在TestCaseSource
中引用两种不同的方法。
[TestCaseSource(nameof(ProvideTestCases1))]
public void SubtractSegmentsTests(IPolyline polyline, IPolyline toRemove, double tol, IGeometry expected)
{
GeometryTools.SubtractSegments(polyline, toRemove, tol, null);
AssertEqualPoints((IPointCollection) expected, (IPointCollection) polyline);
}
[TestCaseSource(nameof(ProvideTestCases2))]
public void SubtractSegmentsTests_With_Esri(IPolyline polyline, IPolyline toRemove, double tol, IGeometry expected)
{
var actual = ((ITopologicalOperator)polyline).Difference(toRemove);
AssertEqualPoints((IPointCollection)expected, (IPointCollection)actual);
}
现在创建第三个方法,同时使用一个指示调用源的参数来调用ProvideTestCases1
和ProvideTestCases2
:
public IEnumerable<TestCaseData> ProvideTestCases1()
{
return ProvideTestCases("Prefix1.");
}
public IEnumerable<TestCaseData> ProvideTestCases2()
{
return ProvideTestCases("Prefix2.");
}
private IEnumerable<TestCaseData> ProvideTestCases(string prefix)
{
yield return new TestCaseData(...).SetName(prefix + "Test1");
}
现在,测试的名称已连接在一起,例如Prefix1.Test1
。
这不会像VS中那样基于测试方法汇总测试,但至少您可以区分它们。
编辑:您甚至不需要三种方法。您还可以使用一个参数化的参数,然后选择the overload of TestCaseSource
来为源提供参数:
[TestCaseSource(nameof(ProvideTestCases), new object[] { "Prefix1" })]
public void SubtractSegmentsTests(IPolyline polyline, IPolyline toRemove, double tol, IGeometry expected) { ... }
[TestCaseSource(nameof(ProvideTestCases), new object[] { "Prefix2" })]
public void SubtractSegmentsTests(IPolyline polyline, IPolyline toRemove, double tol, IGeometry expected) { ... }