当前位置: 首页 > 科技观察

5分钟教程:如何在Docker中运行并行测试_0

时间:2023-03-12 19:23:45 科技观察

【.com快译】如果要在Docker中运行并行测试,可能会导致容器名称冲突错误。让我们谈谈如何避免这个错误。当您在CI环境中运行测试时,有时您希望运行并行测试。此类并行程序需要使用Jenkins、Gradle或Maven插件等编译工具。如果你正在使用Docker作为应用程序(如数据库、邮件服务器、FTP服务器)的外部测试工具,你会发现一个很大的问题是在运行并行测试时,所有文件都会在中创建一个同名的新文件Docker主机。container这样当你开始第二个并行测试时,你会因为容器名称冲突而失败,因为Docker主机正在尝试启动两个同名容器,或者这两个容器具有相同的绑定端口。要解决这个问题,你可以这样解决:你可以使用一个Docker主机来并行测试每个文件。·您可以重复使用相同的Docker主机并使用ArquillianCubeStarComputer。ArquillianCube是Arquillian的扩展,可用于管理测试中的Docker容器。要使用ArquillianCube,您需要在您的计算机上运行Docker保护(它可以是本地的也可以不是),但大多数是本地的。ArquillianCube提供了三种不同的方式来定义容器:定义容器组合文件定义容器对象使用容器对象DSL在下面的例子中,我将向您展示如何使用Docker组合和容器对象DSL。Star组件允许您指示ArquillianCube随机命名Cube并调整链接。这样,在运行并行测试时,不会因名称或绑定端口而发生冲突。我们来看一个例子:plugins{id"io.spring.dependency-management"version"1.0.2.RELEASE"}applyplugin:'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=2testLogging.showStandardStreams=true}#src/test/docker/docker-compose.ymlredis*:image:redis:3.0.7ports:-"6379"@RunWith(Arquillian.class)publicclassTestOne{@HostPort(containerName="redis*",value=6379)privateintportBinding;@Testpublicvoidshould_print_port_binding()throwsInterruptedException{System.out.println(TestOne.class.getCanonicalName()+"-"+portBinding);TimeUnit。SECONDS.sleep(4);可以看到docker-compositionyml文件与典型的以星号(*)或redis*结尾的docker-composition文件相比有了显着变化,这应该是动态生成的。这里一共有三个测试,我们给大家看第一个,其他两个类似。基本上,打印控制台将端口绑定到服务器。最后创建一个执行两个并行测试的gradle文件,所以如果你在gradle中运行测试,你会发现两个测试是同时执行的,当一个完成时,另一个也被执行。然后,当您检查输出时,您会看到下一个输出。org.superbiz.parallel.runner.TestOneSTANDARD_OUTCubeDockerConfiguration:serverUri=tcp://192.168.99.100:2376machineName=devcertPath=/Users/alex/.docker/machine/machines/devtlsVerify=truedockerServerIp=192.168.99.100definitionFormat=COMPOSEreumeVerock=falsecertPath=/Users/alex/.docker/machine/机器/devtlsVerify=truedockerServerIp=containers:redis_9efae4a8-fcb5-4f9e-9b1d-ab591a5c4d5a:alwaysPull:falseimage:redis:3.0.7killContainer:falsemanual:falseportBindings:!!set{56697->6379/tcp:null}readonlyRootfs:falseremoveVolumes:truenetworks:{}org.superbiz.parallel.runner.TestThreeSTANDARD_OUTCubeDockerConfiguration:serverUri=tcp://192.168.99.100:2376machineName=devcertPath=/Users/alex/.docker/machine/machines/devtlsVerify=truedockerServerIp=192.168.99.100definitionFormat=COMPOSEVolveolumeclean=falserereme的定义:redis_88ff4b81-80cc-43b3-8bbe-8638dd731d8e:alwaysPull:falseimage:redis:3.0.7killContainer:falsemanual:falseportBindings:!!set{56261->6379/tcp:null}readonlyRootfs:falseremoveVolumes:truenetworks:{}//......org.superbiz.parallel.runner.TestThree>should_print_port_bindingSTANDARD_OUTorg.superbiz.parallel.runner.TestOne-56261org.superbiz.parallel.runner.TestOne>should_print_port_bindingSTANDARD_OUTorg.superbiz。parallel.runner.TestOne-56697org.superbiz.parallel.runner.TestTwo>should_print_port_bindingSTANDARD_OUTorg.superbiz.parallel.runner.TestOne-56697从日志中可以看到,容器的名称不是Redis或者redis*,而是redis后面跟着一个UUID另外可以看到打印输出的时候,绑定的端口在每一种情况下都是不一样的。如果不想使用docker方法,也可以使用DSL容器对象的方法,以编程方式定义容器,同样支持Star操作符。让我们看一下这种情况下的一个例子:@ClassRulepublicstaticContainerDslRuleredisStar=newContainerDslRule("redis:3.2.6","re??dis*").withPortBinding(6379);容器对象的使用方法是一样的,需要ArquillianCube1。4.0与容器对象一起运行。基于这个特性,你可以运行任何程度的并行测试,因为ArquillianCube可以处理命名和端口绑定问题。注意,在容器之间有链接的情况下,仍然需要运行Star组件,这会在运行时解决一定的问题。要了解有关Star计算器的更多信息,请单击此处。原作者:AlexSoto原标题:RunningParallelTestsinDocker刘妮娜译