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

jopen 8年前
 

.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