五分钟教程:如何在Docker当中运行平行测试

栏目: 数据库 · 发布时间: 7年前

内容简介:五分钟教程:如何在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】


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Spark SQL内核剖析

Spark SQL内核剖析

朱锋、张韶全、黄明 / 电子工业出版社 / 2018-8 / 69.00元

Spark SQL 是 Spark 技术体系中较有影响力的应用(Killer application),也是 SQL-on-Hadoop 解决方案 中举足轻重的产品。《Spark SQL内核剖析》由 11 章构成,从源码层面深入介绍 Spark SQL 内部实现机制,以及在实际业务场 景中的开发实践,其中包括 SQL 编译实现、逻辑计划的生成与优化、物理计划的生成与优化、Aggregation 算......一起来看看 《Spark SQL内核剖析》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具