测试模型

自动化测试框架架构设计与常用模型模式

自动化测试架构模型

自动化测试框架的架构设计是成功实施的关键。常见的架构模式包括以下几种。

最流行
Page Object Model (POM)
页面对象模型,每个页面对应一个类,封装页面元素和操作方法。最主流的 Web 自动化测试模式。
Selenium Playwright Cypress
推荐
Page Factory
POM 的扩展,使用@FindBy注解自动初始化元素。减少 findElement 调用,代码更简洁。
Selenium Java
进阶
Screenplay Pattern
以用户(Actor)为中心,通过任务(Task)、交互(Interaction)构建测试。更贴近业务场景。
Serenity BDD Java
基础
Keyword-Driven
关键字驱动,将测试操作封装为关键字,通过 Excel/表格定义测试用例。非技术人员可参与。
Robot Framework Katalon
基础
Data-Driven
数据驱动,测试逻辑与测试数据分离。通过 Excel、CSV、数据库等数据源驱动测试执行。
pytest TestNG
进阶
BDD (Behavior-Driven)
行为驱动开发,使用 Gherkin 语言编写验收用例。技术语言与业务语言桥接。
Behave Cucumber SpecFlow

Page Object Model 详解

架构图

👤 用户 🎯 测试框架 (pytest) 📄 Page Objects ⚙️ Selenium Driver 🌐 浏览器 🏢 Web 应用

项目目录结构

project/ ├── pages/ # 页面对象层 │ ├── base_page.py # 基础页面对象 │ ├── login_page.py # 登录页面 │ ├── home_page.py # 首页 │ └── register_page.py # 注册页面 ├── tests/ # 测试用例层 │ ├── conftest.py # pytest 配置 │ ├── test_login.py │ └── test_register.py ├── data/ # 测试数据 │ └── test_data.yaml ├── utils/ # 工具类 │ ├── driver_factory.py │ └── logger.py ├── reports/ # 测试报告 └── requirements.txt

BasePage 实现

from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class BasePage: def __init__(self, driver): self.driver = driver self.wait = WebDriverWait(driver, 10) def click(self, locator): self.wait.until(EC.element_to_be_clickable(locator)).click() def input(self, locator, text): el = self.wait.until(EC.presence_of_element_located(locator)) el.clear() el.send_keys(text) def get_text(self, locator): return self.wait.until(EC.presence_of_element_located(locator)).text def is_element_visible(self, locator): try: self.wait.until(EC.visibility_of_element_located(locator)) return True except: return False def switch_to_frame(self, locator): iframe = self.wait.until(EC.presence_of_element_located(locator)) self.driver.switch_to.frame(iframe)

LoginPage 示例

from selenium.webdriver.common.by import By from pages.base_page import BasePage class LoginPage(BasePage): USERNAME_INPUT = (By.ID, "username") PASSWORD_INPUT = (By.ID, "password") LOGIN_BUTTON = (By.ID, "loginBtn") FORGOT_LINK = (By.ID, "forgotPwd") def login(self, username, password): self.input(self.USERNAME_INPUT, username) self.input(self.PASSWORD_INPUT, password) self.click(self.LOGIN_BUTTON) def login_success(self, username, password): self.login(username, password) return self.driver.switch_to.alert() def get_error_message(self): return self.driver.switch_to.alert().text

测试用例示例

import pytest from pages.login_page import LoginPage class TestLogin: def test_login_success(self, driver): login_page = LoginPage(driver) login_page.driver.get("file:///F:/autotest_project/login.html") alert = login_page.login_success("admin", "123456") assert "登录成功" in alert.text alert.accept() def test_login_empty(self, driver): login_page = LoginPage(driver) login_page.driver.get("file:///F:/autotest_project/login.html") login_page.click(LoginPage.LOGIN_BUTTON) error = login_page.get_error_message() assert "请输入" in error

架构模式对比

模式 学习难度 维护成本 适用场景 推荐度
POM ★★☆ 中大型 Web 项目 ★★★★★
Page Factory ★★☆ Java 项目 ★★★★☆
Screenplay ★★★ 复杂业务系统 ★★★★☆
BDD ★★★ 敏捷/TDD 团队 ★★★★☆
Keyword-Driven ★☆☆ 非技术团队 ★★★☆☆
Data-Driven ★☆☆ 数据量大的场景 ★★★★☆

测试金字塔

自动化测试应遵循金字塔模型,底层单元测试多而快,顶层 UI 测试少而精。

UI 测试 (少量)
接口/集成测试 (适中)
单元测试 (大量)

单元测试

快速(< 100ms)、稳定、成本低。覆盖核心逻辑。

接口测试

验证 API 契约、数据流向。Mock 外部依赖。

UI 测试

端到端验证,数量少但覆盖关键业务流程。

反模式:不要用 UI 测试覆盖所有逻辑。UI 测试慢(> 10s)、不稳定、维护成本高。应将更多测试下沉到单元/接口层。