赞
踩
Testcontainers 是一个用于创建临时 Docker 容器进行单元测试的 Java 库。当我们想要避免使用实际服务器进行测试时,它非常有用。,官网介绍称支持50多种组件。
使用MySQL,PostgreSQL或Oracle数据库的容器化实例测试您的数据访问层代码,但无需在开发人员的计算机上进行复杂的设置,并且测试将始终从已知的数据库状态开始,避免“垃圾”数据的干扰。也可以使用任何其他可以容器化的数据库类型。
用于在具有相关性(例如数据库,消息队列或Web服务器)的短期测试模式下运行应用程序。
使用与Selenium兼容的容器化Web浏览器进行自动化UI测试。每个测试都可以获取浏览器的新实例,而无需担心浏览器状态,插件版本或浏览器自动升级。您将获得每个测试会话或测试失败的视频记录。
实验目的:在 Spring Boot 中使用 Testcontainers 测试 Redis。
- <?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>
- 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
- @Data
- public class Product implements Serializable {
- private String id;
- private String name;
- private double price;
-
-
- }
- 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;
-
- @Service
- public 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);
- }
- }
- package com.et.testcontainers.Repository;
-
- import com.et.testcontainers.entity.Product;
- import org.springframework.data.repository.CrudRepository;
- import org.springframework.stereotype.Repository;
-
- @Repository
- public interface ProductRepository extends CrudRepository<Product, String> {
- }
- spring.redis.host=127.0.0.1
- spring.redis.port=6379
- package com.et.testcontainers;
-
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
-
- @SpringBootApplication
- public class DemoApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(DemoApplication.class, args);
- }
- }
以上只是一些关键代码,所有代码请参见下面代码仓库
编写测试类
- 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);
- }
- }
执行测试用例,全部通过,这样就可以脱离实际环境测试我们的代码,每次也不用因为环境不对而跳过单元测试
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。