Ohhnews

分类导航

$ cd ..
foojay原文

测试Jakarta EE:三个层次,三种工具

#jakarta ee#软件测试#weldinitiator#arquillian#testcontainers

测试 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 生态系统。我专长于社区策略、开源参与和面向开发者的技术营销,通过活动、内容……构建强大且协作的社区。