Spring Boot集成testcontainers快速入门Demo

Spring Boot集成testcontainers快速入门Demo

码农世界 2024-05-26 前端 89 次浏览 0个评论

1.什么是testcontainers?

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

 

应用场景

数据访问层集成测试:

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

应用程序集成测试:

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

UI /验收测试:

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

2.代码工程

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

pom.xml



    
        springboot-demo
        com.et
        1.0-SNAPSHOT
    
    4.0.0
    testcontainers
    
        8
        8
    
    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.boot
            spring-boot-autoconfigure
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
            org.springframework.boot
            spring-boot-starter-data-redis
        
        
            org.testcontainers
            testcontainers
            1.17.2
            test
        
        
            org.projectlombok
            lombok
        
    

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
@Data
public 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;
@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);
    }
}

Repository

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 {
}

appliication.properties

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);
   }
}

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

代码仓库

  • GitHub - Harries/springboot-demo: a simple springboot demo with some components for example: redis,solr,rockmq and so on.

    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.参考

    • 使用 Testcontainers 测试 Redis - spring 中文网
    • Testcontainers
    • Spring Boot集成testcontainers快速入门Demo | Harries Blog™

转载请注明来自码农世界,本文标题:《Spring Boot集成testcontainers快速入门Demo》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,89人围观)参与讨论

还没有评论,来说两句吧...

Top