在不同的节点下有多个具有相同名称的测试

时间:2019-06-26 07:25:47

标签: c# jenkins nunit

我有两个共享相同数据的不同测试:

[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服务器上获得该级别的聚合?

2 个答案:

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

现在创建第三个方法,同时使用一个指示调用源的参数来调用ProvideTestCases1ProvideTestCases2

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) { ... }