Nunit: 如何以编程方式提取测试用例列表及其类别。

创建于 2020-08-27  ·  3评论  ·  资料来源: nunit/nunit

大家好,

这是一个问题。

我正在尝试获取所有测试用例及其各自类别的列表。

目前我看到三个选项:
1) 反射:遍历所有方法,检查 TestAttribute/TestCaseAttribute/TestFixture...

2) 使用 runner,用 runner.Explore 提取 xml 并解析 xml。

3) 使用 NUnit 已经在做的事情。

我的问题围绕后者:
如何“展平”每个测试用例的类别? (当类别放在抽象类或整个类上时)
理想情况下,我想重用 NUnit 中已经使用的内容来提取其测试列表。
关于从哪里开始阅读的任何建议?

此致,
西蒙

最有用的评论

你好,
我最近花了一些时间试图完成同样的事情,并在确定我当前的解决方案之前尝试了一些事情(这可能对你有用,也可能不适合)。 我需要一个相当通用的解决方案,它适用于不同的 nunit3 测试项目(一些针对 dotnet 框架,一些针对 dotnet 核心)。 最初我尝试了反射和程序集加载,并从ITestBuilder接口调用了BuildFrom() 。 它适用于大多数项目,但不是所有项目,感觉工作量很大,我更愿意让 NUnit 来完成繁重的工作。

接下来我尝试了NUnit 引擎 api (向下滚动一点以查看示例)并且它适用于针对 dotnet 框架的 nunit 项目,但是我遇到了加载针对 dotnet core 的项目的依赖项的问题,当然是 YMMV。

最后,我意识到如果我的解决方案也适用于使用其他单元测试框架的测试解决方案,那就太好了,因此创建了一个自定义 vstest 测试记录器,我将它与 nunit3testadapter 一起使用。 自定义记录器为DiscoveredTestsDiscoveryComplete事件定义事件处理程序。 记录器将发现的测试用例对象列表序列化为一个 json 文件,然后我在其他地方处理该文件。 要使用记录器,我运行 vstest 控制台,提供/ListTests开关以便仅运行测试发现,以及使用自定义记录器的另一个选项: vstest.console.exe <testassemblypath> /ListTests /Logger:<customloggername> -- RunConfiguration.TestAdaptersPaths=<directoryofcustomlogger>;<directoryofnunitadapter> (注意双引号后有一个空格连字符)。 只需添加对Microsoft.TestPlatform.TranslationLayer的引用,因为这使您可以访问 vstest 对象模型和JsonDataSerializer以序列化/反序列化发现的测试用例数据。 我认为您至少需要翻译层包的 v16,因为它与引入测试发现事件的平台版本兼容。 您可以从nuget下载 vstest,或者如果您安装了 Visual Studio 2019,您将已经拥有它。

另一种替代方法是使用 vstest.console.exe 和 NUnit3Adapter,并启用DumpXmlTestDiscovery适配器设置。 然而,转储是诊断信息,所以它并不是真正的公共 API,我想它可能会改变。 我还没有尝试过,但您应该能够使用上面显示的相同 vstest.console.exe 命令行技巧来从命令行启用 dumpxmltestdiscovery 选项: vstest.console.exe <testassemblypath> /ListTests -- NUnit.DumpXmlTestDiscovery=True

该解决方案可能有点过分满足您的需求,但最终它根本没有太多代码。 它只要求消费者使用 vstest 16 或更高版本。 我不记得我的头顶,但我认为这些类别被“扁平化”了。

参考:

[编辑] 更新了示例用法 - 我包含了不正确的运行配置属性

所有3条评论

你好,
我最近花了一些时间试图完成同样的事情,并在确定我当前的解决方案之前尝试了一些事情(这可能对你有用,也可能不适合)。 我需要一个相当通用的解决方案,它适用于不同的 nunit3 测试项目(一些针对 dotnet 框架,一些针对 dotnet 核心)。 最初我尝试了反射和程序集加载,并从ITestBuilder接口调用了BuildFrom() 。 它适用于大多数项目,但不是所有项目,感觉工作量很大,我更愿意让 NUnit 来完成繁重的工作。

接下来我尝试了NUnit 引擎 api (向下滚动一点以查看示例)并且它适用于针对 dotnet 框架的 nunit 项目,但是我遇到了加载针对 dotnet core 的项目的依赖项的问题,当然是 YMMV。

最后,我意识到如果我的解决方案也适用于使用其他单元测试框架的测试解决方案,那就太好了,因此创建了一个自定义 vstest 测试记录器,我将它与 nunit3testadapter 一起使用。 自定义记录器为DiscoveredTestsDiscoveryComplete事件定义事件处理程序。 记录器将发现的测试用例对象列表序列化为一个 json 文件,然后我在其他地方处理该文件。 要使用记录器,我运行 vstest 控制台,提供/ListTests开关以便仅运行测试发现,以及使用自定义记录器的另一个选项: vstest.console.exe <testassemblypath> /ListTests /Logger:<customloggername> -- RunConfiguration.TestAdaptersPaths=<directoryofcustomlogger>;<directoryofnunitadapter> (注意双引号后有一个空格连字符)。 只需添加对Microsoft.TestPlatform.TranslationLayer的引用,因为这使您可以访问 vstest 对象模型和JsonDataSerializer以序列化/反序列化发现的测试用例数据。 我认为您至少需要翻译层包的 v16,因为它与引入测试发现事件的平台版本兼容。 您可以从nuget下载 vstest,或者如果您安装了 Visual Studio 2019,您将已经拥有它。

另一种替代方法是使用 vstest.console.exe 和 NUnit3Adapter,并启用DumpXmlTestDiscovery适配器设置。 然而,转储是诊断信息,所以它并不是真正的公共 API,我想它可能会改变。 我还没有尝试过,但您应该能够使用上面显示的相同 vstest.console.exe 命令行技巧来从命令行启用 dumpxmltestdiscovery 选项: vstest.console.exe <testassemblypath> /ListTests -- NUnit.DumpXmlTestDiscovery=True

该解决方案可能有点过分满足您的需求,但最终它根本没有太多代码。 它只要求消费者使用 vstest 16 或更高版本。 我不记得我的头顶,但我认为这些类别被“扁平化”了。

参考:

[编辑] 更新了示例用法 - 我包含了不正确的运行配置属性

DumpXmlTestDiscovery 中用于测试输出本身 (!) 的 Xml 直接来自 NUnit 引擎,并且本身不太可能改变。 这与适配器使用的 Xml 信息相同,因此任何更改都需要一个新的适配器,并且会破坏向后兼容性,这是我们非常小心的事情。 但是,文件本身被扩展,因此您的代码应该考虑到这一点。 然而,获取测试发现输出节点应该是非常安全的。

你好@shack05@OsirisTerje

非常感谢您的见解!

回顾所有解决方案:

1) 反思:
装配 x = Assembly.GetExecutingAssembly();
var classes = x.GetExportedTypes();

        foreach (System.Type type in classes)
        {
            MethodInfo[] methods = type.GetMethods();
            foreach (MethodInfo methodInfo in methods)
            {
                if ((methodInfo.GetCustomAttributes(typeof(TestAttribute), true).Length == 1)

...

2)NUnit引擎API:

ITestEngine 引擎 = TestEngineActivator.CreateInstance();

        // Create a simple test package - one assembly, no special settings
        TestPackage package = new NUnit.Engine.TestPackage(Assembly.GetExecutingAssembly().Location);

        // Get a runner for the test package
        ITestRunner runner = engine.GetRunner(package);

        var tree = runner.Explore(NUnit.Engine.TestFilter.Empty);//new NUnit.Engine.TestFilter("*"));

3) 控制台(NUnit 或 vstest):
nunit3-console.exe Tests.dll --explore:"nunit3-test.xml" --where="{testFilter}"

我可能最终会混合 1 和 3。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

xplicit picture xplicit  ·  5评论

dgm90 picture dgm90  ·  5评论

ChrisMaddock picture ChrisMaddock  ·  3评论

DustinKingen picture DustinKingen  ·  4评论

fluffynuts picture fluffynuts  ·  3评论