# 自动化测试平台(后端) **Repository Path**: BruceQiang/rd-testing-platform ## Basic Information - **Project Name**: 自动化测试平台(后端) - **Description**: 支持 UI (Web/WAP) 与 API 自动化测试,采用 Playwright 与 Requests,集成 Allure 报告、定时任务、失败重试、并发执行,以及钉钉/企业微信通知、AI分析报错信息等功能。 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: https://shangguangroup.top - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 11 - **Created**: 2025-12-26 - **Last Updated**: 2025-12-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # rd-uitest-platform ## 体验地址 https://shangguangroup.top/ 账号:test 密码:123456 ## 项目介绍 本项目是一个统一的自动化测试平台,支持 **Web / WAP UI 自动化、API 自动化以及 Android / iOS 移动端自动化测试**。 平台以 `pytest` 作为统一测试执行引擎,通过任务调度、并发执行、实时结果回传和测试报告生成,实现自动化测试的集中管理与持续集成落地。 在 UI 自动化方面,Web 与 WAP 端基于 **Playwright** 实现高效稳定的浏览器自动化;移动端分别采用 **uiautomator2(Android)** 和 **Appium(iOS)** 进行测试。 同时,平台支持 API 自动化测试、定时执行、失败重试、CI/CD 集成及多渠道通知,满足日常回归测试和持续集成场景的需求。 --- ## 核心功能 1. **多端自动化测试统一管理** 支持 Web、WAP、API、Android、iOS 多类型自动化测试用例的统一编排与执行。 2. **UI 自动化测试** - Web / WAP:基于 Playwright,执行速度快、稳定性高 - Android:基于 uiautomator2,直接调用系统 API,无需额外服务 - iOS:基于 Appium,覆盖主流 iOS 自动化场景 3. **API 自动化测试** 支持接口用例管理与执行,支持会话保持、公共参数配置。 4. **测试任务调度与并发执行** - 支持定时任务自动执行测试用例 - 支持并发执行,大幅提升大型项目测试效率 5. **失败重试与稳定性保障** 支持失败用例自动重试,减少因偶发问题导致的误报。 6. **实时执行结果回传** 测试执行过程中,实时推送每一步执行结果,便于快速定位问题。 7. **测试报告与结果分析** 测试完成后自动生成 Allure 测试报告,支持用例结果、步骤详情和失败信息分析。 8. **CI/CD 集成** 提供接口支持与 Jenkins 等 CI/CD 工具集成,支持发布后自动触发测试任务。 9. **异常通知与协作** 测试失败时,自动将结果推送至钉钉或企业微信群,实现问题的即时反馈。 10. **AI 辅助分析** 基于大模型对失败用例的报错信息、执行步骤及页面结构进行分析,辅助定位问题并给出优化建议。 11. **钉钉指令回调** 支持在钉钉群中通过指令远程管理测试用例状态,提高测试运维效率。 --- ## 技术栈 - **测试框架**:pytest - **Web / WAP UI 自动化**:Playwright - **API 自动化**:requests - **Android 自动化**:uiautomator2 - **IOS 自动化**:Appium - **并发与重试**:pytest-xdist、pytest-rerunfailures - **任务调度**:AsyncIOScheduler - **实时通信**:WebSocket、Redis(Pub/Sub,lpush/brpop) - **测试报告**:Allure - **后端服务**:FastAPI - **数据存储**:MySQL(aiomysql) - **通知与协作**:钉钉、企业微信 ## 目录结构 ``` rd-uitest-platform-master/ ├── Systemd/ # 启动服务目录 ├── app/ │ ├── appium_method.py # appium常用方法封装 │ ├── playwright_method.py # playwright常用方法封装 │ ├── query_scheduled_tasks.py # 定时任务调度 │ ├── uiautomator2_method.py # uiautomator2常用方法封装 │ ├── websocket_app.py # Websocket服务 │ └── wechat_dingding_bot_api.py # 通知集成 ├── core/ │ ├── case_database.py # 用例的数据库操作封装 │ ├── config.py # 项目配置文件 │ ├── decorators.py # 接口装饰器 │ ├── sql.py # 项目数据库操作封装 │ └── utils.py # 安全空间、redis等函数 ├── log/ │ ├── app.log │ ├── scheduled_tasks.log │ └── websocket_app.log ├── routers/ │ ├── account.py │ ├── api_case.py │ ├── app_case.py │ ├── projects.py │ ├── public_api.py │ ├── pythonscript.py │ ├── reports.py │ ├── run_case.py │ ├── system_users.py │ ├── user.py │ └── web_case.py ├── servers/ │ ├── account_service.py │ ├── api_case_service.py │ ├── app_case_service.py │ ├── projects_service.py │ ├── public_service.py │ ├── pythonscript_service.py │ ├── reports_service.py │ ├── run_case_service.py │ ├── user_service.py │ └── web_case_service.py ├── tests/ # 测试用例目录 │ ├── test_01.py # WEB UI测试用例 │ ├── test_02.py # API 测试用例 │ ├── test_03.py # IOS 测试用例 │ └── test_04.py # Android 测试用例 ├── README.md # 项目说明文件 ├── main.py # FastAPI应用入口 ├── automatically_pull_code.py # 自动拉取代码示例 ├── conftest.py # pytest配置文件 ├── delete_test_report.sh # 定时删除测试相关日志shell脚本 └── requirements.txt # 所需第三方库 ``` ## 安装教程(Ubuntu) #### 环境要求 - Python 12 - MySQL 5.8 1. 安装所需服务和软件包: ```sh apt update apt install openjdk-11-jre-headless apt install nginx apt install redis-server apt install uvicorn apt install python3-full apt install mysql-server -y pip3 install -r requirements.txt pip3 install -U pip setuptools pip3 install python-multipart playwright install-deps playwright install chromium ``` 2. alluer安装 https://blog.csdn.net/zl6605781/article/details/126021353 #### 需要注意的地方 1. 修改配置文件config.py、deepseek_key获取地址:https://cloud.siliconflow.cn/account/ak 2. 确保测试报告存放目录存在:/home/ui-testreports/uitest-platform/allure-results,如需修改,请修改涉及文件config.py。 3. 如遇到截图中文显示异常,执行:sudo apt install fonts-wqy-microhei fonts-wqy-zenhei #### 启动方式(前提:5004和5005端口未被占用) - 方法一:在项目的根目录下启动,把clean_logs文件放到/etc/logrotate.d/目录下 ```sh # 启动后端接口 nohup uvicorn main:app --host 0.0.0.0 --port 5004 --workers 4 > ./log/app.log 2>&1 & nohup uvicorn app.websocket_app:app --host 0.0.0.0 --port 5005 --workers 1 > ./log/websocket_app.log 2>&1 & # 启动定时任务脚本 nohup python3 app.query_scheduled_tasks.py > ./log/scheduled_tasks.log 2>&1 & ``` - 方法二:把Systemd目录下的三个.service文件放到 /etc/systemd/system/ 目录下,把clean_logs文件放到/etc/logrotate.d/目录下 ```sh # 1.创建用户并设置访问权限 # 或 直接用root用户,需要修改.service的三个文件中User和Group的值修改为root,WorkingDirectory:工作目录,直接执行第三步 sudo useradd -m -s /bin/bash appuser sudo chown -R appuser:appuser /home/gitee sudo chown -R appuser:appuser /home/ui-testreports # 2.使用appuser用户进行测试,运行pytest,看看有哪些权限没给,自行给一下 # 前提:功能列表里要有ID为1的测试用例, appuser@iv-ydt3sr54aowuxjshepxe:/home/gitee/rd/rd-uitest-platform$ playwright install chromium appuser@iv-ydt3sr54aowuxjshepxe:/home/gitee/rd/rd-uitest-platform$ pytest ./tests/test_01.py --alluredir=./log/testreport --case_ids=[1] -n 1 --dist load --reruns 2 # 3.重新加载配置,设置开机自启,立即开启服务 sudo systemctl daemon-reload sudo systemctl enable uitestplatform_app.service uitestplatform_websocket.service uitestplatform_scheduled.service sudo systemctl start uitestplatform_app.service uitestplatform_websocket.service uitestplatform_scheduled.service ``` #### nginx服务配置示例: ```sh server { listen 80; server_name 14.103.196.193; # OCSP Stapling ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; # 超时设置 client_body_timeout 10s; client_header_timeout 10s; keepalive_timeout 60s; # 前端配置 location / { root /home/gitee/fe/fe-uitest-platform/dist; try_files $uri $uri/ /index.html; add_header Cache-Control "no-cache, no-store, must-revalidate"; } # API 代理配置 location /api/ { proxy_pass http://127.0.0.1:5004; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_connect_timeout 60s; proxy_read_timeout 600s; proxy_send_timeout 60s; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; } # WebSocket 配置 location /api/ws/ { proxy_pass http://127.0.0.1:5005; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_connect_timeout 60s; proxy_read_timeout 600s; proxy_send_timeout 60s; } # 测试报告目录 location /ui-testreports/ { alias /home/ui-testreports/; expires 30d; access_log off; autoindex off; # 禁止目录列表 } # 安全头 add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; add_header X-XSS-Protection "1; mode=block"; add_header Referrer-Policy "strict-origin-when-cross-origin"; } ``` #### 使用文档 https://share.note.youdao.com/s/cTBHBcYJ #### 使用示例 1. 先在项目列表新增项目,如果运行环境选择WEB、WAP新增成功后在功能列表里查询,如果运行环境选择API新增成功后在接口列表里查询。 ![输入图片说明](Example%20images/%E6%96%B0%E5%A2%9E%E9%A1%B9%E7%9B%AEimage.png) 2. 新增/编辑case里面的账号,是在账号列表里维护。 ![输入图片说明](Example%20images/%E9%80%89%E6%8B%A9%E8%B4%A6%E5%8F%B7image.png) 3.新增/编辑账号,如果类型选择UI,是在功能列表新增case的账号里选择,这里写的是cookies信息,如果类型选择的是API,是在接口列表新增case的账号里选择,这里写的是默认headers,对整个case生效,后续接口中如果再写headers相同的键,此键会替换成最新的。 ![输入图片说明](Example%20images/%E6%96%B0%E5%A2%9E%E8%B4%A6%E5%8F%B7image.png) 4.定时任务,可以选择报错后发送到企业微信或钉钉群;如果使用上线触发/api/trigger_execute_case 接口,需在这里配置报警通知。 ![输入图片说明](Example%20images/%E8%AE%BE%E7%BD%AE%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1image.png) 5.项目列表里的数据库,是设置当前项目的数据库信息,比如:运行完下单的测试用例,可以在数据库中查询是否存在这个订单。可以在用来步骤里选择 ![输入图片说明](Example%20images/%E6%95%B0%E6%8D%AE%E5%BA%93image.png) ![输入图片说明](Example%20images/%E6%95%B0%E6%8D%AE%E5%BA%93%E6%9F%A5%E8%AF%A2image.png) 6.功能用例步骤名称以获取开头的,填写的变量需要以 `$.`开头,例如 `$.`info,进行断言时,可直接使用 `$.`info ![输入图片说明](Example%20images/%E8%8E%B7%E5%8F%96%E5%85%83%E7%B4%A0%E5%86%85%E5%AE%B9image.png) ![输入图片说明](Example%20images/%E6%96%AD%E8%A8%80image.png) 7.接口用例步骤里详情里包含的取值,格式为python字典,取值后可以在后续的headers、data里入参,要用双大括号包裹,因为是字典格式,所以可以同时取多个值(同一用例下,所有键必须唯一,方便后续进行关联操作) ![输入图片说明](Example%20images/%E6%8E%A5%E5%8F%A3%E5%8F%96%E5%80%BCimage.png) ![输入图片说明](Example%20images/%E5%8F%96%E5%A4%9A%E4%B8%AA%E5%80%BCimage.png) ![输入图片说明](Example%20images/headersimage.png) 8.断言的所有输入框会默认转换成字符串格式,如果需要断言为整形,需要写int(1) ![输入图片说明](Example%20images/%E6%95%B4%E5%BD%A2%E6%96%AD%E8%A8%80image.png) 9.功能列表里新增case,所有的定位方式均使用page.locator() #### 联系方式 如有疑问或建议,请联系微信(备注测试平台):cyf520-----