写点什么

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

评论

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

安卓推送一体解决方案

融云 RongCloud

视频云大赛|视频目标分割,下一个视频算法技术爆发点?

阿里云CloudImagine

阿里云 算法 计算机视觉 音视频

身份验证会影响用户体验吗?

龙归科技

身份认证 用户体验 安全性

国内唯一,阿里云挺进 Forrester 全球云数据仓库卓越表现者象限

阿里云大数据AI技术

云计算 大数据 阿里云 数据仓库 Forrester Wave

微软在比特币区块链上推出身份认证平台

CECBC

比特币

爱奇艺大数据生态的实时化建设

爱奇艺技术产品团队

大数据 实时数仓 数据流

python 国际化实践

walker12138

Python flask i18n

从低代码/无代码烂大街的吃瓜群众说起

李小腾

低代码 无代码开发

【得物技术】出价组DDD分层模型总结

得物技术

技术 总结 DDD 模型 出价

国内首个自主可控区块链技术发布!已在北京冷链追溯中显威

CECBC

区块链

量化交易系统开发;量化策略软件,马丁策略交易

百位优质创作者签约计划|声网签约权益

InfoQ写作社区官方

签约计划 热门活动

I/O多路复用之EPOLL

高性能架构探索

寻找被遗忘的勇气(二十六)

Changing Lin

3月日更

常考面试题之css篇

yumibgt

PaddleWeekly | 飞桨开源项目每周推

百度大脑

如何减少期望值差异

石云升

绩效 28天写作 职场经验 管理经验 3月日更

LeetCode题解:剑指 Offer 49. 丑数,暴力法,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

重磅官宣:Nacos2.0发布,性能提升10倍

阿里巴巴中间件

云计算 开源 nacos

百位优质创作者签约计划|InfoQ 签约权益

InfoQ写作社区官方

签约计划 热门活动

【OpenPyXL】对Excel单元格的操作

IT蜗壳-Tango

办公自动化 3月日更 IT蜗壳教学

2020年京东161亿研发费用,钱怎么花的?

吴俊宇

投资 数字化 京东

用 19 张思维导图描述Spring Cloud的概念和主要组件,建议收藏

北游学Java

Java 面试 Spring Cloud

融云2021 X-Meetup启航 探索高并发下的高质量实时通信架构设计

融云 RongCloud

java集合【12】——— ArrayList,LinkedList,Vector的相同点与区别是什么?

秦怀杂货店

Java 源码 集合

浅谈I/O多路复用

高性能架构探索

中国唯一入选 Forrester 领导者象限,阿里云 Serverless 产品能力全球第一

阿里巴巴中间件

阿里云 Serverless Forrester Wave

Wireshark数据包分析学习笔记Day23

穿过生命散发芬芳

Wireshark 数据包分析 3月日更

来云智技术论坛,带你认识 云智一体!

百度大脑

软件工程笔记:什么是软件工程

风翱

软件工程 3月日更

设计模式简介

happlyfox

学习 设计模式 3月日更

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