【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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

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

关注

评论

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

树莓派上的 K8S 集群挂了,怎么办?

百度开发者中心

百度 技术 经验分享

架构是什么?空中楼阁?不切实际?

Java架构师迁哥

iOS 面试策略之系统框架-设计模式

iOSer

ios 并发编程 tableView

如何快速构建嵌入式全栈知识体系?

博文视点Broadview

当当购书优惠码又可以限时抢啦(热卖新书等你来)

博文视点Broadview

打破固有思维(十八)

Changing Lin

5月日更

Docker挂了,数据如何找回

运维研习社

Docker 运维 数据恢复 5月日更

☕【JVM 技术之旅】带你重塑对类加载机制的认识

洛神灬殇

JVM Java虚拟机 类加载器 原理分析 5月日更

Hive对分区分桶表的操作

五分钟学大数据

大数据 hive 5月日更

一种基于实时分位数计算的系统及方法

百度Geek说

云计算 大前端 云服务

ASP.NET Core整合Zipkin链路跟踪

yi念之间

Java程序员想要拿到50W以上年薪,哪个技术是必备的?

Java架构师迁哥

超详细的JQuery的 DOM操作,一篇就足够!

华为云开发者联盟

html 大前端 DOM 函数 JQuery框架

强化学习落地:竞态场景下基于锁机制的闲置端口查用

行者AI

强化学习

李开复、张亚勤、吴恩达…国际大咖给你讲解AI知识

博文视点Broadview

面试37次,16个offer上岸,总结了一些面试心得

北游学Java

面试 offer

麦肯锡最新报告 | 开发者速率成为企业增长助推剂

LigaAI

SaaS

一颗CPU与病魔赛跑

E科讯

云智慧发布《智能业务运维》2021年刊 邀您共览数字化运维全景象

云智慧AIOps社区

AIOPS 智能运维

网页端IM通信技术快速入门:短轮询、长轮询、SSE、WebSocket

JackJiang

websocket 消息推送 即时通讯 IM

毕业设计So Easy:基于Java语言西餐厅点餐系统

不脱发的程序猿

Java 开源 Java语言西餐厅点餐系统 毕业设计

云小课 | 华为云KYON之L2CG

华为云开发者联盟

虚拟私有云 华为云 大二层网络 KYON企业级云网络 L2CG

书单 | 职场办公类私藏好书,轻松Get职场必备技能

博文视点Broadview

软硬件融合新时代——让软件够灵活,硬件够高效,鱼和熊掌可兼得

博文视点Broadview

阿里的互联网三高架构是真的牛!腾讯百度根本模仿不来

Java架构师迁哥

做开发,这几种锁机制你不得不了解一下

华为云开发者联盟

读写锁 自旋锁 互斥锁 优先锁

深度分享|中小银行如何实现数字化转型,建设智能营销新体系?

索信达控股

大数据 数字化转型 金融 银行 营销数字化

dubbo的前世今生

捉虫大师

dubbo

Mybatis-Plus的应用场景及注入SQL原理分析

vivo互联网技术

源码分析 mybatis

联邦学习在视觉领域的应用,揭秘AI人工智能创新应用奖获奖案例

博文视点Broadview

IDC数据中心介绍

大数据技术指南

数据中心 5月日更

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