zl程序教程

您现在的位置是:首页 >  工具

当前栏目

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

Docker测试教程 如何 运行 当中 五分钟 平行
2023-09-27 14:21:44 时间

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

我们来看一个例子:


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运算器,它将在运行时解决某些问题。

作者:刘妮娜译 来源:51CTO
浩若烟海事半功倍|利用Docker容器技术构建自动化分布式web测试集群Selenium Grid “世界上有那么多城市,城市里有那么多的酒馆,可她,却偏偏走进了我的.....”,这是电影《卡萨布拉卡》中的一句著名独白,投射到现实生活中,与之类似的情况不胜枚举,这世界上有那么多的系统,系统中有那么多的浏览器,在只有一台测试机的前提下,难道我们只能排队一个一个地做兼容性测试吗?有没有效率更高的方法呢?为此我们提出一个更高效的解决方案:使用Docker+Selenium Grid。
测试必会 | 通过容器化 Python Web 应用掌握 Docker 容器核心技能 - 当多个窗口同时 attach 到同一个容器时,所有的窗口都会同步的显示,假如其中的一个窗口发生阻塞时,其它的窗口也会阻塞。 - attach 必须是登陆到一个已经运行的容器里,如果从这个容器中 exit 退出的话,会导致容器停止。 - 容器里进程新建的文件,怎么才能让宿主机获取到? - 宿主机上的文件和目录,怎么才能让容器里的进程访问到? - CONTAINER ID:容器 ID,唯一标识容
在 Dokcer 横空出世之前,应用打包一直是大部分研发团队的痛点。在工作中,面对多种服务,多个服务器,以及多种环境,如果还继续用传统的方式打包部署,会浪费大量时间精力。 在 Docker 出现后,它以更高效的利用系统资源、更高效的利用系统资源、一致的运行环境、持续交付和部署、更轻松的迁移、更轻松的维护和拓展,6 大优点迅速火了起来。 Docker 的基础命令,堪称 Docker 的内功,
使用docker快速搭建xssPlatform测试平台实践 笔者之前给一些开发团队多次做Web安全开发培训,为了让培训的学员能够理解XSS原理和XSS的危害,将xssPlatform进行了更新,之前一直放在GitHub中;发现关注的人越来越多,很多人在安装的过程中遇到问题不知道怎么处理,为了简化安装步骤,笔者将xssPlatform封装到了docker镜像当中,同时编写了一套安装文档,希望到时候给学员和读者参考。