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

调试技巧:

  1. 失败时自动截图:
@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)
  1. 慢动作模式观察执行:
@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分钟,同时覆盖了原先手动测试未涉及的边缘场景。关键在于:

  1. 环境配置与测试逻辑彻底分离
  2. 页面操作集中管理降低维护成本
  3. 并行执行充分利用硬件资源

更多推荐