Overcast简介
Overcast是一个提供java api管理虚拟机容器的开源项目,可用于集成测试中虚拟机环境搭建,可以支持以下对这些虚拟机进行启停控制:
* Amazon EC2 hosts (Automatic host creation/destroy)
* Vagrant hosts (Set up to the running state, tear down to the initial state)
* VirtualBox hosts (Load snapshot and start, power off)
* Libvirt managed KVM hosts (Fast clones using backing store, provisioning)
* Docker containers
* Tunneled cloud hosts (Reaching target host via ssh tunnel)
使用方式比较简单,maven依赖
<dependency>
<groupId>com.xebialabs.cloud</groupId>
<artifactId>overcast</artifactId>
<version>2.5.1</version>
</dependency>
一个配置了虚拟机信息的overcast.conf文件
rabbitmq {
dockerImage="rabbitmq:3.6.6"
exposeAllPorts=true
remove=true
removeVolume=true
}
加上了上面这个配置文件后,就可以通过下面的api进行虚拟机的启停管理
CloudHost rabbitmq = CloudHostFactory.getCloudHost("rabbitmq");
rabbitmq.setup();
rabbitmq.teardown();
Spring boot应用使用docker搭建测试环境示例
下面列举一个实现rabbitmq收发消息的spring boot应用,使用Overcast搭建测试环境的例子。
由于用到了Rabbitmq,如果要测试收发功能,必须要有Rabbitmq服务器才能测试,使用Overcast在测试时启动提供了Rabbitmq服务的docker容器,自动化搭建环境,非常方便。以下是实现
Rabbitmq发消息的实现代码
@Component
public class AppQueueMessageSender {
@Autowired private RabbitTemplate rabbitTemplate;
public void send(final String message) {
rabbitTemplate.convertAndSend("app.exchange", "app.queue", message);
}
}
Rabbitmq收消息代码
@Component
public class AppQueueMessageListener {
@Autowired private AppMessageRepository repository;
@RabbitListener(
queues = "app.queue",
containerFactory = "rabbitListenerContainerFactory",
admin = "amqpAdmin"
)
public void onMessage(final String message) {
repository.persist(message);
}
}
在 src/test/resources目录下放一个overcast.conf文件,内容为:
rabbitmq {
dockerImage="rabbitmq:3.6.6"
exposeAllPorts=true
remove=true
removeVolume=true
}
写明了使用rabbitmq的docker镜像。然后使用代码进行配置
@Configuration
public class OvercastConfiguration {
// 通过CloudHostFactory获取rabbitmq虚拟机的管理类CloudHost,把它设置为bean,bean初始化时启动,销毁时停止
@Autowired private ConfigurableEnvironment env;
@Bean(initMethod = "setup", destroyMethod = "teardown")
@Qualifier("rabbitmq")
public CloudHost rabbitmq() {
return CloudHostFactory.getCloudHost("rabbitmq");
}
// 把rabbitmq虚拟机的端口,hostName等信息设置到spring boot的rabbitmq属性中,spring boot应用中的rabbitmq收发消息将连接这个docker虚拟机容器中的rabbitmq服务
@PostConstruct
public void init() throws TimeoutException {
final CloudHost rabbitmq = rabbitmq();
final Map<String, Object> properties = new HashMap<>();
properties.put("spring.rabbitmq.host", rabbitmq.getHostName());
properties.put("spring.rabbitmq.port", rabbitmq.getPort(5672));
final PropertySource<?> source = new MapPropertySource("overcast", properties);
env.getPropertySources().addFirst(source);
}
}
最后在spring boot的测试类中加载这个配置类即可
@SpringBootTest(
classes = { OvercastConfiguration.class, AppConfiguration.class },
webEnvironment = WebEnvironment.NONE
)
执行spring boot测试将会搭建起rabbitmq的docker服务器,并连接到这里进行rabbitmq收发消息的测试。
参考文章 https://dzone.com/articles/testing-apps-with-overcast-and-docker