java 快照_写一个JAVA快照测试工具

本文介绍了如何在Java中实现快照测试工具,通过序列化对象为JSON格式,进行断言比较,以简化复杂内容的测试。文章讨论了现有库的不足,并详细阐述了自定义快照测试工具的实现思路,包括序列化、快照更新和比较逻辑,以及快照文件的存储路径和命名规则。同时,给出了一个简化的代码实现示例。
摘要由CSDN通过智能技术生成

快照测试,指的是在测试中首次调用断言方法时,将对象以可读的序列化形式保存起来,然后人工查看一下结果是否正确,如果不正确则重新生成。再次运行测试断言时将对象与保存的快照文件做对比,以确保结果一致,符合预期。

快照测试最大的优点是能轻松地断言复杂的内容,它经常被用于前端项目,因为前端的渲染结果如 HTML、CSS 等都挺复杂,用正则或是其它的工具去匹配它们很费劲,不如直接检查整个结果。

快照测试的缺点是只能比较相等,无法执行大于小于之类的逻辑判断;还有要求对象必须能序列化。

最近撸了一个快照测试工具,感觉挺有用的,便写此文记录和分享一下编写思路。

需求场景

在重构本博客的后端服务时,发现单测里一些结果比较复杂,一条条字段挨个 assert 很是烦人,于是便想到能不能把前端的快照测试搬过来。一番查找只找到两个库 java-snapshot-matcher 和 java-snapshot-testing ,考察后发现它们不太符合我的需求:

java-snapshot-matcher 的快照文件名有问题,仅使用类和方法名,不支持一个方法内多次断言;另外它从调用栈查找测试方法,这在某些情况下是不准确的。

java-snapshot-testing 我不知道他是怎么写出这么多代码的,太复杂了;而且它似乎使用了内置的序列化器,我的项目里自定义了一些类型的序列化方式,必须要求序列化器能够扩展。

嘛总之第三方库都有些问题,还得自己造轮子。我简单地找了一下相关的文章,发现 JAVA 方面快照测试的文章寥寥无几,中文的更是一个没有,我感觉挺好用的一个东西似乎在 JAVA 的世界里不太流行啊。

不过没有教程也无所谓,快照测试的逻辑也不复杂,事实上实现起来相当简单,依靠与现有的系统(AssertJ、IDE)集成,核心功能只要 100 来行代码就搞定了(不算注释)。

基本思路

流程图

基本的流程就是这么简单,首先看看第一步序列化对象,因为要把快照保存为文件,序列化是必不可少的,而且序列化后的格式必须是人类可读的。这里还是选择最常用的 JSON 格式,不得不说 JSON 很是牛B,覆盖了大部分数据类型的同时还有着不错的可读性。博客项目后端使用 Spring 全家桶,自带 JSON 序列化工具 Jackson,用它即可。

第二步更新快照的判断,如果快照文件不存在肯定是要新建,另外像 Jest 一样也支持设置参数 updateSnaoshot 来强制更新,就这两种情况。

最后一个操作是比较,这个直接判断序列化后的字符串是否相等即可。现代的 IDE 比如

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值