大型的软件工程项目除了大量的产品级代码外必不可少的还有大量的自动化测试。自动化测试包含从前端到后端甚至到产品线上不一样模块和环境的各类类型的测试。一个比较经典的关于自动化测试分布的理论就是测试金字塔,是说在一个正常的项目中合理的测试数量应该是单元测试 > 组件测试 > 集成测试 > 端到端测试(系统测试)> 人工验证测试。这个理论大致上是合理的,由于从测试代码的复杂度和执行时间看单元测试 < 组件测试 < 集成测试 < 端到端测试(系统测试)< 人工验证测试,因此咱们理所固然应该分配更多的时间和精力到容易理解和执行快速的测试中去,好比单元测试。固然关于这些测试分类和界定的见解众说纷纭,好比组件测试和集成测试,有时甚至是端到端测试,都一律被称为集成测试,由于它们在不一样的系统层面试图去测试两个模块或者系统间的集成情况。
前端
最经典的集成测试的例子应该是后端系统应用层和数据层之间的集成测试了吧。数据层能够是传统的数据库,也能够是Kafka Stream这样的新宠。一般这种集成测试有几种思路:
git
受益于Docker的普及化,testcontainers提供了另一种更为友好的集成测试解决方案。简单地讲就是在测试环境中动态建立须要的依赖服务的容器,好比动态建立一个Mongo 3.6的容器、建立一个RabbitMQ 最新发布版的容器,而后在测试中配置测试环境让测试应用使用建立好的容器暴露的可调用地址,测试结束后把使用过的容器销毁防止依赖服务状态迁移致使其余的测试莫名地挂掉。
github
这种解决方案有如下几个优势:
面试
固然,它也有几个劣势:
redis
从编程语言支持度来讲,目前testcotainers的github org上提供了Java, Scala, Go, Rust, NodeJs, Python, C#的类库。从成熟度来讲确定是Java的类库最为成熟,已被很多开源项目使用。其余语言的类库能够想象不可避免会有些坑须要踩。
举一个官网的例子来讲明如何使用testcontainers类库:docker
public class RedisBackedCacheIntTest {
private RedisBackedCache underTest;
// rule {
@Rule
public GenericContainer redis = new GenericContainer<>("redis:5.0.3-alpine")
.withExposedPorts(6379);
// }
@Before
public void setUp() {
String address = redis.getContainerIpAddress();
Integer port = redis.getFirstMappedPort();
// Now we have an address and port for Redis, no matter where it is running
underTest = new RedisBackedCache(address, port);
}
@Test
public void testSimplePutAndGet() {
underTest.put("test", "example");
String retrieved = underTest.get("test");
assertEquals("example", retrieved);
}
}复制代码
上面的JUnit测试中动态建立了一个redis:5.0.3-alphine容器,在setUp方法里获取该容器的公开地址和接口从而建立咱们要测试的RedisBackedCache实例,而后在测试里轻轻松地调用该实例的方法、验证结果。
testcontainers Java 提供了几个现成的使用频率较高的容器的类封装,好比大部分数据库(MySQL, Postgres, Cassandra, Neo4j), UI测试的Webdriver,ElasticSearch,Kafka, Nginx等等。若是你没找到现成的封装,你老是能够调用更底层的`GenericContainer`。它也支持主流的Java测试框架,JUnit4, JUnit 5, TestNG,Spock。总的来讲对于写Java的同窗这个类库使用起来仍是很是爽的!
看了这么多,你是否是也心动了呢?! 那就快快行动起来吧,常言道:会哭的孩子有奶吃,会写测试的开发有饭吃!
数据库
2019.4.14
编程
本文原载于: 【技术博客】基于testcontainers的现代化集成测试进阶之路
后端
----------------------------------------------------------------------------------------bash