向后兼容C#Reflection和NUnit版本

时间:2016-06-23 14:55:24

标签: c# reflection nunit

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

问题:有没有办法在使用旧版NUnit创建的测试中检测这些属性?例如,我有一些使用NUnit 2.6.4版创建的测试,但找不到相应的属性,因为系统正在从NUnit 3.2.1中查找属性。

以下是一段代码,用于检测所提供的.dll中标有TestFixtureAttribute的测试类:

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

同样,此代码段在提供的.dll上找不到任何测试类,因为较旧的TestFixtureAttribute与NUnit 3.2.1中的.complete()不同。

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

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

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

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

这就是在“旧时代”中的表现 - 我的意思是在NUnit V2和MsTest中。创建NUnit 3的主要目标之一是提供一个API,以消除第三方运行者复制已经在NUnit中的逻辑的需要。

即使不等待未来打破您的实施,您也可以立即看到变更对其产生的影响。如果你处理Test和TestCase属性,那么......  * TestCaseSource  * TestFixture  * TestFixtureSource  *价值观  *随机  * 范围  *组合  *顺序  *成对 (那是我的想法......我可能错过了一些东西)

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

如果您决定使用API​​,请按照Rob的建议前往我们的论坛讨论出现的详细信息。