用于集成测试的 Java 测试项目

Posted

技术标签:

【中文标题】用于集成测试的 Java 测试项目【英文标题】:Java test project for integration tests 【发布时间】:2020-05-16 00:06:57 【问题描述】:

我必须使用一些旧的 java 应用程序。 共有6个项目:

使用 rest 和 mq 进行通信和 已经进行了一些集成测试。

作为其中的一部分:

    mvcMock 模拟用于测试的初始请求 额外的 http 请求由服务和 他们反对开发服务器,而不是从当前构建中调用代码; 如果我的测试使用的代码通过开发人员尚未拥有的新端点与另一个项目进行通信,它将失败。

我是如何考虑测试这个的

我的想法是使用单个测试项目,它将使用 @SpringBootTest 和 mockmvc 运行所有必需的项目来模拟真实调用并将它们转移到测试中,而不是使用真实端点。

    我不知道如何让 Spring 与 @Autowired 一起工作并运行 6 不同的 WebApplicationContext。 或者我应该忘记我的计划并使用不同的东西。

【问题讨论】:

问题是什么?我在这里只能看到一堆格式不正确的陈述,而不是一个问题。 【参考方案1】:

当涉及到@SpringBootTest 时,它应该加载加载单个弹簧启动驱动应用程序所需的所有内容。

所以 Spring Boot 测试文档中提到的“集成测试”是针对一个特定的应用程序的。

现在,您正在谈论 6 个已经存在的应用程序。如果这些应用程序都是 Spring Boot 驱动的,那么您可以为每个应用程序运行 @SpringBootTest,并模拟您不需要的所有内容。 MockMvc 你提到的顺便说一句,不会启动整个应用程序,而是启动与 Web 请求处理相关的应用程序的“部分”(例如它不会加载你的 DAO 层),所以它完全不同事情,不要混淆它们:)

如果您不想测试涉及所有 6 个服务的整个流程,则必须运行整个环境并运行将在远程 JVM 上执行的完整系统测试。 在这种情况下,您可以将应用程序容器化并使用TestContainers 在测试中运行它们。

显然,如果数据库有任何容器、消息传递系统等,您还必须为它们提供容器。

总而言之,我觉得这个问题比较模糊,缺乏具体细节。

【讨论】:

使用 TestContainers 可能会比我的计划更简单,如果第一个计划失败,使用类似的东西是我的第二个计划。我来自.net世界,通常创建单个测试项目,包括所需的项目并运行测试,设置配置并用测试客户端替换http客户端,测试客户端不会运行真正的http请求,而是简化流程并直接从不同的web应用程序运行代码,它很容易调试,我可以看到整个堆栈跟踪操作的实际工作方式 这 6 个应用的分发模式是什么?它们是可以部署到 tomcat 的 WAR 吗?他们是带有嵌入式服务器的弹簧启动应用程序吗?还要考虑依赖关系,比如一个应用程序需要版本 x 的 spring,而另一个应用程序需要 spring y。如果创建一个进程,库会发生冲突,这会导致不可预测的结果?

以上是关于用于集成测试的 Java 测试项目的主要内容,如果未能解决你的问题,请参考以下文章

简单可靠的内存数据库,用于支持 JPA 的快速 Java 集成测试

软件测试--集成测试流程

Java集成测试中的void方法

如何在 Maven 中为 Java 项目组织单元、集成、e2e 测试文件夹结构?

Java SDK集成测试概述及实践

Eclipse JAVA 分离单元测试和集成测试