天天看點

TestContainer介紹基本使用

在日常開發過程中,經常會用到第三方元件或中間件,如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方法停止容器。

繼續閱讀