Docker与自动化测试及其测试实践

<h2>Docker 与自动化测试</h2> <p>对于重复枯燥的手动测试任务,可以考虑将其进行自动化改造。自动化的成本在于自动化程序的编写和维护,而收益在于节省了手动执行用例的时间。简而言之,如果收益大于成本,测试任务就有价值自动化,否则受益的只是测试人员的自动化技能得到了提升。利用 Docker 的快速部署、环境共享等特性,可以大大减少自动化的成本,使很多原本没有价值自动化的测试任务变为了有价值自动化的任务,大大提升了项目效率。</p> <p>那么如果自动化测试已经运行在了虚拟机中,是否有必要使用 Docker 技术将其进行改造?这个就要具体问题具体分析了。笔者并不赞同将所有测试任务一刀切的进行容器化改造。如果当前虚拟机已经满足测试需求,你就需要评估一下引入 Docker 进行改造所需的成本,其中包含学习 Docker 技术所需要的时间成本。反之,如果虚拟机无法满足当前的测试需求,可以考虑尽快引入 Docker 进行改造。</p> <p>&nbsp;</p> <p><img src="https://upload-images.jianshu.io/upload\_images/13139608-6b098f07aceb52b9.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"></p> <h2>Docker 的约束</h2> <p>Build, Ship, and Run Any App, Anywhere. 这是 Docker 公司高调宣称的口号,即在任何平台都可以构建、部署、运行任何应用。然而,由于 Docker 自身的特点,其使用场景有一些约束:</p> <p>(1) 因为容器与主机共享内核,如果容器中应用需要不同的内核版本,就不得不更换主机内核。但如果主机内核变更后又会影响到其它容器的运行。变通的方法是将应用源码的编写与内核特性解耦。</p> <p>(2)Docker 使用时需要 3.10 或以上版本的内核,这是最低的限制。如果你需要使用更高级的 Docker 特性,如 user namespace,那么还需要更高版本的内核。</p> <p>(3) 使用“--privileged”选项后可以在容器内加载或卸载内核模块,但这个操作会影响到主机和其它容器。</p> <p>(4) 无法模拟不同平台的运行环境,例如不能在 x86 系统中启动 arm64 的容器。</p> <p>(5) 因为 Docker 采用了 namespace 的方案来实现隔离,而这种隔离属于软件隔离,安全性不高。不适合安全性高的测试任务。</p> <p>(6) 因为目前没有 time namespace 技术,修改某个容器时间时就不得不影响到主机和其它容器。</p> <h2>适用于 Docker 的测试场景</h2> <p>由于容器与主机共享内核使用,凡是和内核无强相关的测试任务是适合引入 Docker 进行改造的,例如源码编译测试、软件安装测试、互联网应用测试、数据库测试等。而与内核强相关的测试任务是不适合使用 Docker 进行改造的,如内核网络模块测试、内核 namespace 特性测试等。</p> <h2>Docker 测试实践</h2> <p><strong>容器化编译系统测试</strong></p> <p><img src="https://upload-images.jianshu.io/upload\_images/13139608-bebf70fb1ab41504.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"></p> <p>早期我们将 linux 发行版安装到物理机中进行测试。当需要重新进行全量测试时不得不手动还原测试环境。之后改用了虚拟机,虽然能够通过自动化的方式实现环境还原,但虚拟机的损耗较大,效率不高。</p> <p>如果对软件测试、接口测试、自动化测试、性能测试、LR脚本开发、面试经验交流。感兴趣可以175317069,群内会有不定期的发放免费的资料链接,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。</p> <p><img src="https://upload-images.jianshu.io/upload\_images/13139608-89446cdd5edacdff.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"></p> <p>之后我们尝试将环境制作成 Docker 镜像,同时进行了如下的改进:</p> <p>(1) 通过 Docker 的“-v”选项,将主机目录映射到容器中,实现多个容器共享测试代码。测试代码部署时间从 2 分钟减少到 10 秒。</p> <p>(2) 将大粒度的执行时间较长的用例拆分成为若干个小用例。</p> <p>(3) 利用容器并发执行测试。</p> <p>(4) 使用 Dockerfile 梳理产品依赖包和编译软件的安装。</p> <p>编译系统测试是用户态的测试,非常适合使用 Docker 进行加速。如果需要针对某一个 linux 发行版进行测试,可以通过 Docker 快速部署的特点,将所有的资源快速利用起来,从而达到加速测试执行的目的。</p> <p><strong>linux 外围包测试</strong></p> <p><img src="https://upload-images.jianshu.io/upload\_images/13139608-5ac84edd52168ebc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"></p> <p>外围包包含动态链接库文件和常用的命令行工具,属于 linux 操作系统的中间层,其上运行着应用程序,其下由 linux 内核支撑。起初的外围包测试采用串行执行,效率不高。同时受到环境污染的影响,容易产生软件缺陷的误报。在改进方面,我们首先通过 Dockerfile 基于 rootfs 制作一个 Docker 镜像,然后通过 Docker-compose 工具实现测试用例的并发执行。</p> <p><img src="https://upload-images.jianshu.io/upload\_images/13139608-5be7e03f320b153f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"></p> <p>以下是改进前后的对比。</p> <p><img src="https://upload-images.jianshu.io/upload\_images/13139608-053c7cbc93efa5e6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"></p> <h2>通过 Docker 进行测试加速的原理</h2> <p>Docker 本身并不会直接加速测试执行。在串行执行测试时,在容器中执行测试反而会带来约 5% 左右的性能衰减。但我们可以充分利用 Docker 快速部署、环境共享等特性,同时配合容器云来快速提供所需的测试资源,以应对测试任务的峰值。如果忽略环境部署时间,当每个测试用例粒度无限小并且提供的测试资源无限多时,测试执行所需的时间也就无限小。</p>

原文链接:https://my.oschina.net/u/3942476/blog/2981135

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid

Docker与自动化测试及其测试实践 - HelloWorld