如何解决在基于 Spring 或 Spring Boot 的应用程序中编写集成测试的正确方法是什么
我正在为使用 Spring JPA 与 DB 交互的 Spring Boot Rest 应用程序编写代码。 我的应用程序有 3 个主要层 Controller、Service、Repository,并且它具有 CURD 操作。
我想遵循 TDD 方法。我的问题是如何为每个 VERB 实现填充数据。
例如,我从 CREATE impl 开始,并使用 Controller、Service、Repo 等实现了 CREATE 流。现在要实现 PUT、GET、DELETE,我需要在编写测试时填充数据。为此,我在我的集成测试类中使用了 Injecting Repository 并在我的实际测试运行之前加载了数据,或者使用了带有 CommandLineRunner 实现的 DataLoader 来预填充数据。买我的同事坚持我不应该在集成测试类中使用 Repository 来填充数据,而应该使用 User Service 类 bean 并调用 CREATE 实现来填充所需的数据。
是否有设计集成测试和单元测试的最佳实践或指南文档?
主要问题是我们是否在集成测试类中使用 Repository 来填充数据?
解决方法
编写集成测试的主要动机是测试两个软件单元或模块之间的接口。它侧重于确定接口的正确性。这意味着您应该从您的应用程序是否可以集成到其他软件的意义上来测试您的应用程序。在这种情况下,除了您通过控制器公开的端点之外,您的存储库或服务等 bean 不可注入或适用于其他软件。
编写集成测试
在编写集成测试之前,您应该考虑几件事,例如测试用例的范围、每个端点的场景、编写测试的工具/库等。
您可以使用 RestTemplate 或 MockMvc 之类的东西来调用 HTTP 请求(POST、PUT、CREATE、DELETE)。例如,使用 RestTemplate 发出 GET 请求,
@Autowired
private RestTemplate restTemplate;
@Test
void givenYourObjectTypes_whenGetYourObjectTypes_thenStatus200()
ResponseEntity<YourObjectType> response = restTemplate.getForEntity(requestUrl,YourObjectType.class);
assertThat(response.getStatusCode(),equalTo(HttpStatus.OK));
}
我的问题是如何为每个 VERB 实现填充数据。
有名为 BeforeEach 和 BeforeAll 的注释,您可以在设置方法中使用它们中的任何一个来填充数据
是否有设计集成测试和单元测试的最佳实践或指南文档?
你可以在谷歌上找到很多文档。但是一旦你掌握了测试的核心概念,你就会知道变通方法。不过,我还是建议您阅读 Martin Fowler 撰写的关于 Integration Test 的文章(这是我个人的喜好)。
主要问题是我们是否在集成测试类中使用 Repository 来填充数据?
不推荐使用存储库填充数据。相反,我建议您使用 CREATE API 来填充数据,这将是一个真实场景,同时与其他服务/UI/模块/软件集成。
此外,您可以在测试应用程序时尝试范围为 H2
的 test
依赖项,这样可以更快地执行测试用例。但请注意,它仅适用于使用 SQL 数据库的情况。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。