写点什么

测试框架的利好和繁荣:Java 单元测试框架之争

  • 2016-06-27
  • 本文字数:1320 字

    阅读完需:约 4 分钟

最近 Reddit 上的讨论帖引发了一场 JUnit Spock 两个测试框架支持者之间的辩论,源起于 Jakub Dziworski 发表的博文,其中心思想是“JUnit 有什么问题?”目前来看几乎每个GitHub 仓库都引入了基于 JUnit 的单元测试,不过也难怪毕竟 JUnit 已经经历了超过 15 个年头。但是 Spock 正在持续蚕食市场。

JUnit 由极限编程(eXtreme programming)创始人 Kent Beck 、《设计模式:可复用面向对象软件的基础》合著者 Erich Gamma 共同创造,并且很快变成单元测试领域的事实标准,被移植和克隆到几乎所有流行的编程语言中。然而,这些年来 JUnit 的的特性一直被新的单元测试框架质疑,例如 TestNG 和 Spock。

TestNG

TestNG 由《Java 测试新技术TestNG 和高级概念》合著者 Cédric Beust 于 2004 年创造。根据 TestNG 网站描述,“TestNG 是从 JUnit 和 NUnit 汲取灵感的测试框架,但是引入了一些新的功能使其更加强大并且易于使用”。Beust 在其自己的网站上写道,“我开始编写 TestNG 是出于无奈,JUnit 有一些不足之处,这些问题我在博客的这里这里进行了标注。”

Spock

Dziworski 在博文中质疑了使用JUnit 需要结合第三方mock 框架。他表示,“在中型和大型Java 项目中结合这些框架会是得读写测试变得更加困难。”他随后说道,“如果测试代码难以编写,开发者通常会将编写测试代码作为痛苦工作,并开始忽略它们。避免或者延迟编写测试代码会导致应用无法再被信任。最后开发者会害怕修改这些代码,因为应用的其他部分可能以某种奇怪的方式出现问题。”

在最近 Java 希腊用户组会议中,《Java 测试框架Spock》的作者Kostis Kapelonis 做了演讲,比较了JUnit 和Spock。

Spock 由 Gradleware 首席工程师 Peter Niederwieser 于 2008 年创建。虽然灵感来自于 JUnit,Spock 的特性不仅仅是 JUnit 的扩展:

  • 测试代码使用 Groovy 语言编写,而被测代码可以由 Java 编写。
  • 内置 mock 框架以减少引入第三方框架。
  • 可支持自定义测试件名称。
  • 为创建测试代码预定义了行为驱动块(given:、when:、then:、expect: 等)。
  • 使用数据表格以减少数据结构的使用需求。

以下代码片段(和 Reddit 讨论中使用的相同)演示了部分特性的使用:

复制代码
class Math extends Specification {
def "maximum of two numbers"(int a, int b, int c) {
expect:
Math.max(a, b) == c
where:
a | b | c
1 | 3 | 3 // passes
7 | 4 | 4 // fails
0 | 0 | 0 // passes
}
}

这个简单的测试示例使用了两个预定义的块,expect:(第三行)和 where:(第五行)。where: 块用于定义数据表格,用于映射第四行定义的 Math.max 函数的期望输入输出。第二行演示了如何为测试用例自定义一个名称。

一个包含 JUnit 和 Spock 代码示例的完整项目可以在 GitHub 上查看。

早在 2008 年 InfoQ 就报道了关于 JUnit灭亡的一些猜想。八年后 JUnit 5 项目仍然健在,里程碑 1 正在开发中。测试框架的利好和繁荣!

查看英文原文: Test Well and Prosper: The Great Java Unit-Testing Frameworks Debate


感谢张龙对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-06-27 19:0010290

评论

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

玩转Github:三分钟教你如何用 Github 快速找到优秀的开源项目

程序知音

Java GitHub 编程语言 后端技术

如何用 YonBuilder 构建线索管理应用?

YonBuilder低代码开发平台

软件测试/测试开发丨H5性能分析实战

测试人

软件测试 性能测试 自动化测试 H5 W3C

从零学习SDK(4)使用SDK创建一个简单的应用程序

MobTech袤博科技

🔥InfoQ写作社区三周年主题征文火热开启

InfoQ写作社区官方

热门活动 三周年征文

【重磅发布】易观千帆用户体验分析产品领先版正式发布

易观分析

金融 银行 用户分析

什么是可信云?通过可信云评估意味着什么?

行云管家

可信云

简化你的代码,提高生产力:这10个Lambda表达式必须掌握

Java Lambda

Atlassian后Server时代 | Server版vs.数据中心版,二者的区别在哪里?

龙智—DevSecOps解决方案

Atlassian 数据中心版 server版

大模型高效开发的秘密武器:大模型低参微调套件MindSpore PET

华为云开发者联盟

人工智能 华为云 大模型 华为云开发者联盟 企业号 4 月 PK 榜

雀氏牛,Alibaba分布式微服务成长手册,GitHub已开源

Java 分布式 微服务

企业云管平台是什么?有什么用?

行云管家

云计算 云管理 云管

[直播预告]行云管家堡垒机V7.0版本说明会

行云管家

行云管家

成都开发者Meetup|聚焦云原生开源,点亮企业创新活力

阿里巴巴云原生

阿里云 容器 微服务 云原生

一份深入解析Java虚拟机HotSpot手册,让我卷成美团架构师

程序知音

Java JVM java架构师 hotspot Java进阶

构建系列之前端脚手架vite

江湖修行

Vue vite cli

阿里P8架构师20年经验总结成微服务设计企业架构转型之道笔记

程序知音

Java 微服务 java架构 Java进阶 后端技术

真下饭!字节技术官DDD(领域驱动设计)手册,拆解业务代码首选

Java 架构 领域驱动设计 DDD

MySQL数据库和Redis缓存一致性的更新策略

Java MySQL 数据库 redis 缓存

LED显示屏十大应用领域值得你收藏

Dylan

LED显示屏 户外LED显示屏 户内led显示屏

面试官:说一说mysql的varchar字段最大长度?

程序员小毕

MySQL 数据库 程序员 面试 架构师

ZBC 荣登OKX涨幅榜前列,月内涨幅逾六成

股市老人

Gartner最新报告,分析超大规模边缘解决方案

阿里云CloudImagine

云计算 边缘计算 边缘云

SpringBoot整合RocketMQ,老鸟们都是这么玩

Java RocketMQ Spring Boot

扯下@EventListener这个注解的神秘面纱。

why技术

Java 源码

“字节”再次起跳!内部651页剖析HotSpot 源码手册,GitHub已开源

Java JVM 虚拟机 hotspot

又搞事!阿里400页JDK并发源码指南,再次被GitHub置顶了!

Java jdk 多线程 高并发 源码剖析

文献管理软件:EndNote 20 v20.5激活版

真大的脸盆

Mac Mac 软件 文献管理 文献管理工具

详解事务模式和Lua脚本,带你吃透Redis 事务

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 4 月 PK 榜

测试框架的利好和繁荣:Java单元测试框架之争_Java_Michael Redlich_InfoQ精选文章