ITPub博客

首页 > 数据库 > 数据库开发技术 > Spring Boot集成testcontainers快速入门Demo

Spring Boot集成testcontainers快速入门Demo

原创 数据库开发技术 作者:hblog 时间:2024-05-20 08:30:07 0 删除 编辑


1.什么是testcontainers?

Testcontainers 是一个用于创建临时 Docker 容器进行单元测试的 Java 库。当我们想要避免使用实际服务器进行测试时,它非常有用。,官网介绍称支持50多种组件。

 

应用场景

数据访问层集成测试:

使用MySQL,PostgreSQL或Oracle数据库的容器化实例测试您的数据访问层代码,但无需在开发人员的计算机上进行复杂的设置,并且测试将始终从已知的数据库状态开始,避免“垃圾”数据的干扰。也可以使用任何其他可以容器化的数据库类型。

应用程序集成测试:

用于在具有相关性(例如数据库,消息队列或Web服务器)的短期测试模式下运行应用程序。

UI /验收测试:

使用与Selenium兼容的容器化Web浏览器进行自动化UI测试。每个测试都可以获取浏览器的新实例,而无需担心浏览器状态,插件版本或浏览器自动升级。您将获得每个测试会话或测试失败的视频记录。

2.代码工程

实验目的:在 Spring Boot 中使用 Testcontainers 测试 Redis。

pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <parent>        <artifactId>springboot-demo</artifactId>        <groupId>com.et</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>
<artifactId>testcontainers</artifactId>
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.testcontainers</groupId> <artifactId>testcontainers</artifactId> <version>1.17.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies></project>

entity

package com.et.testcontainers.entity;
import lombok.AllArgsConstructor;import lombok.Data;import org.springframework.data.redis.core.RedisHash;
import java.io.Serializable;
@RedisHash("product")@AllArgsConstructor@Datapublic class Product implements Serializable { private String id; private String name; private double price;

}

service

package com.et.testcontainers.service;
import com.et.testcontainers.Repository.ProductRepository;import com.et.testcontainers.entity.Product;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;
@Servicepublic class ProductService { @Autowired private ProductRepository productRepository;

public Product getProduct(String id) { return productRepository.findById(id).orElse(null); }

public void createProduct(Product product) { productRepository.save(product); }}

Repository

package com.et.testcontainers.Repository;
import com.et.testcontainers.entity.Product;import org.springframework.data.repository.CrudRepository;import org.springframework.stereotype.Repository;
@Repositorypublic interface ProductRepository extends CrudRepository<Product, String> {}

appliication.properties

spring.redis.host=127.0.0.1spring.redis.port=6379

启动类

package com.et.testcontainers;
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplicationpublic class DemoApplication {
public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); }}

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • https://github.com/Harries/springboot-demo

3.测试

编写测试类

package com.et.testcontainers;
import com.et.testcontainers.entity.Product;import com.et.testcontainers.service.ProductService;import org.junit.After;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import org.testcontainers.containers.GenericContainer;import org.testcontainers.utility.DockerImageName;
import static org.junit.Assert.assertEquals;

@RunWith(SpringRunner.class)@SpringBootTest(classes = DemoApplication.class)public class DemoTests { private static Logger log = LoggerFactory.getLogger(DemoTests.class); @Autowired ProductService productService;
@Before public void before() { log.info("init some data"); } @After public void after(){ log.info("clean some data"); } @Test public void execute() { log.info("your method test Code"); } static { GenericContainer<?> redis = new GenericContainer<>(DockerImageName.parse("redis:5.0.3-alpine")).withExposedPorts(6379); redis.start(); log.info(redis.getHost()); log.info(redis.getMappedPort(6379).toString()); System.setProperty("spring.redis.host", redis.getHost()); System.setProperty("spring.redis.port", redis.getMappedPort(6379).toString()); } @Test public void givenProductCreated_whenGettingProductById_thenProductExistsAndHasSameProperties() { Product product = new Product("1", "Test Product", 10.0); productService.createProduct(product); Product productFromDb = productService.getProduct("1"); assertEquals("1", productFromDb.getId()); assertEquals("Test Product", productFromDb.getName()); assertEquals(10.0, productFromDb.getPrice(),0.001); }}


执行测试用例,全部通过,这样就可以脱离实际环境测试我们的代码,每次也不用因为环境不对而跳过单元测试

4.参考

  • https://springdoc.cn/spring-boot-redis-testcontainers/

  • https://testcontainers.com/

  • http://www.liuhaihua.cn/archives/710568.html

原文作者:HBLOG;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2022-05-04

  • 博文量
    210
  • 访问量
    111762