容器化UI自动化测试环境(Cypress&Docker)

Source

将自动化测试打成镜像在容器里面运行是现在自动化测试的趋势,最近在学习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"]
  1. 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
  2. WORKDIR /usr/uitest
    表示容器里的工作路径。
  3. COPY . /usr/uitest
    表示将host主机的当前目录下的内容拷贝到容器里的工作目录,这里的当前目录是指代码根目录。
  4. RUN npm install
    安装项目所需依赖,由项目里的package.json指定。
  5. CMD ["npm","run","weiboSignUpTest"]
    表示容器运行起来后执行的命令,这里是执行测试用例weiboSignUpTest。

构建镜像

  1. 将代码下载到本地某一路径下,然后进入代码根目录,如下图:
    在这里插入图片描述
  2. 执行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
在这里插入图片描述

创建挂载卷

我们知道容器运行完成后会自动销毁,与之相关的东西也不会保存,如果需要持久化保存数据,需要挂载卷。

  1. 创建一个卷:docker volume create my-vol
  2. 查看卷:docker volume ls
  3. 查看某一个卷的具体信息: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里面包含了运行之后的所有文件,这样便可以获取运行后的截图、视频等。