自动化测试2.0

Ryder 2025-12-11 17 12/11
WMS自动化测试框架文档
**版本**: 2.0 | **更新**: 2025-12-11 | **环境**: QA4 / PR / ON
---
## 📌 项目概述
WMS自动化测试框架基于 **Playwright + Pytest**,专为仓库管理系统设计,支持多环境测试、数据驱动、持续集成。
### 核心特性
- 🎯 **Page Object模式** - 页面元素与业务逻辑分离
- 📊 **数据驱动** - Excel/JSON数据源
- 🔄 **登录态持久化** - 自动保存登录状态
- 📈 **Allure报告** - 可视化测试报告
- 🔔 **通知集成** - 钉钉/邮件推送
- ⚡ **顺序控制** - 灵活控制执行顺序
- 🐳 **容器化** - Docker + Jenkins集成
- 🌐 **多环境** - QA4/PR/ON自动切换
---
## 🏗️ 技术架构
**核心技术**: Python 3.9 + Playwright 1.55 + Pytest 8.4.2 + Allure 2.15
**关键库**: pytest-asyncio, pytest-order, openpyxl, requests
**部署**: Docker + Jenkins
**分层架构**: 测试用例层 → 业务逻辑层 → 页面对象层 → 工具层 → 配置层
---
## 📁 项目结构
```
pw_test/
├── base/                          # 基础框架层
│   ├── __init__.py
│   └── page_object.py            # PageElement元素封装类
├── page/                         # 页面对象层(Page Object)
│   └── wms/
│       ├── base_wms_page.py      # WMS公共页面基类 ⭐
│       ├── in_warehouse/         # 入库页面
│       │   └── Asn_list_page.py
│       └── out_warehouse/        # 出库页面
│           └── Out_warehouse_list_page.py
├── business/                      # 业务逻辑层
│   └── web_ui/wms/
│       ├── common.py             # 公共业务方法 ⭐
│       ├── login_business/       # 登录业务
│       │   └── loginbusiness.py
│       ├── in_warehouse/         # 入库业务
│       │   └── Asn_list_business.py
│       └── out_storage/          # 出库业务
│           └── Out_warehouse_list_business.py
├── case_scripts/                  # 测试用例脚本
│   └── web_ui/wms/
│       ├── conftest.py           # Pytest配置和Fixture ⭐
│       ├── in_warehouse/
│       │   └── test_01_ASN_list_case.py
│       └── out_warehouse/
│           └── test_02_Out_warehouse_list_case.py
├── case_data/                     # 测试数据
│   └── web_ui/
│       ├── wms_on/               # ON环境数据
│       ├── wms_pr/               # PR环境数据
│       └── wms_q4/               # QA4环境数据
├── case_report/                   # 测试报告输出
│   ├── allure-results/           # Allure原始数据
│   ├── allure-report/            # Allure HTML报告
│   └── logs/                     # 测试日志
├── conf/                          # 配置文件
│   ├── login_conf.ini            # 登录配置 ⭐
│   ├── env_config.ini            # 环境配置 ⭐
│   └── notification.ini          # 通知配置
├── tools/                         # 工具模块
│   ├── environment_utils.py      # 环境配置管理 ⭐
│   ├── get_case_data.py          # 测试数据读取
│   ├── log.py                    # 日志工具
│   ├── notification_manager.py   # 通知管理
│   ├── db_connection.py          # 数据库连接
│   ├── general_tool.py           # 通用工具
│   └── ...
├── auth/                          # 登录态存储
│   └── storage_state.json        # 保存的登录状态
├── run.py                         # 主执行脚本 ⭐
├── pytest.ini                     # Pytest配置
├── requirements.txt               # Python依赖
├── Dockerfile                     # Docker镜像构建
├── docker-compose.yml             # Docker编排
├── Jenkinsfile                    # Jenkins流水线
└── README.md                      # 项目说明
```
**核心文件**: 
- `base/page_object.py` - PageElement元素封装
- `page/wms/base_wms_page.py` - WMS公共基类
- `business/web_ui/wms/common.py` - 公共业务方法
- `case_scripts/web_ui/wms/conftest.py` - 登录态管理和测试fixture
- `tools/environment_utils.py` - 环境配置管理
- `run.py` - 主执行脚本
---
## 🛠️ 环境搭建
#### 1. 克隆项目
```bash
git clone https://gitee.com/super_coding/playwright_ui_test.git
cd playwright_ui_test
```
#### 2. 创建虚拟环境
```bash
# Windows
python -m venv venv
venv\Scripts\activate
# Linux/Mac
python3 -m venv venv
source venv/bin/activate
```
#### 3. 安装依赖
```bash
# 升级pip
python -m pip install --upgrade pip
# 安装Python依赖
pip install -r requirements.txt
# 如果网络慢,使用国内镜像
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
```
#### 4. 安装Playwright浏览器
```bash
# 安装Chromium浏览器
playwright install chromium
# Linux需要安装系统依赖
playwright install-deps chromium
```
#### 5. 验证安装
```bash
# 验证pytest
pytest --version
# 验证playwright
python -c "from playwright.sync_api import sync_playwright; print('Playwright OK')"
# 验证allure
allure --version
```
---
## ⚙️ 配置说明
```ini
[ACCOUNT]
username = your_username
password = your_password 
```
**环境配置** `conf/env_config.ini`
```ini
[ENVIRONMENT]
env = qa4  # on | pr | qa4
[QA4]
base_url = https://qa4-wms.yqn.com
login_url = https://qa4-wms.yqn.com/login
from_warehouse = COPE_CA_US
to_warehouse = COPE_CA_US
```
**通知配置** `conf/notification.ini`
```ini
[dingtalk]
webhook = https://oapi.dingtalk.com/robot/send?access_token=xxx
secret = SECxxx
enabled = true
```
**Pytest配置** `pytest.ini`
```ini
[pytest]
asyncio_mode = auto
addopts = --order-dependencies --alluredir=./case_report/allure-results -v -s
```
---
## 🚀 快速开始
```bash
# 激活虚拟环境
venv\Scripts\activate  # Windows
source venv/bin/activate  # Linux/Mac
# 执行所有测试
python run.py -w
# 执行测试并发送通知
python run.py -w -notify
# 不清理历史报告
python run.py -w -cls 0
# 指定环境执行
python run.py -w -env qa4
```
**命令参数**: `-w`(执行测试), `-env`(指定环境), `-cls 0/1`(清理历史), `-notify`(发送通知)
---
## ✍️ 测试用例开发
**Excel数据** `case_data/web_ui/wms_q4/入库_ASN列表.xlsx`
| 场景 | ASN单号 | 状态 | 预期结果 |
|------|---------|------|----------|
| 单条件搜索 | ASN123 | | 待到仓 |
| 组合搜索 | ASN123 | 待到仓 | 待到仓 |
**测试用例**
```python
import pytest
import allure
from business.web_ui.wms.in_warehouse.Asn_list_business import AsnListBusiness
from tools.get_case_data import GenerateCaseData
@allure.feature("WMS-入库管理")
@pytest.mark.order(1)
class TestASNList:
    @allure.title("{case[场景]}")
    @pytest.mark.parametrize("case", GenerateCaseData('入库_ASN列表'))
    @pytest.mark.asyncio
    async def test_asn_search(self, logged_in_page, assert_test_result, case):
        """ASN列表搜索测试"""
        business = AsnListBusiness(logged_in_page, **case)
        await business.set_up()
        result = await business.business()
        await assert_test_result(result, case['场景'])
```
**Page Object开发**
```python
from page.wms.base_wms_page import BaseWMSPage

class AsnListPage(BaseWMSPage):
    asn_no_input = PageElement(css='#asnNo', describe="ASN单号输入框")
```
**业务逻辑**
```python
class AsnListBusiness(AsnListPage):
    async def business(self):
        try:
            await (await self.click_input(role="menuitem", name="入库管理")).click()
            await (await self.click_input(role="link", name="ASN列表")).click()       
            common = Common(self.page)
            await common.click_expand_button()     
            if is_valid(self.asn_no):
                await (await self.asn_no_input).fill(self.asn_no)            
            await (await self.search_button).click()
            return await common.check_no_data()
        except Exception as e:
            logger.error(e)
            return False
```
---
## 📊 报告查看
**Allure报告**
```bash
allure open case_report/allure-report
```
⚠️ 不要直接双击index.html,必须通过HTTP服务器访问
---
## 🐳 Docker部署
```bash
docker build -t playwright_ui_test-jenkins . --no-cache
docker-compose up -d
```
---
## 🔄 Jenkins集成
项目已内置`Jenkinsfile`,包含环境验证、执行测试、生成报告、清理缓存等阶段。
**定时构建**: `0 9 * * *` (每天早上9点)
---
## 🐛 常见问题
| 问题 | 解决方案 |
|------|----------|
| Playwright安装失败 | `playwright install chromium` |
| 登录失败 | `rm auth/storage_state.json` |
| 报告打不开 | `allure open case_report/allure-report` |
| 用例顺序不生效 | `pip install pytest-order` |
| 环境切换失败 | 修改`conf/env_config.ini`或设置`TEST_ENV`环境变量 |
---
## 📝 开发规范
**分层原则**: Page层定义元素 → Business层封装流程 → Test层编写场景
**代码风格**: 精简表达、代码即文档、日志简洁
**命名规范**: 测试文件`test_*.py`、测试类`Test*`、测试方法`test_*`
**数据驱动**: 优先Excel数据驱动,一套代码覆盖多场景
---
---
**文档版本**: 2.0 | **更新**: 2025-12-11
- THE END -

Ryder

12月11日16:47

最后修改:2025年12月11日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论