Pytest+Playwright实战:5分钟搞定电商登录模块自动化测试(含多环境切换指南)
·
Pytest+Playwright实战:5分钟搞定电商登录模块自动化测试(含多环境切换指南)
电商平台的登录模块作为用户旅程的起点,其稳定性直接影响转化率和用户体验。本文将手把手教你如何用Pytest+Playwright构建一个可复用、支持多环境切换的自动化测试方案,从零开始实现高效验证。
1. 环境准备与框架搭建
首先确保你的开发环境已安装Python 3.8+和Node.js。通过以下命令安装核心依赖:
pip install pytest playwright
playwright install
创建项目目录结构:
/ecommerce_test/
├── conftest.py # 全局测试配置
├── pages/ # 页面对象类
├── tests/ # 测试用例
└── utils/ # 工具函数
在conftest.py中配置基础Fixture:
import pytest
from playwright.sync_api import sync_playwright
@pytest.fixture(scope="session")
def browser():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
yield browser
browser.close()
@pytest.fixture
def page(browser):
context = browser.new_context()
page = context.new_page()
yield page
context.close()
2. 登录页面对象封装
采用Page Object模式封装登录操作,创建pages/login_page.py:
class LoginPage:
def __init__(self, page):
self.page = page
self.username_input = page.locator("#username")
self.password_input = page.locator("#password")
self.submit_button = page.locator("#login-btn")
self.error_message = page.locator(".error-message")
def navigate(self, base_url):
self.page.goto(f"{base_url}/login")
return self
def login(self, username, password):
self.username_input.fill(username)
self.password_input.fill(password)
self.submit_button.click()
3. 多环境参数化测试实现
在tests/test_login.py中实现多环境测试:
import pytest
from pages.login_page import LoginPage
# 定义环境配置字典
ENV_CONFIGS = {
"staging": {
"base_url": "https://staging.example.com",
"valid_user": ("user_stage", "pass123")
},
"production": {
"base_url": "https://example.com",
"valid_user": ("user_prod", "securePass!")
}
}
@pytest.mark.parametrize("env", ["staging", "production"])
def test_successful_login(env, page):
config = ENV_CONFIGS[env]
login_page = LoginPage(page).navigate(config["base_url"])
login_page.login(*config["valid_user"])
assert page.url == f"{config['base_url']}/dashboard"
# 异常场景测试用例
TEST_DATA = [
("locked_user", "invalid", "Account locked"),
("", "emptyPass", "Username required"),
("admin", "", "Password required")
]
@pytest.mark.parametrize("username,password,expected_error", TEST_DATA)
def test_login_failure(page, username, password, expected_error):
login_page = LoginPage(page).navigate(ENV_CONFIGS["staging"]["base_url"])
login_page.login(username, password)
assert expected_error in login_page.error_message.text_content()
4. 高级技巧:环境切换与并行执行
通过命令行参数动态切换环境,修改conftest.py:
def pytest_addoption(parser):
parser.addoption("--env", action="store", default="staging")
@pytest.fixture(scope="session")
def env(request):
return request.config.getoption("--env")
@pytest.fixture
def base_url(env):
return ENV_CONFIGS[env]["base_url"]
使用pytest-xdist实现并行测试:
pip install pytest-xdist
pytest -n 4 --env=staging # 使用4个worker并行执行
5. 测试报告与调试技巧
生成Allure报告:
pip install allure-pytest
pytest --alluredir=./allure-results
allure serve ./allure-results
调试技巧:
- 失败时自动截图:
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
outcome = yield
report = outcome.get_result()
if report.failed and "page" in item.funcargs:
page = item.funcargs["page"]
screenshot = page.screenshot(path=f"error_{item.name}.png")
allure.attach(screenshot, name="screenshot", attachment_type=allure.attachment_type.PNG)
- 慢动作模式观察执行:
@pytest.fixture
def page(browser):
context = browser.new_context(
viewport={"width": 1920, "height": 1080},
record_video_dir="videos/"
)
page = context.new_page()
page.set_default_timeout(10000) # 10秒超时
yield page
context.close()
6. 持续集成集成示例
GitHub Actions配置示例(.github/workflows/test.yml):
name: E2E Tests
on: [push]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
env: [staging, production]
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
- run: pip install -r requirements.txt
- run: playwright install
- run: pytest -n auto --env=${{ matrix.env }}
- uses: actions/upload-artifact@v3
if: always()
with:
name: allure-results-${{ matrix.env }}
path: allure-results/
实际项目中,我们通过这种方案将登录模块的测试时间从原来的15分钟缩短到3分钟,同时覆盖了原先手动测试未涉及的边缘场景。关键在于:
- 环境配置与测试逻辑彻底分离
- 页面操作集中管理降低维护成本
- 并行执行充分利用硬件资源
更多推荐

所有评论(0)