内容简介:五分钟教程:如何在Docker当中运行平行测试
【51CTO.com快译】如果想在 Docker 中运行平行测试,你可能会引起容器名冲突的错误,下面我们来谈谈如何避免这种错误。当你在CI环境下运行测试时,有时候要运行平行测试。这种平行程序需要使用编译工具,如詹金斯、Gradle或者Maven插件。
如果你在使用Docker作为应用程序的外部测试工具(例如数据库、邮件服务器、FTP服务器),你会发现一个大问题,就是在运行平行测试时,在Docker主机里,所有文件会新建一个相同命名的容器,以至于在你开始第二个平行测试时,你会得到一个关于冲突的容器名失败,因为Docker主机试图启动两个相同命名的容器,或者这两个容器具有相同的绑定端口。
针对这个问题,你可以这样解决:
·你可以用一个Docker主机分别给每个文件做平行测试。
Arquillian Cube是Arquillian的一个扩展,可以用来在你的测试中管理Docker容器。使用Arquillian Cube,你需要在计算机上运行一个Docker保护(可以是本地的或者不是),但大多数是本地的。
Arquillian Cube提供了三种不同的方法来定义容器:
·定义一个容器组成文件
·定义一个容器对象
在下面的事例中,我将向您展示如何使用Docker组成和容器对象DSL。Star运算器可以让你指示Arquillian Cube随机命名Cube,并且可以调整链接。这样一来,在执行平行测试时,就不会因为名称或者绑定端口发生冲突了。
我们来看一个例子:
plugins { id "io.spring.dependency-management" version "1.0.2.RELEASE" } apply plugin: 'java' repositories { mavenCentral() jcenter() } dependencyManagement { imports { mavenBom 'org.jboss.arquillian:arquillian-bom:1.1.13.Final' } } dependencies { testCompile 'junit:junit:4.12' testCompile 'org.jboss.arquillian.junit:arquillian-junit-standalone' testCompile 'org.arquillian.cube:arquillian-cube-docker:1.3.2' } test { maxParallelForks = 2 testLogging.showStandardStreams = true }
#src/test/docker/docker-compose.yml redis*: image: redis:3.0.7 ports: - "6379"
@RunWith(Arquillian.class) public class TestOne { @HostPort(containerName = "redis*", value = 6379) private int portBinding; @Test public void should_print_port_binding() throws InterruptedException { System.out.println(TestOne.class.getCanonicalName() + " - " + portBinding); TimeUnit.SECONDS.sleep(4); } }
你可以看到Docker-组成yml文件从一个典型的Docker-组成文件发生的重要转变,它的名字是以星号(*)或者redis*结束的,这个名字应该是动态生成的。这里有三个测试,我们给大家演示第一个,其他两个也大同小异。
基本上,打印控制台绑定端口连接到服务器。最终建立一个gradle文件,执行两个平行试验,所以如果你在gradle运行测试,你会发现两个测试是同时执行的,当一个完成的时候,另一个也执行完毕了。然后,当你检查输出时,你会看到下一个输出。
org.superbiz.parallel.runner.TestOne STANDARD_OUT CubeDockerConfiguration: serverUri = tcp://192.168.99.100:2376 machineName = dev certPath = /Users/alex/.docker/machine/machines/dev tlsVerify = true dockerServerIp = 192.168.99.100 definitionFormat = COMPOSE clean = false removeVolumes = true dockerContainers = containers: redis_9efae4a8-fcb5-4f9e-9b1d-ab591a5c4d5a: alwaysPull: false image: redis:3.0.7 killContainer: false manual: false portBindings: !!set {56697->6379/tcp: null} readonlyRootfs: false removeVolumes: true networks: {} org.superbiz.parallel.runner.TestThree STANDARD_OUT CubeDockerConfiguration: serverUri = tcp://192.168.99.100:2376 machineName = dev certPath = /Users/alex/.docker/machine/machines/dev tlsVerify = true dockerServerIp = 192.168.99.100 definitionFormat = COMPOSE clean = false removeVolumes = true dockerContainers = containers: redis_88ff4b81-80cc-43b3-8bbe-8638dd731d8e: alwaysPull: false image: redis:3.0.7 killContainer: false manual: false portBindings: !!set {56261->6379/tcp: null} readonlyRootfs: false removeVolumes: true networks: {} //...... org.superbiz.parallel.runner.TestThree > should_print_port_binding STANDARD_OUT org.superbiz.parallel.runner.TestOne - 56261 org.superbiz.parallel.runner.TestOne > should_print_port_binding STANDARD_OUT org.superbiz.parallel.runner.TestOne - 56697 org.superbiz.parallel.runner.TestTwo > should_print_port_binding STANDARD_OUT org.superbiz.parallel.runner.TestOne - 56697
正如你在日志中看到的,容器的名字不是 Redis 或redis*,但是redis后面跟一个UUID。此外你还可以看到,当输出打印时,绑定端口在每个情况下都是不同的。
如果你不想用docker组成的方式,你也可以用DSL容器对象的方法以编程方式定义容器,也可以支持Star运算器。我们来看看这种情况下的事例:
@ClassRule public static ContainerDslRule redisStar = new ContainerDslRule("redis:3.2.6", "redis*") .withPortBinding(6379);
这个使用容器对象的方法是相同的,你需要Arquillian Cube1.4.0来运行它以及容器对象。基于这一特点,你可以运行任何程度的平行测试,因为Arquillian Cube可以照顾到命名和端口绑定问题。请注意,在容器之间链接的情况下,你依然需要运行Star运算器,它将在运行时解决某些问题。了解更多Star运算器请 点击这里 。
原文作者:Alex Soto
刘妮娜译
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- CSS实现平行四边形布局效果
- DevEco Toolkit使用指南--平行视界
- 如果平行宇宙也有编程语言
- 《蜘蛛侠:平行宇宙》的视觉解析与滤镜实现
- 迎战网络攻击者:何必“刚正面”,平行世界见
- 人、攻防与平行仿真:永信至诚的三大核心支柱
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
疯狂科学家大本营
Bei Er Fei Ao Er / 本书翻译组 译、黄晓庆 周宇煜 张为民 审译 / Science Press / 2012-1-5 / 48.00元
美国最棒的创意工场不是贝尔实验室,不是硅谷,也不是麻省理工学院的媒体实验室,而是由五角大楼领导的绝密军事机构DARPA——国防高级研究计划局。DARPA是由美国前总统艾森豪威尔建立的军事部门,创建的目的是为了回应苏联的太空计划。 虽然DARPA属于政府机构,但是没有冷冰 冰的氛围和官僚做派,那里的科学家偏爱牛仔裤和运动鞋。不过他们最爱的还是在各个领域寻找颠覆性创意。从航空航天、IT,到能源领......一起来看看 《疯狂科学家大本营》 这本书的介绍吧!