如何 0 成本启动全员 AI 技能提升?戳> 了解详情
写点什么

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

评论

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

在线文本按列截取工具

入门小站

工具

复杂业务系统高扩展架构设计与实践

鲸品堂

构架

JavaScript 数组展平方法: flat() 和 flatMap()

devpoint

11月日更 flat flatMap

Prometheus Exporter (十)Ping Exporter

耳东@Erdong

Prometheus ping exporter 11月日更

[Pulsar] 消息生命历程(四)——Broker的消息处理

Zike Yang

Apache Pulsar 11月日更

Flutter:如何在没有插件的情况下制作旋转动画

坚果

flutter 11月日更

Apache APISIX request_uri 变量控制不当,存在路径穿透风险公告(CVE-2021-43557)

API7.ai 技术团队

Apache 云原生 漏洞修复 Apache APISIX ingress-controller

博文推荐 | 基于 Pulsar 事务实现 Exactly-Once 语义

Apache Pulsar

Java 架构 云原生 中间件 Apache Pulsar

架构实战营-模块六

瓜子葫芦侠

「架构实战营」

《深入理解JVM虚拟机》读书笔记:第二章 Java内存区域与内存溢出异常

Joseph295

Android C++系列:Linux进程间通信(二)

轻口味

c++ android jni 11月日更

央视新闻联合百度智能云打造首个AI手语主播

百度大脑

人工智能

详解阿里开源分布式事务框架Seata

博文视点Broadview

云小课|打造企业数据“高内聚,低耦合”--试试GaussDB(DWS)逻辑集群,实现数据物理隔离

华为云开发者联盟

EI企业智能 数据仓库服务GaussDB(DWS) 逻辑集群

贪心算法:加油站 ⛽

空城机

算法 大前端 11月日更

没有人比我更会使用集合!对,是dart中的集合

程序那些事

Java flutter dart 程序那些事 11月日更

JSRE中的多任务与多线程

编程江湖

html5 大前端

深入理解 volatile 关键字

编程江湖

volatile JAVA开发

译文 | Apache Pulsar 集群如何确保消息不丢

Apache Pulsar

Java 分布式 云原生 中间件 Apache Pulsar

如何使用find和locate 命令在Linux 中查找文件和目录?

Ethereal

Linux find locate

vue3 学习笔记 (三)——vue3 自定义指令

码仔

Vue3 自定义指令

Hadoop 入门笔记—核心组件 YARN

编程江湖

大数据 hadoop

程序员如何应对职业天花板

石云升

职场天花板 职场经验 11月日更

小谈C#异常

喵叔

11月日更

docker vs docker-compose 解密

liuzhen007

11月日更

【高并发】浅谈AQS中的CountDownLatch、Semaphore与CyclicBarrier

冰河

Java 并发编程 多线程 高并发 异步编程

搞定大厂算法面试之leetcode精讲6.深度优先&广度优先

全栈潇晨

算法面试 Leet Code

头条观察 | 元宇宙成为必然趋势的三种可能

CECBC

架构原则

卢卡多多

架构 11月日更

风口上的低代码:我们看到了这些变化与趋势

脑极体

linux 上查找包含特定文本的所有文件

入门小站

Linux

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