写点什么

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:095677
用户头像

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

关注

评论

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

开源最佳实践

LinuxSuRen

开源 最佳实践

SENSORO基于TDengine助力基层政府打造数字化应用标杆

TDengine

数据库 tdengine 开源 物联网

Worktile 权限设计

阿杰

权限控制 rbac 权限设计

做好云管理一定要云管平台吗?云管理平台应具备什么功能?

行云管家

云服务 云管平台 云资源 云管理

PingCode Wiki 权限设计之ACL

阿杰

权限系统 权限控制 acl 权限设计

聚焦业务价值:分众传媒在 Serverless 上的探索和实践

Serverless Devs

阿里云 Serverless 运维管理 分众传媒 2月月更

Springboot中,如何读取配置文件中的属性

华为云开发者联盟

数据库 springboot 映射 配置文件

大数据培训:Hadoop HDFS 实现原理

@零度

hadoop 大数据开发

上市商业银行推进智慧银行建设,全方位赋能零售业务数字化转型

易观分析

商业银行 智慧银行

动态加载不适合数组类?那如何动态加载一个数组类?

华为云开发者联盟

Java 数组 动态加载 数组类

一站式交付体验:云效+Kubernetes

阿里云云效

阿里云 Kubernetes 云原生 持续交付 一站式平台

百度智能云开物再收“一个奖状”

百度大脑

在线脑图思维导图生成工具

入门小站

工具

前端培训:3 个可能有用JavaScript 类

@零度

JavaScript 前端开发

移动办公时代,政企为何首选私有化的即时通讯平台?

BeeWorks

netty系列之:channel,ServerChannel和netty中的实现

程序那些事

Java Netty nio 程序那些事 2月月更

Linux中Shell重定向

入门小站

Linux

Client-go源码分析之SharedInformer及实战| 社区征文

雪雷

Kubernetes Informer 新春征文

你会写java脚本吗?-JShell

蜜糖的代码注释

Java 后端开发 2月月更

加入科学计算SIG,挑战最前沿的AI+Science研发与创新

百度大脑

天数智芯携手龙蜥社区,以高性能算力助力开源发展

OpenAnolis小助手

Linux 开源 芯片

四款你必须知道的前端开发工具

编程江湖

虎符交易所Hoo研究院:Open Sea上大火的NFT项目—Azuki

区块链前沿News

NFT Hoo 虎符交易所 Azuki

美景本天成,妙笔偶得之——“妙笔”是怎样炼成的?

百度大脑

一文详解Kafka API

华为云开发者联盟

kafka API 拦截器 Consumer API Producer API

这个Dubbo注册中心扩展,有点意思

捉虫大师

dubbo 注册中心

在阿里,我们如何管理测试环境

阿里云云效

阿里云 DevOps 云原生 敏捷开发 研发提效

等保级别最高为几级?市面上常见吗?

行云管家

网络安全 等保 等级保护 过等保

程序员必知的8个Java开源IDE工具

编程江湖

ide

Apsara Stack 技术百科 | 可运营的行业云,让云上资源跑起来

阿里云 科技 混合云

Java培训:封装的含义及实现方式

@零度

JAVA开发 封装

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