前言

项目前身:ATP - UI 自动化测试用例管理平台 https://testerhome.com/topics/14676

由于原作者当时并没有迭代更新的计划,所以我在使用过程中,对一些我使用起来不便的地方进行二次开发,并写了一份比较详细的部署文档和平台介绍文档。

Github 源码以及部署文档: https://github.com/ShaoNianyr/Autotest_platform

二次开发的地方我大概列一下:

1. 修改项目部分逻辑,selenium 项目为通用项目,可以供其他的项目调用 selenium 当中关键字的封装,不用一个关键字对应一个项目。
2. 增加设置测试案例时所属项目,所属页面,所属元素之间的选择关联。
3. 测试案例支持浏览器有头模式执行调试,支持通过 Appium 连接手机执行手机端测试。
3. 支持复制测试案例快速构建一个类似的测试案例去修改,无需重新编写。
4. 新增元素的文本校验,新增断言的匹配力度,支持完全匹配和包含匹配。
5. 测试参数化数据支持填入元素测试。
6. 优化测试结果界面,新增部分测试结果数据,完善反向断言以及错误信息。

因为二次开发的时间距离现在有点久了,还有一些零零散散的忘记了,感兴趣的可以在 commit 里面去查阅,original version 为原版,improved version 为二次开发后的版本。


(以下为平台介绍及部署文档说明)

Autotest_platform

Autotest_platform 是一款基于 POM 模式开发的 Web UI 自动化测试平台,通过选择绑定好的 selenium 的关键字,比如打开 url,左键点击,输入文本等等这些动作,背后的代码已在后端封装好,前端只需要像填表格来设计测试案例即可。此外,由于平台是基于 POM 模式的设计,项目,页面,元素,定位都可拆分管理,我们可以更为方便维护我们的测试脚本,当产品发生迭代的时候,我们只需要修改对应页面对应元素的定位即可,无需重新设计涉及到这个元素的所有测试案例。数据库当中已封装了 selenium 常见的关键字,可以在 ./Autotest_platform/PageObject/Base.py 里面自行添加自己需要的 selenium 关键字,甚至是更为复杂的自定义函数。./Autotest_platform/PageObject/Base_m.py 为手机端函数的封装,需要开启 Appium 连接手机。

平台采用 RabbitMQ + celery 的方式执行测试案例,支持异步分布执行测试案例,也支持开启定时任务。

平台构建相关技术栈:python + django + mysql + RabbitMQ + celery + selenium

平台功能展示

1. 首页用图标展示项目以及测试汇总的数据:

2. 测试案例可分项目管理,多个测试项目之间均可通用 "selenium 关键字封装"项目 封装好的关键字:

3. 采用 POM 模式设计,每个项目对应管理多个页面,每个页面对应管理多个页面元素的定位:

4. selenium 的动作也从测试案例中单独抽出来,作为一个函数来调用,同一个动作可以供多个测试案例一起使用,比如每个测试案例里面的输入文本的动作,都可以直接调用这个 "输入文本" 的关键字,关键字封装在 ./Autotest_platform/PageObject/Base.py 里面,对外暴露出两个参数,也就是输入的定位,以及输入的内容,设计测试案例的时候只需要对应填入这两个参数,它就会自动执行对应的 selenium 语句。 Appium 对应的关键字封装在 ./Autotest_platform/PageObject/Base_m.py 里面。

5. 支持浏览器有头执行案例,也支持浏览器无头执行案例,便于调试。也支持对手机端测试案例的执行,需开启 Appium 以及 adb 连接到手机,获取你要打开的应用和手机设备型号,并在 ./Product/models/models.py 如下代码的对应位置修改填写:
from appium import webdriver
desired_caps = {

'platformName': 'Android',

'platformVersion': '9',

'deviceName': '13b7cc66',

'appPackage': 'com.android.browser',

'appActivity': 'com.android.browser.BrowserActivity',

"noReset": True,

"noSign": True

}
browser = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
time.sleep(2)
return browser

6. 支持一键快速复制测试案例:

7. 支持断言 url 以及 元素两种方式,支持完全匹配和包含匹配两种断言力度,支持测试案例设计过程中的参数化设计:

8. 支持测试案例的前置登录操作,可以在登录配置当中设置:

9. 生成的测试结果中可展示多种详细的信息报告:

10. 支持选择任意的测试案例构建测试集合,支持定时任务测试集合构建:

Windows 安装部署

1. 获取项目代码

首先在 d 盘根目录获取源代码,然后切换至项目的根目录:
(如果代码不在 d 盘根目录,后续的相关路径请按照自己的路径来修改,此处以 d 盘根目录为例部署)

cd d:
git clone https://github.com/ShaoNianyr/Autotest_platform.git
cd Autotest_platform

2. python3.6 pip 包安装

此处要先安装好 python3.6 环境,由于我有多个版本,所以设置的 python3.6 的环境变量为 python36。

python36 -m pip install -r requirements.txt

如果你没有设置 pip 镜像,建议执行如下安装 pip 包指令:

python36 -m pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

3. Mysql5.7 安装:

这里我提供一个 docker-compose.yml 文件,可以帮你快速构建平台所需的 Mysql 数据库镜像,初始化设置并本地挂载数据库的内容。

首先安装 Docker Desktop,并在设置里面勾选 d 盘允许数据挂载。

然后执行指令:

docker-compose up

如果本地有安装到 Mysql 占用了端口导致启动失败,可以先执行指令杀死端口。

netstat -ano|findstr "3306" 
taskkill /pid xxxx -t -f  (xxxx 为你 3306 端口对应的pid)
docker-compose up

一切正常,最终可以看到:

接下来我们可以安装 Navicat Premium 12,连接我们的 docker mysql 镜像,将 autotest.sql 文件导入。当然你也可以直接手写 sql 语句建库导入。

在 Navicat Premium 12 中新建连接,如图所示设置:

点开我们的数据库,右键然后运行文件,执行如下设置,并导入 autotest.sql:


成功以后,我们的数据库就具备 Demo 的数据在里面了。

如果想用本地 Mysql,新建如下的数据库名,并将代码修改你的 Mysql 的密码,再把 sql 文件导入即可。

代码位置: ./Autotest_platform/settings.py

4. RabbitMQ 安装:

安装完毕以后,浏览器输入 http://localhost:15672 ,输入用户名:guest,密码:guest,你就可以进入到测试案例执行的消息队列的管理界面。

5. 启动 Django 项目:

因为之前已经导入过 sql 文件,就不需要再执行 python36 manage.py makesmigrations 这些指令,表格和数据都有了,所以直接执行:

python36 manage.py runserver

打开网址 http://127.0.0.1:8000/login/ ,输入账号和密码:

初始用户名: 少年
初始密码: sn123456

接下来即可顺利进入到首页:

账户的管理在 Django 后台 http://127.0.0.1:8000/admin/ 里面:

6. 启动 celery 异步执行测试案例:

当你点击执行案例的时候,平台会将测试案例放到消息队列当中等待执行,等你开启 celery 的 worker 模式时,才会开始执行命令。具体执行如下指令:(注意要处于项目根目录下)

python36 manage.py celeryd -l info

7. 启动 celery 定时执行测试案例:

python36 manage.py celerybeat -l info 

定时时间在 ./Autotest_platform/settings.py 中设置:

CELERYBEAT_SCHEDULE = {
    'timing': {
        'task': 'Product.tasks.timingRunning',
        # 'schedule': crontab(hour=10, minute=30),
        'schedule': timedelta(seconds=300),
    },
}


↙↙↙阅读原文可查看相关链接,并与作者交流