InfoQ

InfoQ

新闻

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

xUnit.net:下一代单元测试框架?

作者 Hartmut Wilms 译者 郭晓刚 发布于 2007年9月27日

领域
语言 & 开发,
过程 & 实践
主题
敏捷技术 ,
敏捷 ,
.NET ,
质量交付 ,
单元测试
标签
测试驱动开发 ,
NUnit ,
测试

NUnit的创造者Jim Newkirk公布了一个新的单元测试框架,叫做xUnit.net。这个以NUnit接班人自许的新框架打算消除NUnit的错误和缺点,并打算在框架中加入一些最佳实践和扩展能力。

Jim Newkirk和Brad Wilson这两位xUnit.net的创造者,从NUnit和其他单元测试框架的经验中总结出来以下改进:

  • 为每个测试方法产生一个对象实例
  • 取消了[SetUp]和[TearDown]
  • 取消了[ExpectedException]
  • 类似于Aspect的功能
  • 减少了自定义属性(Attribute)的数目
  • 采用泛型
  • 匿名委托
  • 可扩展的断言
  • 可扩展的测试方法
  • 可扩展的测试类

xUnit.net减少了属性(Attributes)的数量,属性被用来控制测试和测试的执行过程。其中有个 [Test]属性用来标出测试方法。跟NUnit、MbUnitMSTest不同,测试类并没有任何标志。xUnit.net直接在程序集中查找所有公开类的全部公开测试方法。[SetUp]和[TearDown]已经被抛弃,因为它们一般被认为是坏的实践:

xUnit.net团队觉得每项测试分别执行setup和teardown会产生难以理解与除错的测试代码,并且常常导致每一项测试执行之前都要运行一些不必要的代码。

Jim Newkirk曾经在博客上撰文说明为何不应在NUnit中使用SetUp和TearDown

我对SetUp的不满来自两个方面。第一也是主要的问题是,在我阅读每个测试的时候,我都不得不瞥一眼BeforeTest(),看看在测试中用到的那些值。如果有TearDown方法的话就更糟,这下我要看3个方法。第二个问题是BeforeTest()为所有的测试初始化成员变量,这会让BeforeTest()复杂化而且违反了单一职责原则。

原先[ExpectedException]属性被用来声明希望测试代码抛出的异常,它已被Assert.Throws断言取代。测试集(TestFixture)由ITestFixture接口标出,接口里面有两个方法:BeforeAllTests()和AfterAllTests()。测试超时和暂时跳过某些测试是通过[Test]属性的参数来实现的,并没有单独为此定义属性。MbUnit里面非常受欢迎的[RowTest]和[Row]测试模式也被包括了进来,由[Theory]和[DataViaXxx]实现:

xunit.extensions.dll里附带了对数据驱动测试的支持,被称为Theory。用[Theory](代替[Test])来标记你的测试,再标记上其中一个[DataVia...]属性,用来指出数据的来源。

xUnit.net中的断言的数量也减少了。任何可用基本断言实现其功能的断言都被放弃。另外“is”和“are”(如“AreEqual”或“IsEmpty”)前缀也被去除。xUnit.net网站上提供了NUnit、MbUnit、MSTest与xUnit.net的属性和断言的详细对比

xUnit.net还用上了.NET 2.0和3.5的新语言特性。它支持使用泛型,因此可以在比较语句中保证类型安全,比如Equal和NotEqual断言。取代了[ExpectedException]属性的Assert.Throws()方法支持匿名委托和lambda表达式,因此代码更加紧凑也更具可读性:

Assert.Throws<InvalidOperationException> (delegate { operation(); }); // .NET 2.0
Assert.Throws<InvalidOperationException> (() => operation()); // .NET 3.5

测试类、测试方法和断言都很容易扩展。IComparer<T>接口让用户能够扩展Equal、NotEqual之类的功能。xUnit.net支持创建测试模式,测试模式控制着测试如何调用和执行。最后,用户还可以通过扩展现有的TestRunner或者自己新建TestRunner来控制测试套件和测试类的执行。

xUnit.net的创造者们显然认为他们这个开源框架会成为NUnit的接班人。而Roy Osherove觉得xUnit.net还不够成熟,未来还有些疑问。

查看英文原文:xUnit.net - Next Generation of Unit Testing Frameworks?

译者 郭晓刚 是InfoQ中文站架构社区编辑,创建并终结过数家软件小企业,翻译过多本技术书籍。

深度内容

大规模视频网站的计费与流量管理

本次分享将会就大规模视频网站的计费与流量管理这个话题,从操作层面细细进行讲解和分析,为系统工程师们揭示平日里我们没有关心的另一些内容。同时也希望本次分享能揭示行业中的一些“潜规则”,让互联网行业的流量与带宽管理更为开放与简洁。
本次演讲视频录制于QCon杭州2011

专访Jeffrey Richter:Windows 8是微软的重中之重

Jeffrey Richter以其多本Windows核心技术的经典著作而闻名,同时,他深入掌握微软的.NET等一系列核心技术,2012年1月,Jeffrey Richter在北京接受了InfoQ中文站的专访,谈到Windows 8和WinRT编程,并就异步编程、Windows编程中的可扩展性、性能和安全性方面给出自己的建议。

应用云平台的可用性——从新浪SAE看云平台设计

云计算平台的可用性,相比传统互联网服务而言,更加复杂和困难,也更具有挑战性。本文借助新浪SAE云平台为读者讲述了云平台可用性的定义、如何打造高可用的平台,以及对云计算的用户提出了建议。

JVM定制改进 @ 淘宝

淘宝高度重视Java平台的健康发展,组建了一个团队专注于Java平台的底层部分的性能、功能与稳定性改进;工作主要基于OpenJDK中的HotSpot VM开展,其中一些通用的功能随后也会逐渐反馈给OpenJDK社区。希望能与使用Java平台开发应用的大家交流经验。
本次演讲视频录制于QCon杭州2011

"伤得起"的云计算应用——对云端应用之架构的思考

2011年4月21日至22日是值得云计算从业者纪念的日子。Amazon的IaaS服务出现故障,导致许多商业网站的服务中断,影响非常严重。作为云计算用户,我们需要思考的是,如何保证即便在云服务不可用的情况,我们的应用架构仍然能够屹立不倒?本文正是站在云计算用户的角度试图探讨这一问题。

让交付的速度跟上思考的速度

12人的技术团队,4组刀片服务器,每月20亿的访问量,每日1次准时部署,99.9%的可用性。这可能吗?当然。想知道如何做的吗?百姓网将与您分享他们在DevOps实践过程中的经验和技巧。
本次演讲视频录制于QCon杭州2011

架构之路——穿行在产品和业务之间

篱笆作为一家起源于社区的电子商务公司,反映到技术层面就是同时要面对产品和业务,以及经营战略的变化调整。如何在产品和业务的夹缝之间完成技术架构的抽象与平衡,寻找更有效的价值定位,这当中有些经验教训和个人感悟愿与众人分享。
本次演讲视频录制于QCon杭州2011

特性注入:成功三部曲

本文将对特性注入以及相关方法做一个扫盲性的介绍。我们会解释这个框架的关键要素,并附上实例来证实它们。为了让文章保持相对较短,我们不会深入到某个工具或方法中,而是会给出一些参考资料,以便大家做进一步的研究。