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

Docker 与自动化测试

对于重复枯燥的手动测试任务,能够考虑将其进行自动化改造。自动化的成本在于自动化程序的编写和维护,而收益在于节省了手动执行用例的时间。简而言之,若是收益大于成本,测试任务就有价值自动化,不然受益的只是测试人员的自动化技能获得了提高。利用 Docker 的快速部署、环境共享等特性,能够大大减小自动化的成本,使不少本来没有价值自动化的测试任务变为了有价值自动化的任务,大大提高了项目效率。linux

那么若是自动化测试已经运行在了虚拟机中,是否有必要使用 Docker 技术将其进行改造?这个就要具体问题具体分析了。笔者并不赞同将全部测试任务一刀切的进行容器化改造。若是当前虚拟机已经知足测试需求,你就须要评估一下引入 Docker 进行改造所需的成本,其中包含学习 Docker 技术所须要的时间成本。反之,若是虚拟机没法知足当前的测试需求,能够考虑尽快引入 Docker 进行改造。sql

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 发行版安装到物理机中进行测试。当须要从新进行全量测试时不得不手动还原测试环境。以后改用了虚拟机,虽然可以经过自动化的方式实现环境还原,但虚拟机的损耗较大,效率不高。

以后咱们尝试将环境制做成 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 快速部署、环境共享等特性,同时配合容器云来快速提供所需的测试资源,以应对测试任务的峰值。若是忽略环境部署时间,当每一个测试用例粒度无限小而且提供的测试资源无限多时,测试执行所需的时间也就无限小。

欢迎工做一到五年的Java工程师朋友们加入Java架构开发:760940986 群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用本身每一分每一秒的时间来学习提高本身,不要再用"没有时间“来掩饰本身思想上的懒惰!趁年轻,使劲拼,给将来的本身一个交代! 

相关文章
相关标签/搜索