我们正在构建一个Google Photos克隆版,但测试实在是太难了!
我们如何测试我们的Java应用程序是否正确地启动了ImageMagick进程,或者生成的缩略图是否正确大小,并且确实是缩略图,而不是随机的猫咪图片?我们如何测试不同的ImageMagick版本和操作系统?
视频内容
00:00 引言
视频开头,我们概述了为什么测试我们的Google Photos克隆版如此棘手。正如上一集所述,我们开始从图像中提取缩略图,但现在我们需要一种测试方法。由于这是通过外部ImageMagick进程完成的,我们面临着一系列挑战。
01:05 设置JUnit并编写第一个测试方法
首先,我们将设置JUnit 5。由于我们没有使用Spring Boot这样的框架,这是一个很好的练习,只需添加最少的库和配置,就能让我们开始使用JUnit。此外,我们将编写一些测试方法框架,同时思考如何接近测试现有代码,并注意测试方法命名等细节。
04:19 实现ImageMagick版本检测
在上集中,我们注意到在不同系统上运行Java应用会导致意外结果或直接出错。这是因为不同版本的ImageMagick提供的API集有所差异,我们需要调用这些API。因此,我们需要调整代码以检测已安装的ImageMagick版本,并在运行任何测试之前添加一个检查ImageMagick是否确实已安装的测试方法。
10:32 测试权衡
显然,要实现针对多种操作系统和不同ImageMagick版本的100%测试覆盖率,需要相当复杂的CI/CD设置,而这超出了本项目的范围。因此,我们正在讨论我们的方法的利弊。
12:00 实现@EnabledIfImageMagickIsInstalled
然而,我们可以确保其余的测试套件仅在ImageMagick已安装时运行。为此,我们将编写一个自定义的JUnit 5注解,名为EnabledIfImageMagickIsInstalled
,你可以将其添加到任何测试方法或整个类中,以启用此行为。如果ImageMagick未安装,测试将不会运行,而不是显示一个难看的错误信息。
16:05 成功创建缩略图的测试
面临的最大挑战是:如何正确断定缩略图是否已正确生成?我们将通过检查ImageMagick的退出代码、估算文件大小、加载图像并确保其像素数量正确来解决这一问题。这一切都得益于AssertJ及其SoftAssertions,它们能轻松地将多个断言合并为一个。
23:59 仍然只在本地机器上有效
即便完成了整个工作流程的测试,我们仍需确保针对不同版本的ImageMagick调用不同的API。我们可以迅速添加此功能以支持IM6和IM7,然后即可完成任务。
25:53 部署
现在是将应用程序部署到我的NAS上的时候了。这一次,一切运行如预期!
26:20 最终测试思考
本集中我们进行了大量测试。让我们总结一下所面临的挑战以及学到的实用测试策略。
27:31 下一步
本集将以展望未来结束:多线程问题!
下集再见。
Source:
https://dzone.com/articles/i-dont-tdd-pragmatic-testing-with-java