如果有一种方式,统一开发环境,不需要新人花半天时间部署开发环境,那将是一件极大的好事,试了一下,恰好docker满足了这种需求,真正实现一次封装,到处运行,再不用教新人部署环境、私人电脑也不需要重复安装开发环境

【1】背景

因为robot接口测试项目的部署对测试人员动手能力要求比较强,需要修改livetest和HttpLibrary源码(这两个库还不支持python3),每个测试人员部署,也都要花不少时间。

因此这里我把接口测试项目的开发环境打包成一个镜像,这么一来,测试人员只需要在自己的IDE中配置编译器环境为Docker容器即可

【2】怎么做

【2.1】准备条件

阿里云镜像地址:传送(需登录后才能查看)

接口测试项目开发环境镜像:传送(推荐从阿里云仓库下载,这样更新了开发环境镜像,可以直接更新)

Docker软件:传送

【2.2】安装Docker

win10以下版本的系统使用Docker Toolbox:传送

win10版本使用Docker Desktop,本文演示用的是Docker Desktop

首先下载Docker Desktop,进行安装,安装全部next即可

注意:如果你此前使用的Docker ToolBox,现在想换成Docker Desktop,务必在系统的环境变量中,删除所有docker开头的变量,否则无法运行Docker Desktop

安装完桌面有个Docker Desktop图标,打开自己注册、和学习简单的Docker命令(可直接跳过,不影响)

image.png

如果没有意外的话,在桌面的左下角会有一个小海豚,鼠标移动上去会显示Docker Desktop is running

image (1).png

【2.3】挂载镜像

【2.3.1】如果你是想用阿里云镜像仓库地址的,看这里,推荐使用这种方式

打开你电脑的powershell或者CMD,输入如下地址下载最新版本的开发环境镜像:

docker pull registry.cn-hangzhou.aliyuncs.com/lonelylizard_img/robotframework_python3_env:latest

注意下图只是作为参考,注意最后的版本号请使用latest

image (2).png

查看下docker镜像列表

输入:docker images

如果输出的列表中你看到有个repository名叫做rrzuji_rf_api_env,说明镜像挂载成功

image (3).png

【2.3.2】如果你是从SVN下载的rrzuji_api_rf_env.tar,看这里

打开CMD或者powershell

输入:docker load -i rrzuji_api_rf_env.tar

如下图就是挂载成功

image (4).png
查看下docker镜像列表

输入:docker images

如果输出的列表中你看到有个repository名叫做rrzuji_rf_api_env,说明镜像挂载成功

image (5).png

pycharm中配置Docker

首先你的IDE中,当前的Project应当是我们的接口测试项目rrzuji_RF_API,如果不是,先切换,因为后面打开的页面配置有关

1、从File-settings打开设置

image (6).png

2、添加一个python解释器(python Interperter)

image (7).png

3、新建一个Docker服务

image (8).png

4、从本地的Docker服务中选择镜像,记得配置完点保存

如果你Image name下拉没有看到名为rrzuji_rf_api_env的镜像,请返回到前面第二节“挂载rrzuji_api_rf_env.tar”重新配置

image (9).png

5、现在你可以在接口测试项目的python编译器配置页面的Project Interpreter下拉看到一个连接到Docker的python编译器,选择它

选择它之后,可以看到自动加载出该镜像的python全部已装依赖

image (10).png

测试

【2.4】Python编译

新建一个python文件来测试

我们想知道编译器是调用哪里的,我选择了输出当前编译的路径,和输出系统信息:

import sys

import platform

print("编译器路径:", sys.executable)

print("系统信息:", platform.platform())

OK,运行一下,可以看到输出了:

2b5205b92baf:python -u /opt/project/Resources/Lib/docker_link.py

编译器路径: /usr/local/bin/python

系统信息: Linux-4.19.128-microsoft-standard-x86_64-with-debian-8.10

编译器的路径就是linux系统的,系统信息的debian也表明了python运行在debian系统上

image (11).png

【2.5】用例文件运行测试

新建一个robot文件来测试

我想通过robot文件运行时调用的python编译器和robot的关键字来测试用例是否能正常运行

*** Test Cases ***Class_02_连接容器测试   ${a}   Set Variable   1

   ${b}   Set Variable   2

   ${sysPath}   evaluate   sys.executable

   Log   ======编译器路径========

   Log   ${sysPath}   

   Log   ======robot关键字断言========

   Should Be True   ${a}==${b}

把鼠标移动到用例的名称上面,再单击鼠标右键,点击RUN

控制台输出信息:

aedf1af49891:python -u -m robot.run -t Class_02_连接容器测试 Interface_Code/Person_Alipay_APP/Single_API/Scheme/docker_test.robot

====================================================

Docker Test                                   

====================================================

Class_02_连接容器测试                         | FAIL |

'1==2' should be true.

\------------------------------------------------------------------------------

Docker Test                              | FAIL |

1 critical test, 0 passed, 1 failed

1 test total, 0 passed, 1 failed

=====================================================

Output:  /opt/project/output.xml

Log:   /opt/project/log.html

Report:  /opt/project/report.html

就是我们的用例运行失败了,失败就对,因为我用例里断言1==2

后面的Output、Log、Report文件的路径是容器内的路径,会默认映射到自己的项目根目录下

image (12).png

查看测试报告,在项目的根目录下双击打开log.html

image (13).png

如下图圈出来的信息和我们预想的一致

image (14).png

【3】一些注意事项

1、pycharm在每一次调用Docker容器完成作业后会停止并删除容器

这个可以通过在Pycharm内对代码加断点来测试

比如用刚才的python测试文件来加断点,并使用Debug模式运行

image (15).png

OK,下图圈起来的位置,说明执行到断点位置了,这样我们就能够让Docker容器保持在运行

image (16).png

打开powershell窗口

查看dokcer当前进程(一个容器一个进程)

输入:docker ps

如图,看到一个运行中的容器,ID为285d96811952

image (17).png

回到pycharm,把断点后面的都执行完

接着回到powershell,再次输出:docker ps

发现没有运行中的容器

image (18).png

我们还不知道仅是停止了,还是说被停止并销毁了

查看全部容器,输入命令:docker ps -a

如下图所示,已经找不到ID为285d96811952的容器了,说明pycharm连接Docker是这样的:

1、创建容器:docker run -i -t rrzuji_rf_api_env

3、停止容器:docker stop ${CONTAINER ID}

4、销毁容器:docker rm ${CONTAINER ID}

image (19).png

2、关于接口测试项目的依赖环境更新解决方案

现在的镜像是存放在SVN上,所以一旦我们的项目依赖更新了,我会重新打包生成镜像文件,所有人都需要重新从SVN拉取再挂载到Docker。

这些天我再想办法搭建仓库或者借助阿里云的镜像仓库来存放,到时可以在Docker Destop内便捷更新

3、删除容器、镜像

有些时候我们需要删除多余的容器或者镜像

删除容器:docker rm 容器ID

删除镜像:docker rmi 镜像名字

5、从阿里云仓库下载的时候提示未登陆

这个我没试过,因为我自己环境是登录了的,如果你下载也需要登录,请移步注册:

https://cr.console.aliyun.com/

注册后在powershell或者CMD里执行登录即可

docker login --username=你注册的手机号 registry.cn-hangzhou.aliyuncs.com

4、镜像如果更新了,我怎么更新

在powershell或者CMD里执行如下命令更新

docker pull registry.cn-hangzhou.aliyuncs.com/lonelylizard_img/robotframework_python3_env:latest

如果你之前指定的版本不是latest,则你pull下来镜像是不会覆盖的

5、想使用其他镜像时下载太慢

在docker destop软件内设置-docker Engine把配置文件的仓库地址换成阿里的加速镜像源

{
  "registry-mirrors": [
    "https://wg7mt4u8.mirror.aliyuncs.com"
  ],
  "insecure-registries": [],
  "debug": false,
  "experimental": false,
  "features": {
    "buildkit": true
  }
}

image (20).png