测试Jakarta EE:三个层次,三种工具
测试 Jakarta EE 应用很别扭,因为你关心的行为往往要等到容器把它组装出来后才存在。把所有东西都 mock 掉,测试虽然会通过,却几乎证明不了什么。把所有东西都部署起来,又会得到在开发期间没人愿意运行的缓慢场景。
Simon Laden 最近的三部分系列文章 Testing Jakarta EE: Three Layers, Three Tools 展示了 WeldInitiator、Arquillian 和 Testcontainers 如何各自回答一个不同的问题。三部分都基于同一个示例项目 testcontainers-example,这是一个运行在 Azul Payara Micro 上的小型图书管理系统。以下是该系列的快速指南。
第 1 部分:用于 CDI 单元测试的 WeldInitiator
我的 Bean 的装配和逻辑能否独立工作?
无需应用服务器的 CDI 单元测试:WeldInitiator 实践 展示了 WeldInitiator 如何在不使用服务器和 Docker 的情况下,于几毫秒内在你的测试 JVM 中启动一个真实的 Weld SE 容器。这篇文章同样清楚地说明了它不做什么:在普通的 Weld SE 测试中,@Transactional 和 @PersistenceContext 不会生效,而这会改变你的断言究竟有多大价值。
第 2 部分:用于已部署应用的 Testcontainers
已部署的应用真的能工作吗?
Testcontainers 集成测试:在 Docker 中运行你真实的 WAR 会在真实的 Azul Payara Micro 实例上运行你由 Maven 构建的 WAR,然后通过 HTTP 以及使用无头浏览器中的 Playwright 对其进行测试。它涵盖了单例容器模式,以及会让这些测试的简单实现变得不稳定的启动竞态条件。
第 3 部分:在三款工具之间选择
哪项任务该用哪个工具?
Jakarta EE 测试工具对比:WeldInitiator、Arquillian 和 Testcontainers 将这三者并排比较,并加入了 Arquillian,它会在容器自身的 JVM 内运行测试。它说明了为什么被 mock 的 EntityManager 可以通过测试,而真实查询却已经失效,最后还给出了一张可带入测试策略讨论的对比表。
要点
这些工具是分层,而不是替代方案:针对 mock 通过的测试证明你的代码符合你的假设,而只有真实容器才能证明这些假设符合现实。
从最符合你当前问题的那个部分开始,或者按顺序读完三篇。
[LOADING...]
作者:
Dominika Tasarz
我是一名社区建设者,专注于发展全球 Java 和 Jakarta EE 生态系统。我专长于社区策略、开源参与和面向开发者的技术营销,通过活动、内容……构建强大且协作的社区。