如何使用ITestFilterService和/或ITestFilterBuilder

时间:2018-04-16 01:44:32

标签: c# f# nunit nunit-3.0

TLDR:如何基于部分testname,regex或(部分)类别名称以编程方式过滤NUnit 3.x测试。

我从中转换项目有自己的过滤机制,用于从NUnit 2.6运行测试 - > NUnit 3.8。

我试图支持的过滤器是名称,正则表达式匹配,名称匹配和类别匹配的部分字符串匹配。由于这个项目有大约30k +的测试,其中一些是耗时的,一个定制的跑步者已被证明有助于让我们保持理智。

然而,我似乎无法看到森林中的树木。我试图阅读Test Engine API上的文档,它基本上链接到接口的源代码。在我看来,我需要和ITestFilterService以及ITestFilterBuilder,但后来我似乎陷入困境。

NUnit 2.6带有一堆预定义的过滤器,我只需要扩展。现在,我同情将测试运行器API与NUnit框架分离的新方法,并且我在文档中潜水没有问题,但似乎它们很稀疏(或者我的搜索技能缺乏)。 / p>

我得到了以下(F#代码,从C#代码翻译而来),但后来我卡住了:

let path = Assembly.GetExecutingAssembly().Location
let package = new TestPackage(path)
package.AddSetting("WorkDirectory", Environment.CurrentDirectory)
let engine = TestEngineActivator.CreateInstance()
let filterService = engine.Services.GetService<ITestFilterService>()
let filterBuilder = filterService.GetTestFilterBuilder()

我甚至不知道它是否有效,因为在重构整个项目之前我无法运行它...... ITestFilterBuilder有三种方法,AddTestGetFilterSelectWhere。但是这些都需要它们,我不知道要把它们放进去。

似乎我需要SelectWhere,它需要whereClause,但在工具提示,智能感知或使用什么语法的任何地方都没有帮助(SQL?XPath?)。

有人有什么想法吗?有些项目在那里有一些我可以使用的预定义过滤器,或示例代码?

1 个答案:

答案 0 :(得分:2)

如果您像这样传递空的内容,您将了解要添加到过滤器中的内容:

var filterService = nunitEngine.Services.GetService<ITestFilterService>();
ITestFilterBuilder builder = filterService.GetTestFilterBuilder();
....
var testResult = runner.Run(testListener, filter);

运行此命令时,假设一切正常,您将获得带有一些嵌套<test-suite>节点的XMLNode响应,在该节点下将有一些<test-case>节点:

<test-suite 
    type="TestFixture" 
    id="0-1000" 
    name="Tests" 
    fullname="SampleUnderTest.Tests.NUnit.Tests" 
    classname="SampleUnderTest.Tests.NUnit.Tests" 
    runstate="Runnable" 
    testcasecount="1" 
    result="Passed" 
    start-time="2020-08-26 15:51:23Z" 
    end-time="2020-08-26 15:51:23Z" 
    duration="0.031570" 
    total="1" 
    passed="1" 
    failed="0" 
    warnings="0" 
    inconclusive="0" 
    skipped="0" 
    asserts="1">
  <test-case 
       id="0-1001" 
       name="AddWithGivenInputsReturnsExpectedResults"
       fullname="SampleUnderTest.Tests.NUnit.Tests.AddWithGivenInputsReturnsExpectedResults"            
       methodname="AddWithGivenInputsReturnsExpectedResults" 
       classname="SampleUnderTest.Tests.NUnit.Tests" 
       runstate="Runnable" 
       seed="81337978" 
       result="Passed" 
       start-time="2020-08-26 15:51:23Z" 
       end-time="2020-08-26 15:51:23Z" duration="0.028935" asserts="1" />
</test-suite>

现在,回到我们的ITestFilterBuilder

ITestFilterBuilder builder = filterService.GetTestFilterBuilder();

其中一种公共方法是ITestFilterBuilder.AddTest(string fullName)

参数fullName与返回的XML的fullName属性匹配。如果我们从fullName节点之一中传入<test-case>,我们就可以运行该测试:

builder.AddTest("SampleUnderTest.Tests.NUnit.Tests.AddWithGivenInputsReturnsExpectedResults");

再次运行时,结果在根<test-suite>上的结果会告诉我们我们已经运行,通过,失败等等的测试次数,以及与此有关的各种其他统计信息。