将自动化测试打成镜像在容器里面运行是现在自动化测试的趋势,最近在学习docker基础,也就尝试了一下将自动化测试放到docker里跑,本文将详细讲述这一过程。
准备
1.安装Docker,可参考:https://docs.docker.com/engine/install/
2.准备一个UI自动化测试项目,也可以使用博主的,我使用的自动化测试框架是Cypress:https://github.com/qycai/firstCypressProject.git
编写Dockerfile
如果是下载博主项目的同学,可以看到在项目根目录已经编写好了Dockerfile了,没有使用该项目的同学也没关系,接下来我们会详细讲解怎么编写Dockerfile。
FROM cypress/browsers:node12.16.2-chrome81-ff75
WORKDIR /usr/uitest
COPY . /usr/uitest
RUN npm install
CMD ["npm","run","weiboSignUpTest"]
FROM cypress/browsers:node12.16.2-chrome81-ff75
基础镜像选择的是cypress/browsers,这是cypress官方提供的一个带有node和cypress的镜像,有各种版本的,可以在docker hub自行选择:https://hub.docker.com/r/cypress/browsers/tags。cypress官网也提供了不带Chrome,只有cypress运行时依赖的镜像,具体可参考:https://github.com/cypress-io/cypress-docker-images。WORKDIR /usr/uitest
表示容器里的工作路径。COPY . /usr/uitest
表示将host主机的当前目录下的内容拷贝到容器里的工作目录,这里的当前目录是指代码根目录。RUN npm install
安装项目所需依赖,由项目里的package.json指定。CMD ["npm","run","weiboSignUpTest"]
表示容器运行起来后执行的命令,这里是执行测试用例weiboSignUpTest。
构建镜像
- 将代码下载到本地某一路径下,然后进入代码根目录,如下图:
- 执行docker build命令:
docker build --rm -f Dockerfile -t uitest:1.0 .
--rm
:打完镜像后删除中间镜像。
-f Dockerfile
:指定dockerfile的路径和名称,我们已经处于和dockerfile统一目录下了,故只需要指定名称即可。默认的dockerfile名称是Dockerfile,所以如果在当前目录下存在Dockerfile的话,可以直接省略。
-t uitest:1.0
:指定镜像的名称和tag,tag可以省略,默认为latest。
.
:将当前目录下的所有内容打成镜像。
如下图所示即表示镜像打成功:
可以查看一下镜像:
docker image ls
创建挂载卷
我们知道容器运行完成后会自动销毁,与之相关的东西也不会保存,如果需要持久化保存数据,需要挂载卷。
- 创建一个卷:
docker volume create my-vol
- 查看卷:
docker volume ls
- 查看某一个卷的具体信息:
docker inspect my-vol
这里的Mountpoint就是卷所在的位置,如果你的宿主机是linux,那么你可以在宿主机上找到该目录。但如果你的宿主机是windows或mac,那么你是找不到该路径的,是因为其实docker engine实际上实在你的windows/mac宿主机上运行了一个轻量级的linux虚拟机,该目录是Linux虚拟机的目录。那么在windows/mac上怎么查看卷里面的内容呢,下文会讲到。
运行容器
镜像构建完成后,就使用该镜像运行容器:
docker run --rm -it --name uitest --mount source=my-vol,target=/usr/uitest uitest:1.0
--rm
:运行完成后删除该容器。
-it
:以交互模式运行container,即可以在终端看到运行的日志。
--name uitest
:给运行的container命名为uitest。
--mount source=my-vol,target=/usr/uitest
:将容器里/usr/uitest下的内容挂载到卷my-vol。
uitest:image
:运行的镜像的名称。
运行完成后如下图:
windows/mac查看卷内容
上文提到,在windwos/mac系统上,是没有办法直接访问卷的内容的,那么我们可以将其内容copy到宿主机上:
docker run --rm -it -v /Users/qycai/volume-backup:/backup -v /var/lib/docker:/docker alpine:edge tar cfz /backup/volumes.tgz /docker/volumes/
/Users/qycai/volume-backup:/backup
:指定任意一个宿主机路径。
-v /var/lib/docker:/docker
:卷的在虚拟机上的路径。
alpine:edge
:镜像名。
tar cfz /backup/volumes.tgz /docker/volumes/
:将/docker/volumes/下的东西打包到/backup下并命名为volumes.tgz。
现在就可以去/Users/qycai/volume-backup路径下查看卷里面的内容了:
可以看到卷my-vol里面包含了运行之后的所有文件,这样便可以获取运行后的截图、视频等。