【问题标题】:Backwards compatibility with C# Reflection and NUnit Versions向后兼容 C# Reflection 和 NUnit 版本
【发布时间】:2016-06-23 14:55:23
【问题描述】:

我在带有 Visual Studio 2015 的 .NET 4.5 框架上使用 C#。我正在尝试将 NUnit 支持插入到围绕 MSUnit 测试构建的自动化测试系统中。作为系统的一部分,我需要使用反射在提供的.dll 文件中找到标有TestAttributeTestCaseAttribute 的方法。目前这个系统已经为 NUnit 3.2.1 版本安装了 NuGet 包。

问题:有没有办法在使用旧版本的 NUnit 创建的测试中检测这些属性?例如,我有一些使用 NUnit 2.6.4 版本创建的测试,但是由于系统正在从 NUnit 3.2.1 中寻找属性,所以找不到它们对应的属性。

这是一段用于检测提供的.dll中标记为TestFixtureAttribute的测试类的sn-p代码:

var testClasses = testAssembly
            .SelectMany(a => a.GetTypes())
            .Where(a => a.IsDefined(typeof(TestFixtureAttribute), false));

同样,这个 sn-p 在提供的 .dll 上找不到任何测试类,因为旧的 TestFixtureAttribute 与 NUnit 3.2.1 中的不一样

我已经在 nunit3-console.exe 上成功运行了较旧的 NUnit 测试,因此目前发现测试是最大的障碍。

提前感谢您的帮助!

【问题讨论】:

  • 为什么不升级“旧”单元测试中的引用。我认为它们的版本之间没有太大变化。如果升级破坏了您的单元测试,我会感到惊讶。最好只选择一个版本,然后在任何地方使用它
  • 我只是一个卑微的实习生,所以我绝对可以和我的导师和经理讨论这个问题。我相信确保使用该系统的人知道他们必须使用哪个版本的 NUnit 是很容易的。
  • 这个问题可能更适合 NUnit 讨论邮件列表。我可以帮助您找到属性,但我想了解更多关于您在找到测试后如何处理的信息。这将需要来回,这不太适合 SO。您的第一篇帖子将被审核,但我们会尽快批准。 groups.google.com/forum/#!forum/nunit-discuss
  • 如果你只是想解决你的问题,解决方案是查看属性的字符串名称,而不是类型。

标签: c# reflection nunit


【解决方案1】:

这可能不会得到很多选票,但我的回答是“不要那样做!”无论如何,这不适合评论。 :-)

NUnit 3.x 有一个用于运行测试的 API。通过查找属性自己发现它们意味着每次有人(包括您自己的用户)添加一个标识测试的新属性时,您都必须更新您的应用程序。这也意味着您必须弄清楚运行 NUnit 测试的语义,并复制 NUnit 的每一个转折点。

这就是“过去”的方式——我的意思是在 NUnit V2 和 MsTest 中。创建 NUnit 3 的主要目标之一是提供一个 API,让第三方运行程序无需复制 NUnit 中已有的逻辑。

即使不等待未来破坏您的实施,您现在也可以看到更改对其的影响。如果您处理 Test 和 TestCase 属性,那么... * 测试用例来源 * 测试夹具 * 测试夹具源 * 价值观 * 随机的 * 范围 * 组合 * 顺序 * 成对 (这超出了我的想象......我可能错过了一些东西)

OTOH,您可以限制您使用几个调用来运行测试的接口。如果您正在编写需要集成到 IDE 中的东西,它会变得有点复杂,但无论您怎么做都会如此。

如果您决定使用 API,请听从 Rob 的建议,并在出现详细信息时来我们的论坛讨论。

【讨论】:

  • 我一定会研究您提到的 API。但是,该系统面临某些限制,因为它会自动(或手动)远程运行和存储测试以监控其他生产级系统的运行状况。我会四处讨论,看看对我们来说最好的解决方案是什么。感谢普尔先生的建议!
  • 如你所想,请记住,NUnit 的开发人员认为 NUnit 3 是与 NUnti 2 不同的测试框架。至少有一个第三方供应商给自己带来了很多麻烦试图将它们视为同一事物。几年前,我为 mstest、nunit 和 csunit 测试编写了一个通用的运行程序,我可以这样做,因为当时它们很简单,而且所有三个基本上都以相同的方式工作。我今天不敢做。
  • 感谢您的提醒。幸运的是,有问题的系统只需要从 dll 中发现测试来存储它们。然后,它充当每个测试套件的本机运行程序的包装器,具体取决于 dll 使用哪个。然后从到达运行器生成的测试结果文件中删除结果。我认为你有很多问题是关于从头开始实现运行器;幸运的是,这不是发生的事情
猜你喜欢
  • 2021-07-22
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 2021-06-03
  • 1970-01-01
相关资源
最近更新 更多