# 自动化测试平台(后端) **Repository Path**: lcuyym/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**: 10 - **Created**: 2025-08-07 - **Last Updated**: 2025-08-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # rd-uitest-platform #### 体验地址 https://shangguangroup.top/ 账号:test 密码:123456 #### 项目介绍 本平台使用 Playwright 进行 Web 和 WAP 端的 UI 自动化测试,相较于 Selenium,Playwright 直接调用浏览器 API,不需要额外安装驱动,测试速度更快,占用内存更少,性能更优。对于 API 自动化测试,采用 requests 库,所有测试均通过 pytest 进行组织和执行。 #### 主要功能 1. UI 自动化测试:使用 Playwright 对 Web 和 WAP 端进行快速且高效的 UI 自动化测试。 2. API 自动化测试:使用 requests 对 API 接口进行稳定的自动化测试。 3. 实时返回测试结果:利用 Redis + WebSocket 实时返回的测试用例每一步的结果。 4. 测试报告:测试完成后,自动生成 Allure 测试报告,便于分析测试结果。 5. 定时任务:支持设置定时任务,自动执行测试用例,适应长期持续集成测试的需求。 6. 错误重试:使用 pytest-rerunfailures,定时任务执行失败时自动重试,确保临时问题不影响测试结果。 7. 并发执行:使用 pytest-xdist,对于大型项目,支持并发执行测试用例,极大提升测试效率。 8. 错误通知:测试完成后,如果发现错误,可以自动将测试报告发送到 钉钉 或 企业微信群,实现问题的实时跟踪。 9. Jenkins 等集成工具支持:系统可以集成 Jenkins 等 CI/CD 工具,提供 /api/trigger_execute_case 接口,上线完成后可通过该接口触发自动化测试,并将结果发送到企业微信或钉钉群组。 10. AI分析报错信息:调用硅基流动 api 发送用例的报错信息,分析报错原因。 11. 钉钉回调:支持在钉钉群中通过文本指令远程控制测试用例启用/禁用状态,并即时反馈结果,提升测试管理灵活性。 #### 技术栈 1. Playwright:Web 和 WAP UI 自动化测试。 2. requests:API 接口自动化测试。 3. aioredis:进行消息发布/订阅。 4. WebSocket:实时消息传递。 5. pytest:测试框架。 6. pytest-rerunfailures:失败用例自动重试。 7. pytest-xdist:并发执行测试用例。 8. Allure:生成测试报告。 9. Fast API:提供异步接口服务。 10. 钉钉 / 企业微信:集成测试结果通知。 11. aiomysql:数据库,用于存储测试数据和结果。 12. AsyncIOScheduler:定时任务调度器。 #### 环境要求 - Python 12 - MySQL 5.8 #### 目录结构 ``` rd-uitest-platform-master/ ├── Systemd/ # 启动服务目录 ├── app/ │ ├── api_method.py # API业务逻辑 │ ├── playwright_method.py # playwright函数 │ ├── query_scheduled_tasks.py# 定时任务调度 │ ├── websocket_app.py # Websocket服务 │ └── wechat_dingding_bot_api.py # 通知集成 ├── core/ │ ├── case_database.py # 用例的数据库操作封装 │ ├── config.py # 项目配置文件 │ ├── sql.py # 项目数据库操作封装 │ └── utils.py # 安全空间、redis等函数 ├── log/ │ ├── app.log │ ├── scheduled_tasks.log │ └── websocket_app.log ├── tests/ # 测试用例目录 │ ├── test_01.py # UI测试用例 │ └── test_02.py # API测试用例 ├── README.md # 项目说明文件 ├── main.py # FastAPI应用入口 ├── automatically_pull_code.py # 自动拉取代码示例 ├── conftest.py # pytest配置文件 ├── delete_test_report.sh # 定时删除测试相关日志shell脚本 └── requirements.txt # 所需第三方库 ``` #### 安装教程(Ubuntu) 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,如需修改,请修改涉及文件api.method.py、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"; } ``` #### 使用示例 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-----