阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

测试框架的利好和繁荣: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 )关注我们。

公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2016-06-27 19:009515

评论

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

50万条数据 深挖四川数字经济“发展密码”:四川数字经济发展分析

易观分析

数字经济

行业分析| 智能安防的发展

anyRTC开发者

人工智能 AI 音视频 安防 快对讲

大数据培训 | Doris数据导入与导出

@零度

Doris 大数据开发

java培训 | Mybatis 中的 PreparedStatement 预编译

@零度

mybatis JAVA开发

消灭非稳态噪音的利器 - AI 降噪

ZEGO即构

RTC AI降噪 网络降噪

在RPA立项阶段,银行需要做哪三件事?

易观分析

银行

5G 时代,我们需要更便捷的RTC技术服务

HIFIVE音加加

RTC 音乐

【直播回顾】Hello HarmonyOS进阶课程第四课——ArkUI动画开发

HarmonyOS开发者

HarmonyOS

【云管理】企业多元化私有云设施管理用什么软件好?

行云管家

云计算 私有云 IT运维 云管理

Apipost 6.0.4版本 支持离线使用

Xd

后端 接口测试 API

喜讯|旺链科技成为TBI数字藏品项目组首批成员

旺链科技

区块链 产业区块链 数字藏品

【LeetCode】房屋偷盗Java题解

Albert

LeetCode 5月月更

做SAP freelancer 的几个注意事项

SAP虾客

SAP freelancer 黑名单 业界名声

原生即时通讯APP四合一成品聊天软件源码搭建个性化需求定制开发

WorkPlus

数仓血缘关系数据的存储与读写

NebulaGraph

图数据库 知识图谱 Nebula Graph

数据指标体系如何搭建才最有效,从0到1带你快速入门丨02期直播回顾

袋鼠云数栈

深度学习利器之GPU

AIWeker

人工智能 深度学习 gpu 5月月更

EAM与ERP有什么区别?

低代码小观

资产管理 企业管理系统 ERP CRM系统 ERP系统

当前中小企业网络营销缺少的三个方面

源字节1号

前端开发 后端开发 小程序开发 网站开发

JavaScript this全解析

源字节1号

软件开发 前端开发 后端开发 小程序开发

leetcode 34. Find First and Last Position of Element in Sorted Array 在排序数组中查找元素的第一个和最后一个位置(中等)

okokabcd

LeetCode 查找

Yii2文件/图片上传实例

Owen Zhang

php

浅谈SAP顾问未来十年在中国的发展前景

SAP虾客

SAP顾问 技术专家 行业专家

一款免费的排队叫号工具,居然有这么多功能,赶紧收藏起来!

天天预约

小程序 SaaS 工具分享 排队

得物技术Filament Creator材质编辑工具的实现

得物技术

模型 3D模型 3D 渲染 引擎

王者荣耀商城异地多活架构设计

哈喽

「架构实战营」

等保测评师是做什么的?工资怎么样?

行云管家

网络安全 IT运维 等保测评 等保测评师

他做了跟世界首富同样的选择|ONES 人物

万事ONES

linux之xargs使用技巧

入门小站

Linux

web前端培训 | 代码如何配置规范并格式化

@零度

前端开发

TiDBv6.0与TiDBv5.1.2 TiKV 节点重启后 leader 平衡加速,提升业务恢复速度对比测试

TiDB 社区干货传送门

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