pytestx容器化执行引擎

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 系统架构 前端、后端、pytest均以Docker容器运行服务,单独的容器化执行引擎,项目环境隔离,即用即取,用完即弃,简单,高效。 前端容器:页面交互,请求后端,展示HTML报告 后端容器:接收前端请求,启动任务,构建镜像,触发运行pytest,挂载HTML报告 pytest容器:拉取项目代码,指定目录执行,生成HTML报告 说明:构建镜像目前是在宿主机启动后端服务来执行docker命令的,暂未支持Kubernetes编排。宿主机安装了Docker,启动服务后,可以执行docker命令。如果采用容器部署后端,容器里面不包含Docker,无法构建,个人想法是可以借助K8S来编排,当前版本还未实现 系统流程 支持2种运行模式配置:容器和本地。 容器模式:判断是否支持docker,如果支持,构建pytest镜像,在构建时,通过git拉取项目代码,再运行容器,按照指定目录执行pytest,生成测试报告,并将报告文件挂载到后端。如果不支持,降级为本地运行。 本地模式:模拟容器行为,在本地目录拉取代码,执行pytest,生成测试报告。 效果展示 任务管理: 容器模式: 本地模式: 平台大改造 pytestx平台更轻、更薄,移除了用例管理、任务关联用例相关功能代码,只保留真正的任务调度功能,backend的requirements.txt解耦,只保留后端依赖,pytest相关依赖转移到tep-project。 那如何管理用例呢?约定大于配置,我们约定pytest项目已经通过目录维护好了一个稳定的自动化用例集,也就是说需要通过平台任务调度的用例,都统一存放在目录X下,这些用例基本不需要维护,可以每日稳定执行,然后将目录X配置到平台任务信息中,按指定目录执行用例集。对于那些不够稳定的用例,就不能放到目录X下,需要调试好以后再纳入。 为什么不用marker?pytest的marker确实可以给测试用例打标记,也有人是手动建立任务和用例进行映射,这些方式都不如维护一个稳定的自动化用例集方便,在我们公司平台上,也是维护用例集,作为基础用例集。使用pytest项目同理。 核心代码 一键部署 #!/bin/bash PkgName='backend' Dockerfile='./deploy/Dockerfile.backend' DockerContext=./ echo "Start build image..." docker build -f $Dockerfile -t $PkgName $DockerContext if [ $? -eq 0 ] then echo "Build docker image success" echo "Start run image..." docker run -p 8000:80 $PkgName else echo "Build docker image failed" fi FROM python:3.8 ENV LANG C.UTF-8 ENV TZ=Asia/Shanghai RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone WORKDIR /app COPY ./backend . RUN pip install -r ./requirements.txt -i \ https://pypi.tuna.tsinghua.edu.cn/simple \ --default-timeout=3000 CMD ["python", "./manage.py", "runserver", "0.0.0.0:80"] 数据库表 ...

pytestx重新定义接口框架设计

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 概览 脚手架: 目录: 用例代码: """ 测试登录到下单流程,需要先启动后端服务 """ test_data = { "查询SKU": { "skuName": "电子书" }, "添加购物车": { "skuId": 123, "skuNum": 2 }, "下单": { "orderId": 222, "payAmount": "0.2" }, "支付": { "skuId": 123, "price": 0.1, "skuNum": 2, "totalPrice": 0.2 }, } case_vars = dict() def test(http, login_headers, file_data): # 搜索商品 url = file_data["domain"] + "/api/tasks/mock/searchSku" body = test_data["查询SKU"] response = http("get", url=url, headers=login_headers, params=body) assert response.status_code < 400 case_vars["skuId"] = response.jsonpath("$.skuId") case_vars["skuPrice"] = response.jsonpath("$.price") # 添加购物车 url = file_data["domain"] + "/api/tasks/mock/addCart" body = test_data["添加购物车"] body["skuId"] = case_vars["skuId"] response = http("post", url=url, headers=login_headers, json=body) assert response.status_code < 400 case_vars["skuNum"] = response.jsonpath("$.skuNum") case_vars["totalPrice"] = response.jsonpath("$.totalPrice") # 下单 url = file_data["domain"] + "/api/tasks/mock/order" body = test_data["下单"] body["skuId"] = case_vars["skuId"] body["price"] = case_vars["skuPrice"] body["skuNum"] = case_vars["skuNum"] body["totalPrice"] = case_vars["totalPrice"] response = http("post", url=url, headers=login_headers, json=body) assert response.status_code < 400 case_vars["orderId"] = response.jsonpath("$.orderId") # 支付 url = file_data["domain"] + "/api/tasks/mock/pay" body = test_data["支付"] body["orderId"] = case_vars["orderId"] response = http("post", url=url, headers=login_headers, json=body) assert response.status_code < 400 assert response.jsonpath("$.success") == "true" 页面下载脚手架 启动平台前后端服务后,从页面下载脚手架,平台会拉取开源项目tep-project最新代码,打成压缩包,生成下载文件,弹窗下载。 ...

聚焦于任务调度的测试平台pytestx

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 设计理念 聚焦于任务调度,接口自动化80%本地编写,20%交由平台管理。 如果使用pytest做接口自动化,那么个人认为最好的编写工具是PyCharm,任何低代码测试平台都无法取代。当然不会代码,或者不使用pytest,那低代码测试平台,或者yaml,甚至excel写自动化用例,都是可以接受的。而在使用pytest这个特定场景里面,要做平台化,平台的功能就需要仔细斟酌。既然编写用例最好使用PyCharm,平台也就只能专注于用例编排和任务调度,即创建任务,关联用例,批量运行,以及定时,并行,通知等。 pytestx正是基于此理念设计的一款纯粹的任务调度平台。 平台架构 tep1.0.0的延续 tep1.0.0版本已经封版,在pytestx中对它进行了延续。 从pypi到git tep是上传到pypi的,通过pip命令安装,使用tep startproject命令创建项目脚手架,代码结构分为项目代码和tep代码。改造后的tep只有项目代码,存放在: https://gitee.com/dongfanger/tep-project.git 也就是说,在这个项目中,能看到整个tep全貌。之前的tep内核代码,比如fixtures自动寻找、内置fixture、环境变量等,全部迁移到了项目代码里面,尤其是conftest.py的文件内容。pip install tep顺带安装的依赖包,也整理到了requirements.txt,按照说明安装即可。 pytest-html替换allure 由重到轻,化繁为简,pytest-html能够满足数据+日志的报告需要,最新的V3.2.0版本的界面尚可。诚然allure漂亮,但安装Java、下载Allure、配置环境变量、安装pytest-allure、添加pytest hook还是相对麻烦。更重要的是,要支持平台在线查看报告,减少存储占用,pytest-html无疑是更好的选择。 下载脚手架 既可以从使用git clone下载代码,也可以从页面下载,就像spring.io那样: fastapi到django 之前的示例代码是调用的fastapi启动的应用,pytestx则将示例代码的接口换成了Django自身的mock接口。 teprunner的延续 pytestx的基础代码是从teprunner来的,对数据库设计、代码规范、项目结构做了优化。 任务管理 一、同步项目 同步项目,是把项目配置的Git仓库地址和分支,更新到本地沙箱中,项目之间完全隔离。 并把用例落库: 二、任务关联用例 创建任务,任务关联用例,就形成了新的用例集。 三、容器化运行 当前是假容器,未真正引入Docker,所谓容器,是指每次运行,都将用例拉取到新的目录,批量执行: 四、生成报告 pytest命令生成html报告,存放于reports,借助于Django挂载页面,从页面点击,在线查看报告: 体验平台 下载源码:https://github.com/dongfanger/pytestx 安装依赖:前端(npm install)后端(pip install -r requirements.txt) 启动服务:前端(npm run serve)后端(python manage.py runserver) 即可畅快体验。 学习交流 添加微信cekaigang,加入交流群,欢快讨论吧。 参考资料: https://github.com/dongfanger/pytestx