阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

175次阅读
没有评论

共计 4625 个字符,预计需要花费 12 分钟才能阅读完成。

如果想在 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,并且可以调整链接。这样一来,在执行平行测试时,就不会因为名称或者绑定端口发生冲突了。

我们来看一个例子:

  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.  
  8.    @Test 
  9.     public void should_print_port_binding() throws InterruptedException { 
  10.         System.out.println(TestOne.class.getCanonicalName() + ” – “ + portBinding); 
  11.         TimeUnit.SECONDS.sleep(4); 
  12.     } 
  13.  

你可以看到 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 运算器,它将在运行时解决某些问题。了解更多 Star 运算器请点击这里。

原文作者:Alex Soto
原文标题:Running Parallel Tests in Docker

更多 Docker 相关教程见以下内容

Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm

Ubuntu 14.04 安装 Docker  http://www.linuxidc.com/linux/2014-08/105656.htm

Ubuntu 15.04 下安装 Docker  http://www.linuxidc.com/Linux/2015-07/120444.htm

Docker 安装实例 http://www.linuxidc.com/Linux/2017-04/142666.htm

Docker 创建基础镜像  http://www.linuxidc.com/Linux/2017-05/144112.htm

在 Ubuntu 15.04 上如何安装 Docker 及基本用法 http://www.linuxidc.com/Linux/2015-09/122885.htm

Ubuntu 16.04 上 Docker 使用手记 http://www.linuxidc.com/Linux/2016-12/138490.htm

使用 Docker 分分钟启动常用应用  http://www.linuxidc.com/Linux/2017-04/142649.htm

Ubuntu 16.04 下 Docker 修改配置文件不生效解决办法  http://www.linuxidc.com/Linux/2017-05/143862.htm 

Docker 的详细介绍:请点这里
Docker 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-06/144635.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计4625字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中