NUnit 3 引入扩展能力与并行执行特性

阅读数:1178 2015 年 12 月 18 日

话题:.NETC#语言 & 开发架构

.NET 测试框架NUnit 最近推出了版本 3,其中引入了并行执行与扩展能力。Charlie Poole 作为 NUnit 的维护者已超过 10 年了,InfoQ 与 Charlie 进行了一次访谈,以了解这次发布的更多内容。

InfoQ:在经过了两年时间的开发,推出了 5 个 alpha 版本,5 个 beta 版本和 2 个发布候选版本之后,最终版本终于在上个月正式发布了。作为一个主要的版本更新,新版本的主要目标有哪些?

Charlie Poole:在回答这一问题之前,我首先必须说的是,这个版本的开发时间比预想中长了很多,尤其是基于已发布的 alpha 和 beta 版本来看。我在 2007 年于马德里举办的 Mono Summit 会议上第一次向公众透露了关于 NUnit 3.0 的想法。Mono 的开发者们确实是非常优秀的听众,他们为我提出了许多优秀的点子。平心而论,在当时看来,Mono 的开发者们比起整个.NET 社区更能够拓展他们的思维。

NUnit 如今已经经历了十五个年头了。基本上,这次发布的目标是为了让 NUnit 为今后 10 年的发展做好准备。在 2002 年时推出的 NUnit 2.0 经过了全部的重写,而新版本则是我们第二次经过代码的全部重写。所谓的主要版本,就是要这样剧烈的改变。

为了让 NUnit 能够继续发展,在我看来,它必须变得更为模块化。我们希望它能够变成一个真正的测试平台,而不仅仅是一个框架而已。但同时,如果用户依然只想把它当做一个框架使用,他们还是能够这么做。这也意味着,我们必须添加一些特性,以支持更多类型的测试,而不仅仅是单元测试而已。3.0 版本中包含了非常出色的特性集,不过我认为以上这些只是这一版本中全部变更的冰山一角而已。

如今,3.0 的生产版本已正式亮相了,我们将以更快的速度发布特性,正如我们过去十年间对 NUnit V2 所做的更新一样。实际上,我们刚刚才发布了 NUnit 3.0.1,这是一个专门修复 bug 的版本。

InfoQ:对于这次发布的版本,有哪些特性是使用者最希望看到的?

CP:其中之一是并行测试执行,它通过属性进行控制。我们支持两种级别的并行性:在独立的进程中并行执行多个程序集,或是在同一个进程中执行多个线程。这两种级别的并行各有适合的应用场景。

另一个主要特性是 NUnit 现在提供了一个 TestEngine,并提供一套已发布的 API,任何人都可以在自己的程序中调用它以运行测试。这一特性在过去是不存在的,如果你要在 NUnit 中以编程的方式运行测试,必须要使用内部类。而这些内部类在每次发布中都可能会产生变化,这对于第三方测试执行器的开发者来说无疑是加大了开发的难度。

第三个特性是关于扩展能力。NUnit V2 中引入了一种“NUnit 插件”机制,但编写这种插件非常复杂。NUnit 3.0 去除了这一机制,并提供另两种级别的扩展能力:

  1. 第一种方式是创建一个新的框架级别的属性,并实现某些已定义的接口,以获得某种期望的行为。顺便说一句,这种方式受到了 MbUnit 的启发,好点子的共享正是开源项目进行创新的方式之一。
  2. 第二种方式是为引擎创建一个扩展,这种方式能够更进一步扩展 NUnit 的能力。举例来说,某个引擎驱动扩展允许在 NUnit 3.0 中执行 NUnit V2 的测试。如果你愿意,你还可以为 xUnit、msTest 甚至是 junit 编程扩展。在今后的发布中,我们还将利用这一功能实现远程或在设备中运行测试。

InfoQ:在 NUnit 3 中支持哪些新的平台?

CP:我们为这一框架打造了一个可移植的库,可以在.NET 4.5、.NET Core(包括 Win 10 以上版本的统一 Windows 应用,或 DNX Core 5 以上版本)、Windows 8、Windows Phone 8(基于 Silverlight)、统一应用(包括 Windows Phone 8.1 以上版本,或 Windows 8.1 以上版本),以及 Xamarin(包括 MonoTouch、MonoAndroid 以及 Xamarin iOS 统一应用)。

当然,我们也将继续支持各种遗留平台,包括.NET 2.0、Silverlight 和.NET Compact Framework 3.5。不过,我们最终还是取消了对.NET 1.1 和.NET CF 2.0 的支持。

InfoQ:哪一项成就是最令你感到骄傲的?

CP:最令我感到骄傲的就是能够让 NUnit 得以继续发展!在 2005 年前后,就有人开始预测 NUnit 将会消亡。最主要的因素就是微软推出了一个“官方”的测试框架,它宣称能够统一当时所有的开源单元测试项目。结果这当然没有成真,而对于 NUnit 的死亡预测反倒让我们产生了更大的创新动力,尤其是设计出了 NUnit 测试开发平台,即 NUnit 3.0。

第二大成就则是这一项目找到了大量的参与者、贡献者和社区成员,并从他们那里获得了大量的支持。作为一名技术人员,这种来自于社区的贡献是我始料未及的,这令我对于促成这一项目的发展感到骄傲。如果 NUnit 能够继续发展至 2020 年之后,届时我就将要 70 多岁了,恐怕已无力继续它的开发,因此我很高兴有其他贡献者能够让它保持继续发展。我要特别提到 Rob Prouse,他如今已是这个项目在 GitHub 上的共同所有人,并且已经成功地管理了多次发布。

InfoQ:还有哪些想要补充的吗?

CP:在 2002 年时,我出于工作的目的需要寻找一个开源的测试项目。最终,我基本认定了 NUnit,因为我与开发团队建立了良好的关系。最终我也加入了这一项目,并且如你所见,我是那批开发者中最后一个还在继续维护它的人。幸运的是,新人在陆续地加入这一项目,这样在我离开时也能够放心地把项目交给他们了。

NUnit 的源代码可以在GitHub上找到,其中也包含了NUnit 3 的文档,包括一篇升级指南

查看英文原文:NUnit 3 Brings Extensibility and Parallel Execution: Interview with Charlie Poole