写点什么

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

  • 2007-09-27
  • 本文字数:1397 字

    阅读完需:约 5 分钟

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

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

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

xUnit.net 减少了属性(Attributes)的数量,属性被用来控制测试和测试的执行过程。其中有个 [Test] 属性用来标出测试方法。跟 NUnit、 MbUnit MSTest 不同,测试类并没有任何标志。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 (delegate { operation(); }); // .NET 2.0
Assert.Throws (() => operation()); // .NET 3.5

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

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

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

2007-09-27 01:095938
用户头像

发布了 225 篇内容, 共 71.8 次阅读, 收获喜欢 52 次。

关注

评论

发布
暂无评论
发现更多内容

面试官:说说你对【注解】的理解

田维常

沉默的性能杀手 - false sharing

helbing

Go 语言

周练习 11

何毅曦

架构师训练营第二周”框架设计“作业

随秋

极客大学架构师训练营

性能优化总结(一)

Mars

性能优化

Spring 源码学习 07:ClassPathBeanDefinitionScanner

程序员小航

Java spring 源码 源码阅读

性能压测练习

Mars

架构师训练营第二周”框架设计“学习笔记

随秋

极客大学架构师训练营

第十一周作业

极客大学架构师训练营

ShardingSphere RAW JDBC 分布式事务 Atomikos XA 代码示例

Java MySQL 数据库 分布式事务 ShardingSphere

架构师训练营第十一周作业

Shunyi

极客大学架构师训练营

架构师训练营第十一周课后作业

Gosling

极客大学架构师训练营

学习总结--week11

张荣召

架构师训练营 1 期第 11 周:安全稳定 - 作业

piercebn

极客大学架构师训练营

架构师 3 期 3 班 -week3- 作业

zbest

作业 week3

架构师 3 期 3 班 -week3- 总结

zbest

总结 week3

第七周课后练习

lithium

架构师训练营 week7 学习总结

花果山

极客大学架构师训练营

作业-第7周 性能优化一

arcyao

架构师训练营第十一周学习总结

Gosling

极客大学架构师训练营

安全稳定-安全架构高可用

garlic

极客大学架构师训练营

基于 localStorage 实现一个具有过期时间的 DAO 库

徐小夕

Java 算法 大前端

安全稳定第十一周作业「架构师训练营第 1 期」

天天向善

第十一周 安全稳定 总结

三板斧

极客大学架构师训练营

架构师训练营第 1 期 - 第 11 周课后练习

Anyou Liu

极客大学架构师训练营

架构师训练营第二周总结

J

极客大学架构师训练营

架构师训练营第 11 周作业

netspecial

极客大学架构师训练营

架构入门学习感悟之七

笑春风

架构师第十一周总结

_

极客大学架构师训练营 第十一周总结

架构师训练营 1 期 - 第十一周 - 安全稳定

三板斧

极客大学架构师训练营

架构师训练营 week7 课后作业

花果山

极客大学架构师训练营

xUnit.net:下一代单元测试框架?_研发效能_Hartmut Wilms_InfoQ精选文章