ð升级您的测试游戏:使用Java和Spring Bootð§ª来利用测试范围的功能
#测试 #java #springboot #softwaredevelopment

简介

测试是软件开发的组成部分。它确保我们的应用程序可以按预期工作,并防止意外回归。作为工程师,对于我们职业生涯的早期,探索可靠有效的测试实践对我们来说至关重要。在本文中,我们将通过使用Java和Spring Boot实现测试范围,从而释放我们的测试工作流程中的容器化功能,从而深入研究集成和功能测试。让我们开始吧! ð

什么是集成和功能测试?

集成测试涉及验证应用程序的不同组件之间的相互作用,以确保它们有凝聚力的工作。另一方面,功能测试验证应用程序中各个单元的功能。两种类型的测试相互补充,提供全面的覆盖范围,以防止我们软件中的潜在错误或问题。

介绍测试范围函

TestContainers是一个开源Java库,使开发人员能够无缝创建,管理和编排用于隔离测试环境的Docker容器。通过将测试调节器与我们的测试框架集成在一起,我们可以在编写测试的同时轻松提供数据库或消息经纪人等容器,确保准确有效的集成和功能测试。

用Maven和Gradleðð

设置测试范围

要利用测试范围的功能,我们需要在构建工具设置中添加必要的依赖项。

maven示例ð2°

在您的pom.xml文件中,包括以下依赖项:

<dependency>
  <groupId>org.testcontainers</groupId>
  <artifactId>testcontainers</artifactId>
  <version>1.19.0</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.testcontainers</groupId>
  <artifactId>junit-jupiter</artifactId>
  <version>1.19.0</version>
  <scope>test</scope>
</dependency>

gradle示例ð2°2°

在您的build.gradle文件中,添加依赖项:

testImplementation 'org.testcontainers:testcontainers:1.19.0'
testImplementation 'org.testcontainers:junit-jupiter:1.19.0'

在您的build.gradle.kts文件中,添加依赖项:

testImplementation("org.testcontainers:testcontainers:1.19.0")
testImplementation("org.testcontainers:junit-jupiter:1.19.0")

有了这些依赖项,我们准备探索测试范围的魔力! -

使用带有弹簧启动示例的testContainersð»

让我们进入一个实用示例,说明如何利用春季启动框架进行集成测试的测试范围:

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

@Testcontainers
@SpringBootTest
@TestPropertySource(locations="classpath:application-test.yaml")
public class MyIntegrationTests {

  @Container
  private static final PostgreSQLContainer<?> postgresContainer = new PostgreSQLContainer<>("postgres:latest");

  // Your tests go here
}

在此示例中,我们用@Testcontainers注释了我们的测试类,将其定义为测试容器吸引类。我们还添加了@SpringBootTest以启用春季启动特异性配置和@TestPropertySource加载特定的测试属性。

使用@Container注释,我们声明了PostgreSQL容器的实例。 TestContainers会自动启动并停止每个测试执行的容器。您可以根据您的要求轻松配置其他容器,例如MySQL或Redis。

您还可以包括弹簧靴依赖性

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-testcontainers</artifactId>
  <version>3.1.3</version>
  <scope>test</scope>
</dependency>

gradle示例ð2°2°

在您的build.gradle文件中,添加依赖项:

testImplementation 'org.springframework.boot:spring-boot-testcontainers:3.1.3'

在您的build.gradle.kts文件中,添加依赖项:

testImplementation("org.springframework.boot:spring-boot-testcontainers:3.1.3")

使用带有弹簧启动示例容器的TestContainers作为豆类ð»

import org.springframework.boot.test.context.TestConfiguration
import org.springframework.boot.testcontainers.service.connection.ServiceConnection
import org.springframework.context.annotation.Bean
import org.testcontainers.containers.PostgreSQLContainer
import org.testcontainers.containers.wait.strategy.Wait
import org.testcontainers.utility.DockerImageName
import java.time.Duration

@TestConfiguration(proxyBeanMethods = false)
class TestConfig {

    @Bean
    @ServiceConnection
    fun postgresSqlContainer(): PostgreSQLContainer<*> =
        PostgreSQLContainer(
            DockerImageName.parse("postgres:latest"),
        ).also {
            it.setWaitStrategy(
                Wait.defaultWaitStrategy()
                    .withStartupTimeout(Duration.ofSeconds(30)),
            )
        }.run {
            this.start()
            this
        }
}

这将允许在无需重新启动的情况下重新使用多个测试的容器。

有关使用Kotlin的完整示例,请查看此GitHub repository

优点和替代方案ð

测试范围为集成和功能测试提供了许多好处:

隔离:测试范围内创建用于测试的孤立环境,避免干扰外部依赖或共享环境。

可重复性:每个测试运行始于干净的环境,消除了由于冲突或陈旧状态引起的任何问题。

易用性:TestContainers与流行的测试框架无缝集成并降低了设置单独的测试环境的复杂性。

虽然TestContainers是测试的绝佳选择,但也有可用的替代工具。一些重要的替代方案包括Docker Compose,Mountebank和Wiremock。每个都有其独特的优势,因此您应该根据自己的特定需求进行选择。

结论ð

通过将测试调节器纳入测试库中,您可以轻松地实现有效且可靠的集成和功能测试。它与Java和Spring靴的无缝集成使其成为利用测试套件中容器化的理想选择。从今天开始使用TestContainers开始您的旅程,并升级您的测试游戏! ð

请记住,从长远来看,在您职业生涯的早期就投入时间来学习可靠的测试实践将带来红利。愉快的测试! ð§ª