AICon 上海站|日程100%上线,解锁Al未来! 了解详情
写点什么

测试框架的利好和繁荣: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:0010029

评论

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

武汉链(基于ETH)BSN官方DDC链上数据解析

BSN研习社

区块链

编译器优化:何为SLP矢量化

华为云开发者联盟

开发 编译器 SLP

金融信创爆发年!袋鼠云数栈DTinsight全线产品通过信通院信创专项测试

袋鼠云数栈

基于开源大数据调度系统Taier的Web前端架构选型及技术实践

袋鼠云数栈

数据资产为王,解析企业数字化转型与数据资产管理的关系

袋鼠云数栈

实时云渲染——让元宇宙从科幻走入现实

Finovy Cloud

云渲染 GPU渲染

袋鼠云数栈基于CBO在Spark SQL优化上的探索

袋鼠云数栈

阿里内部流出的绝密文档JDK源码学习笔记(2022版)限时分享

Java工程师

Java 源码 jdk

一步一图带你深入剖析 JDK NIO ByteBuffer 在不同字节序下的设计与实现

bin的技术小屋

网络编程 Netty nio Java Concurrency java nio

离线数仓建设,企业大数据的业务驱动与技术实现丨03期直播回顾

袋鼠云数栈

直播预告 | Authing 如何打造云原生 SaaS 产品架构?

Authing

当科学家决定搞点“花里胡哨”的东西

图灵教育

一张图,理清微服务架构路线(收藏)

C++后台开发

微服务 微服务架构 Linux服务器开发 C/C++后台开发 C/C++开发

【接入指南 之 云云接入】快速接入HONOR Connect平台(上)

荣耀开发者服务平台

IoT 新手指南 万物互联 荣耀 honor

开源技术交流丨批流一体数据同步引擎ChunJun数据还原-DDL功能模块解析

袋鼠云数栈

走好数据中台最后一公里,为什么说数据服务API是数据中台的标配?

袋鼠云数栈

IDC:阿里云位居2021年中国关系型数据库市场第一

Lily

招生报名小程序开发笔记一:开发背景和技术方案的选型确定

CC同学

Apache APISIX 在微软云 ARM 和 x86 服务器上的性能测试对比

API7.ai 技术团队

API网关 APISIX 微软云

开源一夏 | jQuery scroll() 滚动加载列表 获取腾讯云图片像素信息

六月的雨在InfoQ

开源 COS ​jQuery 8月月更

2022年了,你还不会手撕轮播图?

知心宝贝

JavaScript 算法 前端 可视化 签约计划第三季

如何读取redis的手机号验证码数据,实现自动化登录测试

Liam

程序员 测试 自动化测试 测试开发 测试自动化

招生报名小程序开发笔记三:数据库设计

CC同学

DTMO直播预告|Taier的Web前端架构解析

袋鼠云数栈

走好数据中台最后一公里,为什么说数据服务API是数据中台的标配?

袋鼠云数栈

实时开发平台建设实践,深入释放实时数据价值丨04期直播回顾

袋鼠云数栈

你的数据是如何泄露的?企业和个人应该这样做……

火绒安全

安全漏洞 数据泄露 黑客攻击

招生报名小程序开发笔记二:功能需求设计

CC同学

黄东旭,TiDB的灵魂骑手,和他的叛逆“问答”

B Impact

元宇宙|高阶音频处理能力,让声音「声临其境」

融云 RongCloud

音视频技术

云图说丨初识云速建站服务

华为云开发者联盟

云计算 网站 华为云 搭建网站

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