Docker与自动化测试及其测试实践
Docker 与自动化测试
对于重复枯燥的手动测试任务,可以考虑将其进行自动化改造。自动化的成本在于自动化程序的编写和维护,而收益在于节省了手动执行用例的时间。简而言之,如果收益大于成本,测试任务就有价值自动化,否则受益的只是测试人员的自动化技能得到了提升。利用 Docker 的快速部署、环境共享等特性,可以大大减少自动化的成本,使很多原本没有价值自动化的测试任务变为了有价值自动化的任务,大大提升了项目效率。
那么如果自动化测试已经运行在了虚拟机中,是否有必要使用 Docker 技术将其进行改造?这个就要具体问题具体分析了。笔者并不赞同将所有测试任务一刀切的进行容器化改造。如果当前虚拟机已经满足测试需求,你就需要评估一下引入 Docker 进行改造所需的成本,其中包含学习 Docker 技术所需要的时间成本。反之,如果虚拟机无法满足当前的测试需求,可以考虑尽快引入 Docker 进行改造。

Docker 的约束
Build, Ship, and Run Any App, Anywhere. 这是 Docker 公司高调宣称的口号,即在任何平台都可以构建、部署、运行任何应用。然而,由于 Docker 自身的特点,其使用场景有一些约束:
(1) 因为容器与主机共享内核,如果容器中应用需要不同的内核版本,就不得不更换主机内核。但如果主机内核变更后又会影响到其它容器的运行。变通的方法是将应用源码的编写与内核特性解耦。
(2)Docker 使用时需要 3.10 或以上版本的内核,这是最低的限制。如果你需要使用更高级的 Docker 特性,如 user namespace,那么还需要更高版本的内核。
(3) 使用“--privileged”选项后可以在容器内加载或卸载内核模块,但这个操作会影响到主机和其它容器。
(4) 无法模拟不同平台的运行环境,例如不能在 x86 系统中启动 arm64 的容器。
(5) 因为 Docker 采用了 namespace 的方案来实现隔离,而这种隔离属于软件隔离,安全性不高。不适合安全性高的测试任务。
(6) 因为目前没有 time namespace 技术,修改某个容器时间时就不得不影响到主机和其它容器。
适用于 Docker 的测试场景
由于容器与主机共享内核使用,凡是和内核无强相关的测试任务是适合引入 Docker 进行改造的,例如源码编译测试、软件安装测试、互联网应用测试、数据库测试等。而与内核强相关的测试任务是不适合使用 Docker 进行改造的,如内核网络模块测试、内核 namespace 特性测试等。
Docker 测试实践
容器化编译系统测试

早期我们将 linux 发行版安装到物理机中进行测试。当需要重新进行全量测试时不得不手动还原测试环境。之后改用了虚拟机,虽然能够通过自动化的方式实现环境还原,但虚拟机的损耗较大,效率不高。
如果对软件测试、接口测试、自动化测试、性能测试、LR脚本开发、面试经验交流。感兴趣可以175317069,群内会有不定期的发放免费的资料链接,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。

之后我们尝试将环境制作成 Docker 镜像,同时进行了如下的改进:
(1) 通过 Docker 的“-v”选项,将主机目录映射到容器中,实现多个容器共享测试代码。测试代码部署时间从 2 分钟减少到 10 秒。
(2) 将大粒度的执行时间较长的用例拆分成为若干个小用例。
(3) 利用容器并发执行测试。
(4) 使用 Dockerfile 梳理产品依赖包和编译软件的安装。
编译系统测试是用户态的测试,非常适合使用 Docker 进行加速。如果需要针对某一个 linux 发行版进行测试,可以通过 Docker 快速部署的特点,将所有的资源快速利用起来,从而达到加速测试执行的目的。
linux 外围包测试

外围包包含动态链接库文件和常用的命令行工具,属于 linux 操作系统的中间层,其上运行着应用程序,其下由 linux 内核支撑。起初的外围包测试采用串行执行,效率不高。同时受到环境污染的影响,容易产生软件缺陷的误报。在改进方面,我们首先通过 Dockerfile 基于 rootfs 制作一个 Docker 镜像,然后通过 Docker-compose 工具实现测试用例的并发执行。

以下是改进前后的对比。

通过 Docker 进行测试加速的原理
Docker 本身并不会直接加速测试执行。在串行执行测试时,在容器中执行测试反而会带来约 5% 左右的性能衰减。但我们可以充分利用 Docker 快速部署、环境共享等特性,同时配合容器云来快速提供所需的测试资源,以应对测试任务的峰值。如果忽略环境部署时间,当每个测试用例粒度无限小并且提供的测试资源无限多时,测试执行所需的时间也就无限小。
原文链接:https://my.oschina.net/u/3942476/blog/2981135
Docker与自动化测试及其测试实践的更多相关文章
- 【实战】Docker入门实践二:Docker服务基本操作 和 测试Hello World
操作环境 操作系统:CentOS7.2 内存:1GB CPU:2核 Docker服务常用命令 docker服务操作命令如下 service docker start #启动服务 service doc ...
- 基于 Docker 的微服务架构实践
本文来自作者 未闻 在 GitChat 分享的{基于 Docker 的微服务架构实践} 前言 基于 Docker 的容器技术是在2015年的时候开始接触的,两年多的时间,作为一名 Docker 的 D ...
- Docker容器的原理与实践 (下)
欢迎访问网易云社区,了解更多网易技术产品运营经验. Docker原理分析 Docker架构 镜像原理 镜像是一个只读的容器模板,含有启动docker容器所需的文件系统结构及内容Docker以镜像和在镜 ...
- Appium+python自动化(三十八) - Appium自动化测试框架综合实践 - 框架简介-助你冲击高薪,迎娶白富美(超详解)
简介 好久没有更新博客了,博友们是不是有点等不及了.不好意思啊,中秋节过后太忙了,这篇是好不容易抽点零碎时间写的.从这一篇开始小伙伴或者童鞋们,就跟随宏哥的脚步,一步步的从无到有,从0到1的搭建一个完 ...
- Appium+python自动化(三十九)-Appium自动化测试框架综合实践 - 代码实现(超详解)
简介 经过一段时间的准备,完善的差不多了,继续分享有关Appium自动化测试框架综合实践.想必小伙伴们有点等不及了吧! driver配置封装 kyb_caps.yaml 配置表 参考代码 platfo ...
- Appium+python自动化(四十一)-Appium自动化测试框架综合实践 - 即将落下帷幕(超详解)
1.简介 今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现.到今天为止,大功即将告成:框架所需要的代码实现都基本完成. 2.data数据封装 2.1使用背景 在实际项目过程 ...
- Appium+python自动化(四十二)-Appium自动化测试框架综合实践- 寿终正寝完结篇(超详解)
1.简介 按照上一篇的计划,今天给小伙伴们分享执行测试用例,生成测试报告,以及自动化平台.今天这篇分享讲解完.Appium自动化测试框架就要告一段落了. 2.执行测试用例&报告生成 测试报告, ...
- 9-MySQL DBA笔记-测试实践
第9章 测试实践 在第8章中介绍了测试所需要的理论知识,本章将为读者讲述实际的测试过程.实际测试一般包括硬件测试.MySQL基准测试及应用服务压力测试,下面将分别讲述这三方面的内容.此外,测试工具的选 ...
- [转帖]Docker从入门到动手实践
Docker从入门到动手实践 https://www.cnblogs.com/nsky/p/10853194.html dockerfile的图很好呢. 但是自己没有做实验 , 其实知识都挺好. do ...
随机推荐
- 下载xftp,xshell进行与linux端的远程操作
在window下下载xftp5和xshell5 xshell主要是对远程的及其进行访问,在远程的情况下进行操作 xftp可以对远程的机器进行文件传输. 我安装这两个是单个的安装的. 进入官网 http ...
- 51、自定义View基础和原理
一.编写自己的自定义View最简单的自定义View,继承View通过覆盖View的onDraw方法来实现自主显示利用Canvas和paint来绘制显示元素(文字,几何图形等) <com.myvi ...
- python中的self
1.首先明确的是self只有在类的方法中才会有,独立的函数或方法是不必带有self的.self在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数. self名称不是必须的,在python中se ...
- 记录--常用的linux命令
mysql event /*查询event是否开启(查询结果Off为关闭 On为开启)*/ show variables like '%sche%'; /*开启/关闭命令(1开启--0关闭)*/ se ...
- 微信公众号非善意访问的限制 php curl 伪造UA
w <?php if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') === false) { echo 'www123'; } d ...
- REST Representational state transfer REST Resource Naming Guide Never use CRUD function names in URIs
怎样用通俗的语言解释什么叫 REST,以及什么是 RESTful? - 知乎 https://www.zhihu.com/question/28557115 大家都知道"古代"网 ...
- Linux基础命令(二)
作业一:1) 新建用户natasha,uid为1000,gid为555,备注信息为“master” groupadd -g 555 netasha useradd -u 1000 -g netasha ...
- Qt 使用 lambda 表达式做为槽函数时为什么使用 QObject::sender() 获取到的发送信号对象指针为空?
/*! Returns a pointer to the object that sent the signal, if called in a slot activated by a signal; ...
- spring 实现定时任务
spring实现定时任务超级简单.比使用quartz简单,比使用timer强大.如下是一个简单的springboot任务,启用了定时任务 @SpringBootApplication@Componen ...
- django博客项目11
.....................