介绍
开发/产品平价旨在缩小开发和生产环境之间的差距。本文针对工具差距,特别是在使用 Spring Testcontainers 进行集成测试方面,作为使开发和生产尽可能相似的一种方式。
在进行涉及数据库的集成测试时,我们必须仔细管理所有的CRUD操作。这在集中式数据库环境中至关重要,在这种环境中,诸如 TestDeleteUserByID_ShouldReturnOk() 之类的测试可能会“意外地”决定删除自 2015 年以来一直与我们合作的最忠实客户的帐户?♂️
为了减轻此类风险,我们可以考虑数据库事务等解决方案来隔离测试数据。例如,测试可以启动一个事务来修改数据,然后在最后回滚,从而使数据库保持原始状态。
但是,这引发了一个关键问题:测试的内容是什么?
如果隔离失败并且代码执行的更改未回滚,导致数据泄漏到生产环境怎么办?这种情况下的潜在损害是巨大的。
另外,使用 H2DB 等内存数据库进行独立测试也带来了一些挑战。即使设置很容易,H2DB 与 RDBMS 不同,因此开发环境和生产环境之间的测试很可能会产生不同的结果,因此我们不能相信这些结果。
https://stackoverflow.com/questions/62778900/syntax-error-h2-database-in-postgresql-compatibility
下一个问题较少的解决方案是克隆数据库,通过类似生产的环境提供风险较小的方法。然而,这种方法也有其局限性。鉴于 ORM 自动创建和设置生产数据库模式,我们需要考虑如何保持克隆的开发数据库同步。
测试您可以容器化的任何内容:数据库、消息代理等等
“Testcontainers 是一个支持 JUnit 测试的 Java 库,提供通用数据库、Selenium Web 浏览器或任何其他可以在 Docker 容器中运行的东西的轻量级一次性实例。”
它最初是为 Java 开发的,后来扩展到支持其他语言,如 Go、Rust 和 .NET。
Testcontainers 的主要思想是提供一个可从 IDE 运行的按需基础设施,无需模拟或使用内存服务即可进行测试,并且可以自动清理。
我们可以通过三个步骤来实现这一目标:
- 启动所需的服务并通过设置 Docker 容器来准备基础设施,并将您的应用程序配置为使用此设置作为测试基础设施。
- 在 Docker 化基础设施上运行测试。
- 测试结束后自动清理docker化基础设施
Testcontainers 库文档
Spring Boot 测试容器实现
在集成测试的基类ApplicationIntegrationTests中,我们定义了一个静态的PostgreSQLContainer。此容器用于从此类派生的所有测试实例。
@Testcontainers 注解可以发现所有用 @Container 注解的字段,管理其容器生命周期方法,并启动容器。
- 声明为静态字段的容器在测试方法之间共享。它们仅在执行任何测试方法之前启动一次,并在执行最后一个测试方法后停止。
- 声明为实例字段的容器会针对每个测试方法启动和停止。
@DynamicPropertySource 注解允许我们动态地将属性注入到我们的测试环境中。
@Testcontainers @ActiveProfiles("test") public abstract class ApplicationIntegrationTests { @Container protected static PostgreSQLContainer> postgres=new PostgreSQLContainer("postgres:17.2-alpine") .withDatabaseName("testcontainersproject") .withUsername("root") .withPassword("root"); @DynamicPropertySource static void initialize(DynamicPropertyRegistry registry) { registry.add("spring.datasource.url",postgres::getJdbcUrl); registry.add("spring.datasource.username",postgres::getUsername); registry.add("spring.datasource.password",postgres::getPassword); } }
或者,我们可以跳过使用@Testcontainers和@Container,而是直接使用@BeforeAll和@AfterAll来管理容器生命周期。这种方法可以更好地控制容器启动和停止的时间和方式
@BeforeAll public static void runContainer(){ postgres.start(); } @AfterAll static void stopContainers() { postgres.stop(); }
在@AfterAll回调方法中,我们显式停止Postgres容器。但是,即使我们没有显式停止容器,Testcontainers 也会在测试运行结束时自动清理并关闭容器。
现在我们可以通过扩展 ApplicationIntegrationTests 来创建集成测试,如下所示。
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @AutoConfigureMockMvc public class CategoryControllerTest extends ApplicationIntegrationTests { private static final String CATEGORY_ENDPOINT="/categories"; @Autowired private MockMvc mockMvc; @Autowired private CategoryRepository categoryRepository; @Test void TestGetAllCategories_ShouldReturnOk() throws Exception { List<category> categories = List.of( new Category("Electronics", "All kinds of electronic gadgets from smartphones to laptops"), new Category("Books", "A wide range of books from novels to educational textbooks") ); categoryRepository.saveAll(categories); MvcResult mvcResult=mockMvc.perform( get(CATEGORY_ENDPOINT). contentType(MediaType.APPLICATION_JSON) ) .andExpect(status().isOk()) .andReturn(); var response=mvcResult.getResponse().getContentAsString(); assertNotNull(response); assertFalse(response.isEmpty()); } } </category>
以上是开发/产品奇偶校验:Spring Boot Testcontainers的详细内容。更多信息请关注PHP中文网其他相关文章!

Java在企业级应用中被广泛使用是因为其平台独立性。1)平台独立性通过Java虚拟机(JVM)实现,使代码可在任何支持Java的平台上运行。2)它简化了跨平台部署和开发流程,提供了更大的灵活性和扩展性。3)然而,需注意性能差异和第三方库兼容性,并采用最佳实践如使用纯Java代码和跨平台测试。

JavaplaysigantroleiniotduetoitsplatFormentence.1)itallowscodeTobewrittenOnCeandrunonVariousDevices.2)Java'secosystemprovidesuseusefidesusefidesulylibrariesforiot.3)

ThesolutiontohandlefilepathsacrossWindowsandLinuxinJavaistousePaths.get()fromthejava.nio.filepackage.1)UsePaths.get()withSystem.getProperty("user.dir")andtherelativepathtoconstructthefilepath.2)ConverttheresultingPathobjecttoaFileobjectifne

Java'splatFormIndenceistificantBecapeitAllowSitallowsDevelostWriTecoDeonCeandRunitonAnyPlatFormwithAjvm.this“ writeonce,runanywhere”(era)橱柜橱柜:1)交叉plat formcomplibility cross-platformcombiblesible,enablingDeploymentMentMentMentMentAcrAptAprospOspOspOssCrossDifferentoSswithOssuse; 2)

Java适合开发跨服务器web应用。1)Java的“一次编写,到处运行”哲学使其代码可在任何支持JVM的平台上运行。2)Java拥有丰富的生态系统,包括Spring和Hibernate等工具,简化开发过程。3)Java在性能和安全性方面表现出色,提供高效的内存管理和强大的安全保障。

JVM通过字节码解释、平台无关的API和动态类加载实现Java的WORA特性:1.字节码被解释为机器码,确保跨平台运行;2.标准API抽象操作系统差异;3.类在运行时动态加载,保证一致性。

Java的最新版本通过JVM优化、标准库改进和第三方库支持有效解决平台特定问题。1)JVM优化,如Java11的ZGC提升了垃圾回收性能。2)标准库改进,如Java9的模块系统减少平台相关问题。3)第三方库提供平台优化版本,如OpenCV。

JVM的字节码验证过程包括四个关键步骤:1)检查类文件格式是否符合规范,2)验证字节码指令的有效性和正确性,3)进行数据流分析确保类型安全,4)平衡验证的彻底性与性能。通过这些步骤,JVM确保只有安全、正确的字节码被执行,从而保护程序的完整性和安全性。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

WebStorm Mac版
好用的JavaScript开发工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

禅工作室 13.0.1
功能强大的PHP集成开发环境

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能