简介
测试是软件开发的组成部分。它确保我们的应用程序可以按预期工作,并防止意外回归。作为工程师,对于我们职业生涯的早期,探索可靠有效的测试实践对我们来说至关重要。在本文中,我们将通过使用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开始您的旅程,并升级您的测试游戏! ð
请记住,从长远来看,在您职业生涯的早期就投入时间来学习可靠的测试实践将带来红利。愉快的测试! ð§ª