搜索
首页Javajava教程开发/产品奇偶校验:Spring Boot Testcontainers

介绍

开发/产品平价旨在缩小开发和生产环境之间的差距。本文针对工具差距,特别是在使用 Spring Testcontainers 进行集成测试方面,作为使开发和生产尽可能相似的一种方式。
在进行涉及数据库的集成测试时,我们必须仔细管理所有的CRUD操作。这在集中式数据库环境中至关重要,在这种环境中,诸如 TestDeleteUserByID_ShouldReturnOk() 之类的测试可能会“意外地”决定删除自 2015 年以来一直与我们合作的最忠实客户的帐户?‍♂️
为了减轻此类风险,我们可以考虑数据库事务等解决方案来隔离测试数据。例如,测试可以启动一个事务来修改数据,然后在最后回滚,从而使数据库保持原始状态。
但是,这引发了一个关键问题:测试的内容是什么?

Dev/prod parity : Spring Boot Testcontainers

如果隔离失败并且代码执行的更改未回滚,导致数据泄漏到生产环境怎么办?这种情况下的潜在损害是巨大的。

另外,使用 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中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
平台独立性如何使企业级的Java应用程序受益?平台独立性如何使企业级的Java应用程序受益?May 03, 2025 am 12:23 AM

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

考虑到平台独立性,Java在物联网(物联网)设备的开发中扮演什么角色?考虑到平台独立性,Java在物联网(物联网)设备的开发中扮演什么角色?May 03, 2025 am 12:22 AM

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

描述一个方案,您在Java中遇到了一个特定于平台的问题以及如何解决。描述一个方案,您在Java中遇到了一个特定于平台的问题以及如何解决。May 03, 2025 am 12:21 AM

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

Java平台独立对开发人员有什么好处?Java平台独立对开发人员有什么好处?May 03, 2025 am 12:15 AM

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

将Java用于需要在不同服务器上运行的Web应用程序的优点是什么?将Java用于需要在不同服务器上运行的Web应用程序的优点是什么?May 03, 2025 am 12:13 AM

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

JVM如何促进Java的'写作一次,在任何地方运行”(WORA)功能?JVM如何促进Java的'写作一次,在任何地方运行”(WORA)功能?May 02, 2025 am 12:25 AM

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

Java的较新版本如何解决平台特定问题?Java的较新版本如何解决平台特定问题?May 02, 2025 am 12:18 AM

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

说明JVM执行的字节码验证的过程。说明JVM执行的字节码验证的过程。May 02, 2025 am 12:18 AM

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

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

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

热工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

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

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

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

禅工作室 13.0.1

禅工作室 13.0.1

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

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能