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 testcontainers8 8 org.springframework.boot spring-boot-starter-weborg.springframework.boot spring-boot-autoconfigureorg.springframework.boot spring-boot-starter-testtest org.springframework.boot spring-boot-starter-data-redisorg.testcontainers testcontainers1.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™
还没有评论,来说两句吧...