# Novalon Website E2E 测试框架 基于 Playwright 和 Python 的端到端测试解决方案,为 Novalon Website 提供全面的自动化测试覆盖。 ## 目录 - [特性](#特性) - [技术栈](#技术栈) - [项目结构](#项目结构) - [快速开始](#快速开始) - [测试运行](#测试运行) - [CI/CD 集成](#cicd-集成) - [测试标记](#测试标记) - [配置说明](#配置说明) - [最佳实践](#最佳实践) ## 特性 - **模块化设计**: 采用 Page Object Model (POM) 设计模式 - **跨浏览器测试**: 支持 Chrome、Firefox、WebKit - **响应式测试**: 覆盖多端(移动端、平板、桌面) - **性能测试**: 页面加载性能指标监控 - **多格式报告**: HTML、JSON、Markdown 报告生成 - **完整测试数据**: 自动生成测试数据(中文/英文) - **详细日志**: 彩色日志输出,便于问题定位 ## 技术栈 | 技术 | 用途 | |------|------| | Python 3.9+ | 编程语言 | | Playwright | 浏览器自动化框架 | | pytest | 测试框架 | | pytest-html | HTML 报告 | | pytest-cov | 代码覆盖率 | | Jinja2 | 报告模板 | ## 项目结构 ``` e2e-tests/ ├── config/ │ ├── __init__.py │ ├── settings.py # 应用配置 │ └── browsers.py # 浏览器配置 ├── pages/ │ ├── __init__.py │ ├── base_page.py # 页面基类 │ ├── home_page.py # 首页对象 │ └── contact_page.py # 联系页面对象 ├── tests/ │ ├── __init__.py │ ├── conftest.py # pytest 配置和 fixture │ ├── test_home_page.py # 首页测试 │ ├── test_contact_form.py # 联系表单测试 │ ├── test_navigation.py # 导航测试 │ ├── test_performance.py # 性能测试 │ └── test_responsive.py # 响应式测试 ├── utils/ │ ├── __init__.py │ ├── helpers.py # 辅助工具函数 │ ├── logger.py # 日志配置 │ ├── data_generator.py # 测试数据生成 │ └── report_generator.py # 报告生成器 ├── scripts/ │ ├── run_tests.py # 测试运行脚本 │ └── ci_test.py # CI/CD 测试脚本 ├── reports/ # 测试报告目录 ├── screenshots/ # 失败截图目录 ├── videos/ # 测试视频目录 ├── requirements.txt # Python 依赖 ├── pyproject.toml # pytest 配置 ├── pytest.ini # pytest 配置 ├── .env.example # 环境变量模板 └── README.md # 本文档 ``` ## 快速开始 ### 1. 环境准备 ```bash # 创建虚拟环境 python -m venv venv source venv/bin/activate # Linux/Mac # 或 .\venv\Scripts\activate # Windows # 安装依赖 pip install -r requirements.txt # 安装 Playwright 浏览器 playwright install ``` ### 2. 环境配置 ```bash # 复制环境变量模板 cp .env.example .env # 编辑 .env 文件 # BASE_URL=http://localhost:3000 # 默认开发环境: http://localhost:3000 ``` ### 3. 运行测试 ```bash # 运行所有测试 python scripts/run_tests.py # 运行冒烟测试 python scripts/run_tests.py -m smoke # 运行特定测试 python scripts/run_tests.py tests/test_home_page.py # 使用关键字过滤 python scripts/run_tests.py -k home # 多浏览器测试 python scripts/run_tests.py -b all ``` ## 测试运行 ### 命令行参数 | 参数 | 说明 | 默认值 | |------|------|--------| | `-b, --browser` | 浏览器 (chromium/firefox/webkit/all) | chromium | | `-h, --headless` | 无头模式 | False | | `-m, --marker` | 运行指定标记的测试 | - | | `-k, --keyword` | 关键字过滤 | - | | `-v, --verbose` | 详细输出 | False | | `--html` | 生成 HTML 报告 | False | | `--video` | 录制测试视频 | False | | `--screenshot` | 失败时截图 | False | | `--parallel` | 并行执行 | False | | `--workers` | 并行工作数 | 4 | | `--env` | 测试环境 | development | ### 示例命令 ```bash # 冒烟测试 python scripts/run_tests.py -m smoke -v # 性能测试 python scripts/run_tests.py -m performance # 响应式测试 python scripts/run_tests.py -m responsive # 完整回归测试 python scripts/run_tests.py -m regression -v --html # 无头模式运行 python scripts/run_tests.py -h --parallel # 跨浏览器测试 python scripts/run_tests.py -b all --html ``` ## CI/CD 集成 ### GitHub Actions 示例 ```yaml name: E2E Tests on: push: branches: [main, develop] pull_request: branches: [main] jobs: e2e-tests: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.10' - name: Install dependencies run: | python -m venv venv source venv/bin/activate pip install -r e2e-tests/requirements.txt playwright install --with-deps chromium - name: Run E2E Tests run: | source venv/bin/activate cp e2e-tests/.env.example e2e-tests/.env python e2e-tests/scripts/run_tests.py -m smoke --html env: BASE_URL: ${{ secrets.BASE_URL }} - name: Upload Test Report if: always() uses: actions/upload-artifact@v3 with: name: test-report path: e2e-tests/reports/ ``` ### CI 测试脚本 ```bash # 运行冒烟测试 python scripts/ci_test.py --test-type smoke # 运行回归测试 python scripts/ci_test.py --test-type regression # 运行性能测试 python scripts/ci_test.py --test-type performance # 跨浏览器测试 python scripts/ci_test.py --test-type cross_browser # 完整测试套件 python scripts/ci_test.py --test-type full ``` ## 测试标记 | 标记 | 说明 | 用例数量 | |------|------|---------| | `@pytest.mark.smoke` | 冒烟测试,快速验证核心功能 | 关键路径 | | `@pytest.mark.regression` | 回归测试,完整功能验证 | 功能测试 | | `@pytest.mark.performance` | 性能测试,页面加载和响应时间 | 性能指标 | | `@pytest.mark.responsive` | 响应式测试,不同屏幕尺寸 | 布局适配 | | `@pytest.mark.cross_browser` | 跨浏览器测试 | 兼容性 | | `@pytest.mark.form` | 表单相关测试 | 表单验证 | | `@pytest.mark.navigation` | 导航测试 | 页面跳转 | | `@pytest.mark.interactive` | 用户交互测试 | 交互功能 | ### 运行特定标记的测试 ```bash # 只运行冒烟测试 pytest -m smoke # 运行冒烟和性能测试 pytest -m "smoke or performance" # 运行冒烟但排除性能测试 pytest -m "smoke and not performance" ``` ## 配置说明 ### 环境变量 (.env) ```env # 网站基础URL BASE_URL=http://localhost:3000 # 测试环境 ENVIRONMENT=development # 默认浏览器 DEFAULT_BROWSER=chromium # 无头模式 HEADLESS_MODE=false # 页面加载超时 PAGE_LOAD_TIMEOUT=30000 # 元素等待超时 ELEMENT_TIMEOUT=10000 # 报告标题 REPORT_TITLE=Novalon Website E2E 测试报告 # 报告描述 REPORT_DESCRIPTION=自动化端到端测试结果 ``` ### 测试配置 (pytest.ini) ```ini [pytest] testpaths = tests python_files = test_*.py python_classes = Test* python_functions = test_* addopts = -v --tb=short --strict-markers --disable-warnings filterwarnings = ignore::DeprecationWarning ``` ### 浏览器配置 (config/browsers.py) ```python # 支持的浏览器配置 BROWSER_CONFIG = { "chromium": { "headless": False, "viewport": {"width": 1920, "height": 1080}, "args": ["--start-maximized"] }, "firefox": { "headless": False, "viewport": {"width": 1920, "height": 1080} }, "webkit": { "headless": False, "viewport": {"width": 1920, "height": 1080} } } ``` ## 最佳实践 ### 1. 页面对象模式 每个页面都应该有对应的 Page Object 类: ```python from pages.base_page import BasePage class HomePage(BasePage): def __init__(self, page): super().__init__(page) self.path = "/" self.selectors = { "hero_title": "#home h1", "cta_button": ".cta-button" } def verify_hero_title(self): self.assert_element_visible("hero_title") return self ``` ### 2. 测试数据管理 使用数据生成器创建测试数据: ```python from utils.data_generator import get_test_data_generator def test_contact_form(test_data_generator): data = test_data_generator.generate_contact_form_data() page.fill_contact_form(data) ``` ### 3. 断言辅助 使用断言助手进行验证: ```python def test_example(page): assert_(page).title_contains("首页") assert_(page).element_visible("#main") ``` ### 4. 截图和日志 测试失败时自动截图,并记录详细日志: ```python def test_with_logging(page): logger = get_logger() logger.log_action("执行测试步骤") # 测试代码 ``` ### 5. 性能监控 使用内置的性能监控: ```python def test_performance(page): performance = page.verify_page_performance() assert performance["pageLoadTime"] < 5000 ``` ## 报告示例 测试完成后,报告将保存在 `reports/` 目录: ``` reports/ ├── html/ │ └── test_report.html # HTML 格式报告 ├── json/ │ └── test_results.json # JSON 格式结果 └── screenshots/ └── test_failed.png # 失败截图 ``` ## 故障排除 ### 常见问题 **1. 浏览器安装失败** ```bash playwright install --with-deps ``` **2. 依赖安装失败** ```bash pip install --upgrade pip pip install -r requirements.txt ``` **3. 测试超时** 检查 `.env` 中的 `PAGE_LOAD_TIMEOUT` 设置 **4. 页面元素定位失败** 使用开发者工具检查元素选择器是否正确 ### 获取帮助 - 查看详细日志: 运行 `python scripts/run_tests.py -v` - 查看 Playwright 文档: https://playwright.dev/python/ - 查看 pytest 文档: https://docs.pytest.org/ ## 许可证 本测试框架基于 MIT 许可证开源。