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
有三种方法,AddTest
,GetFilter
和SelectWhere
。但是这些都需要它们,我不知道要把它们放进去。
似乎我需要SelectWhere
,它需要whereClause
,但在工具提示,智能感知或使用什么语法的任何地方都没有帮助(SQL?XPath?)。
有人有什么想法吗?有些项目在那里有一些我可以使用的预定义过滤器,或示例代码?
答案 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>
上的结果会告诉我们我们已经运行,通过,失败等等的测试次数,以及与此有关的各种其他统计信息。