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

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

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

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

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

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

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

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

在下面的事例中,我将向您展示如何使用Docker组成和容器对象DSL。Star运算器可以让你指示Arquillian Cube随机命名Cube,并且可以调整链接。这样一来,在执行平行测试时,就不会因为名称或者绑定端口发生冲突了。

我们来看一个例子:


  1. plugins { 
  2.     id "io.spring.dependency-management" version "1.0.2.RELEASE" 
  3.  
  4.  
  5. apply plugin: 'java' 
  6.  
  7. repositories { 
  8.     mavenCentral() 
  9.     jcenter()  
  10.  
  11. dependencyManagement { 
  12.     imports { 
  13.         mavenBom 'org.jboss.arquillian:arquillian-bom:1.1.13.Final'  
  14.     } 
  15.  
  16. dependencies { 
  17.  
  18.     testCompile 'junit:junit:4.12' 
  19.     testCompile 'org.jboss.arquillian.junit:arquillian-junit-standalone' 
  20.     testCompile 'org.arquillian.cube:arquillian-cube-docker:1.3.2' 
  21.  
  22. test { 
  23.     maxParallelForks = 2 
  24.     testLogging.showStandardStreams = true 

  1. #src/test/docker/docker-compose.yml 
  2.  
  3. redis*: 
  4.   image: redis:3.0.7 
  5.   ports: 
  6.     - "6379" 

  1. @RunWith(Arquillian.class) 
  2. public class TestOne { 
  3.  
  4.     @HostPort(containerName = "redis*", value = 6379) 
  5.     private int portBinding; 
  6.   
  7.    @Test 
  8.     public void should_print_port_binding() throws InterruptedException { 
  9.         System.out.println(TestOne.class.getCanonicalName() + " - " + portBinding); 
  10.         TimeUnit.SECONDS.sleep(4); 
  11.     } 
  12.  

你可以看到Docker-组成yml文件从一个典型的Docker-组成文件发生的重要转变,它的名字是以星号(*)或者redis*结束的,这个名字应该是动态生成的。这里有三个测试,我们给大家演示第一个,其他两个也大同小异。

基本上,打印控制台绑定端口连接到服务器。最终建立一个gradle文件,执行两个平行试验,所以如果你在gradle运行测试,你会发现两个测试是同时执行的,当一个完成的时候,另一个也执行完毕了。然后,当你检查输出时,你会看到下一个输出。


  1. org.superbiz.parallel.runner.TestOne STANDARD_OUT 
  2.     CubeDockerConfiguration: 
  3.       serverUri = tcp://192.168.99.100:2376 
  4.       machineName = dev 
  5.       certPath = /Users/alex/.docker/machine/machines/dev 
  6.       tlsVerify = true 
  7.       dockerServerIp = 192.168.99.100 
  8.       definitionFormat = COMPOSE 
  9.       clean = false 
  10.       removeVolumes = true 
  11.       dockerContainers = containers: 
  12.       redis_9efae4a8-fcb5-4f9e-9b1d-ab591a5c4d5a: 
  13.         alwaysPull: false 
  14.         image: redis:3.0.7 
  15.         killContainer: false 
  16.         manual: false 
  17.         portBindings: !!set {56697->6379/tcp: null} 
  18.         readonlyRootfs: false 
  19.         removeVolumes: true 
  20.     networks: {} 
  21.  
  22.  
  23.  
  24. org.superbiz.parallel.runner.TestThree STANDARD_OUT 
  25.     CubeDockerConfiguration: 
  26.       serverUri = tcp://192.168.99.100:2376 
  27.       machineName = dev 
  28.       certPath = /Users/alex/.docker/machine/machines/dev 
  29.       tlsVerify = true 
  30.       dockerServerIp = 192.168.99.100 
  31.       definitionFormat = COMPOSE 
  32.       clean = false 
  33.       removeVolumes = true 
  34.       dockerContainers = containers: 
  35.       redis_88ff4b81-80cc-43b3-8bbe-8638dd731d8e: 
  36.         alwaysPull: false 
  37.         image: redis:3.0.7 
  38.         killContainer: false 
  39.         manual: false 
  40.         portBindings: !!set {56261->6379/tcp: null} 
  41.         readonlyRootfs: false 
  42.         removeVolumes: true 
  43.     networks: {} 
  44.  
  45.     //...... 
  46.  
  47. org.superbiz.parallel.runner.TestThree > should_print_port_binding STANDARD_OUT 
  48.    org.superbiz.parallel.runner.TestOne - 56261 
  49.  
  50. org.superbiz.parallel.runner.TestOne > should_print_port_binding STANDARD_OUT 
  51.   org.superbiz.parallel.runner.TestOne - 56697 
  52.  
  53. org.superbiz.parallel.runner.TestTwo > should_print_port_binding STANDARD_OUT 
  54. org.superbiz.parallel.runner.TestOne - 56697 

正如你在日志中看到的,容器的名字不是Redis或redis*,但是redis后面跟一个UUID。此外你还可以看到,当输出打印时,绑定端口在每个情况下都是不同的。
如果你不想用docker组成的方式,你也可以用DSL容器对象的方法以编程方式定义容器,也可以支持Star运算器。我们来看看这种情况下的事例:


  1. @ClassRule 
  2. public static ContainerDslRule redisStar =  
  3.   new ContainerDslRule("redis:3.2.6", "redis*") 
  4.   .withPortBinding(6379); 

这个使用容器对象的方法是相同的,你需要Arquillian Cube1.4.0来运行它以及容器对象。基于这一特点,你可以运行任何程度的平行测试,因为Arquillian Cube可以照顾到命名和端口绑定问题。请注意,在容器之间链接的情况下,你依然需要运行Star运算器,它将在运行时解决某些问题。

作者:刘妮娜译

来源:51CTO

时间: 2024-09-27 19:36:01

五分钟教程:如何在Docker当中运行平行测试的相关文章

五分钟教程帮你立刻掌握蒙版的基础运用

  一看就懂,而且每个类型都附上了案例图,绝对是小白入门最合适不过的读物了. 蒙版就是控制调整的工具 蒙版,听起来似乎是一个很专业的词汇,其实理解它十分简单. 例如我们把一张图片的饱和度降至最低时画面会变成黑白. 但是我们希望画面中间依旧有色彩,只是画面的边缘变成黑白. 这时候怎么处理呢? 我们只需要让我们的调整应用到部分图像就行了. 这时候我们就需要一个工具来控制哪一部分图像应用调整,哪一部分图像不应用调整,这个工具就是蒙版. 在PS里面是用纯黑色表示不应用调整,纯白色表示应用调整,灰色表示部

如何在Docker容器中运行GUI程序

如何在Docker容器中运行GUI程序 各位,今天我们将学习如何在Docker之中运行GUI程序.我们可以轻易地在Docker容器中运行大多数GUI程序且不出错.Docker是一个开源项目,提供了一个打包.分发和运行任意程序的轻量级容器的开放平台.它没有语言支持.框架或者打包系统的限制,并可以运行在任何地方.任何时候,从小型的家用电脑到高端的服务器都可以运行.这让人们可以打包不同的包用于部署和扩展网络应用,数据库和后端服务而不必依赖于特定的栈或者提供商. 下面是我们该如何在Docker容器中运行

在Docker中运行SQLServer ASP.NET应用

的文章在阿里云上运行ASP.NET Docker应用一文和大家探讨了如何在Docker中运行ASP.NET应用.本文是上一篇文章的续篇,讨论如何让应用访问SQLServer数据库. 创建SQLServer数据库 我们首先在阿里云上开通一个SQLServer服务器实例,创建用户user1. 创建一个名为Blog的数据库,并授权user1能够访问数据库.为数据库开通外网访问,获得数据库外网访问地址. 所有这些操作都能够在控制台完成,如果你想进入SQLServer的控制台,可以点击上图的登录数据库进入

如何在Excel五分钟校对学生考试成绩

  老师们经常用Excel制作学习考试成绩统计表,在数据录入中难免会出错,只好对对学生考试成绩进行加班校对.其实不必这么辛苦,只需要用到Excel强大的计算能力,五分钟就能将所有学生的成绩校对完毕,让辛勤教师们有更多的时间休息.下面是Excel五分钟校对学生考试成绩 范文. Step1:添加学生校对成绩栏 打开学生成绩表所在的Excel文件,根据教育部门有关规定,所有学生成绩必须要经过录入和审核两道程序,因此这里采用两次录入法进行校对.在"语文"成绩所在列B后插入一列,将其名称更改为&

如何在 Docker 容器中运行 Kali Linux 2.0

介绍 Kali Linux 是一个对于安全测试人员和白帽的一个知名操作系统.它带有大量安全相关的程序,这让它很容易用于渗透测试.最近,Kali Linux 2.0 发布了,它被认为是这个操作系统最重要的一次发布.另一方面,Docker 技术由于它的可扩展性和易用性让它变得很流行.Dokcer 让你非常容易地将你的程序带给你的用户.好消息是你可以通过 Docker 运行Kali Linux 了,让我们看看该怎么做 :) 在 Docker 中运行 Kali Linux 2.0 相关提示 如果你还没有

在Docker上运行.NET Core

本文讲的是在Docker上运行.NET Core,[编者的话]本文为Jurgis Pasukonis在medium.com博客中发布的关于在Docker上运行.NET Core的文章,介绍了目前.NET Core在Docker上的开源情况及部分演示.Jurgis目前是TRAFI公司的CTO. 对于Microsoft和.NET来说,这是一个新的时代,然而这并不是言过其实的.如果你之前没有追随过这些消息,那么下面是一些发生在去年与此有关的事情: .NET框架和C#语言已经被开源并且可以在GitHub

教你五分钟打造一个文字时空洞

  新手教程,教你五分钟打造一个文字时空洞!本教程为翻译+改造,原作者是个外国人,已经不记得是谁了,有知道的欢迎补充.本教程然将教你如何创作一个富有空间感的字体图案. 分类: PS文字教程

PS五分钟绘制一张半调效果的耐克体育海报

  今天@ATOM设计 来一个超容易上手的教程,五分钟可以绘制出耐克风格的运动海报,过程特别详细,零基础也可以快速搞定,适合没经验+临时要加急做海报的同学,素材和模版也都准备好了,来学一个! 原图效果: 一.前期准备 1.寻找一张分辨率很高尺寸很大的图片,我参照原图找了个比较有动感的图片. 2.新建一个文档,看心情定尺寸,置入图片. 3.抠图,只抠出人物,边缘最好不要太生硬,会影响后期效果,可以新建一个纯色图层在人物图层下面,设置红色或其他颜色,检查边缘扣得怎么样(我扣的不是很细致,不能学我,我

如何在Docker中使用Open vSwitch

Open vSwitch是一个虚拟交换软件,主要用于虚拟机VM环境,提供网络的虚拟化.本篇文档重点介绍如何在Docker中使用Open vSwitch. 这个文档描述了如何在Docker(大于或等于1.9.0版本)中使用Open vSwitch.我们假设你已经安装好了Open vSwitch和Docker.请没有安装好的读者可以根据INSTALL.md和www.docker.com的说明来进行安装. Docker 1.9.0开始支持多主机网络(multi-host networking).我们可