如何在Docker中运行平行测试快速入门教程

如果想在Docker中运行平行测试,你可能会引起容器名冲突的错误,下面我们来谈谈如何避免这种错误。当你在CI环境下运行测试时,有时候要运行平行测试。这种平行程序需要使用编译工具,如詹金斯、Gradle或者Maven插件。

如果你在使用Docker作为应用程序的外部测试工具(例如数据库、邮件服务器、FTP服务器),你会发现一个大问题,就是在运行平行测试时,在Docker主机里,所有文件会新建一个相同命名的容器,以至于在你开始第二个平行测试时,你会得到一个关于冲突的容器名失败,因为Docker主机试图启动两个相同命名的容器,或者这两个容器具有相同的绑定端口。

如何在Docker中运行平行测试快速入门教程


针对这个问题,你可以这样解决:

·你可以用一个Docker主机分别给每个文件做平行测试。
·你可以重复使用相同的Docker主机并且使用Arquillian Cube Star运算器。


Arquillian Cube是Arquillian的一个扩展,可以用来在你的测试中管理Docker容器。使用Arquillian Cube,你需要在计算机上运行一个Docker保护(可以是本地的或者不是),但大多数是本地的。

Arquillian Cube提供了三种不同的方法来定义容器:

·定义一个容器组成文件
·定义一个容器对象
·使用容器对象DSL


在下面的事例中,我将向您展示如何使用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 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b8a5527e025625e8d1d9afb1bab0ead9.html