在日常開發過程中,經常會用到第三方元件或中間件,如redis,mq,db等。因為這些第三方元件的引入,測試過程會變得複雜起來。可能換了一個環境之後,因為中間件的缺失,測試用例就跑不起來了。而TestContainer可以通過和docker結合,很友善的在代碼中啟動docker容器,在docker容器中運作這些第三方元件,進而友善進行測試。
基本使用
- 以maven建構的springboot工程為例,引入依賴
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
<version>1.15.3</version>
<scope>test</scope>
</dependency>
- 配置redisTemplate
@Configuration
public class RedisConfiguration {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
}
- 測試
代碼如下:
@SpringBootTest(classes = TestContainer.class)
@RunWith(SpringRunner.class)
public class BasicTests {
@Autowired
private RedisTemplate redisTemplate;
//準備Redis容器,使用withExposedPorts方法暴露端口
@ClassRule
public static GenericContainer redis = new GenericContainer("redis:5.0.5")
.withExposedPorts(6379);
//注意這個注解,要在類加載之前,這樣的話,Spring才能拿到這個配置來裝配Bean(RedisTempalte),不然這個配置沒有意義
@BeforeClass
public static void init() {
//擷取容器的IP位址,如果不加設定的話,就是localhost
System.setProperty("spring.redis.host", redis.getContainerIpAddress());
// 擷取容器映射出來的端口,如果隻有一個,可以使用redis.getFirstMappedPort()
//System.setProperty("spring.redis.port", redis.getFirstMappedPort().toString());
//可以使用另外的方法,明确擷取指定容器端口映射出來的主控端端口,當有多個端口暴露出來的時候,使用這個比較好。
System.setProperty("spring.redis.port", redis.getMappedPort(6379).toString());
}
@Test
public void test() {
redisTemplate.opsForValue().set("k1", "v1");
assert "v1".equals(redisTemplate.opsForValue().get("k1"));
}
@After
public void destory() {
redis.stop();
}
}
在test方法裡打上斷點,開啟debug後(首次運作時需要拉取redis鏡像,速度比較慢),在terminal裡通過
docker ps
檢視目前運作的容器,結果如下:
f61900dca196 redis:5.0.5 "docker-entrypoint.s…" 9 seconds ago Up 8 seconds 0.0.0.0:55007->6379/tcp, :::55007->6379/tcp jovial_payne
972c5233c1c9 testcontainers/ryuk:0.3.1 "/app" 9 seconds ago Up 9 seconds 0.0.0.0:55006->8080/tcp, :::55006->8080/tcp testcontainers-ryuk-8cca32a4-0d78-4c9f-a3
說明redis 容器正在運作。調試結束後,程式通過destory方法停止容器。