共计 3041 个字符,预计需要花费 8 分钟才能阅读完成。
为什么需要自动化测试
最近参与了一个电商项目,每次发版前都要手动测试核心路径:登录→搜索商品→加入购物车→结算。某次紧急上线时,测试组连夜执行了 200 多次重复操作,结果还是漏掉了优惠券叠加计算的边界条件。这种重复劳动不仅效率低,更重要的是难以保证测试覆盖率。自动化测试正是为了解决这些问题而生。

主流 Web 测试工具选型
- Selenium:老牌框架,支持所有主流浏览器,生态成熟但需要自行封装基础功能
- Cypress:开箱即用的现代方案,调试体验好但不支持多标签页测试
- Playwright:微软出品,支持移动端仿真和视频录制,适合复杂场景
对于初学者,建议从 Selenium 起步,因为:
– 学习资料丰富
– 可自由组合测试框架 (pytest/unittest)
– 企业使用率最高
环境准备
先安装必要组件(建议使用 Python 3.8+):
pip install selenium pytest allure-pytest
下载对应浏览器的 WebDriver(以 Chrome 为例):
1. 访问 ChromeDriver 官网
2. 下载与本地 Chrome 版本匹配的驱动
3. 将 exe 文件放在项目根目录
基础框架搭建
创建项目结构:
project/
├── pages/ # Page Object 类
├── tests/ # 测试用例
├── utils/ # 工具类
├── conftest.py # pytest 配置
└── requirements.txt
第一个测试用例示例(tests/test_login.py):
import allure
import pytest
from pages.login_page import LoginPage
@allure.story("用户认证模块")
class TestLogin:
@allure.title("验证成功登录场景")
def test_valid_login(self, browser):
"""测试使用正确凭证登录"""
login_page = LoginPage(browser)
home_page = login_page.login("standard_user", "secret_sauce")
assert home_page.get_title() == "Products"
@allure.title("验证失败登录场景")
def test_invalid_login(self, browser):
"""测试使用错误凭证登录"""
login_page = LoginPage(browser)
login_page.login("locked_user", "wrong_pass")
assert "Epic sadface" in login_page.get_error_message()
Page Object 模式实现
UML 类图关系:
BasePage ◄── LoginPage
BasePage ◄── HomePage
基础页面类(pages/base_page.py):
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 find(self, locator):
return self.wait.until(EC.presence_of_element_located(locator))
def click(self, locator):
self.wait.until(EC.element_to_be_clickable(locator)).click()
登录页面类(pages/login_page.py):
from .base_page import BasePage
class LoginPage(BasePage):
# 元素定位器(推荐使用 CSS 选择器)USERNAME = ("css", "#user-name")
PASSWORD = ("css", "#password")
LOGIN_BTN = ("css", ".btn_action")
ERROR_MSG = ("css", "[data-test='error']")
def login(self, username, password):
self.find(self.USERNAME).send_keys(username)
self.find(self.PASSWORD).send_keys(password)
self.click(self.LOGIN_BTN)
return HomePage(self.driver) # 返回下一页对象
def get_error_message(self):
return self.find(self.ERROR_MSG).text
智能等待策略
不要使用固定 sleep!推荐两种等待方式:
- 显式等待(示例见 BasePage 类)
- 自定义等待条件(utils/wait_conditions.py):
def element_has_class(locator, class_name):
"""自定义等待条件:元素包含指定 class"""
def predicate(driver):
element = driver.find_element(*locator)
return class_name in element.get_attribute("class")
return predicate
Jenkins 集成要点
- 安装必要插件:
- Allure Jenkins Plugin
-
Git Plugin
-
创建 Freestyle 项目配置:
# Build Steps
python -m pytest tests/ --alluredir=./allure-results
# Post-build
Allure Report > Path: allure-results
- 设置定时构建(可选):
H */12 * * * # 每 12 小时运行一次
常见坑点解决方案
- 动态元素处理 :
- 使用部分属性匹配:
[class^='dynamic-'] -
通过父元素定位:
.parent > .child -
iframe 切换 :
# 进入 iframe driver.switch_to.frame("frame_name") # 返回主文档 driver.switch_to.default_content() -
文件下载 :
# Chrome 配置示例 options = webdriver.ChromeOptions() prefs = { "download.default_directory": "/path/to/downloads", "download.prompt_for_download": False } options.add_experimental_option("prefs", prefs)
延伸学习建议
掌握 Web 自动化后可以继续学习:
- API 测试 :
- Requests 库 + Pytest
-
契约测试(Pact)
-
性能测试 :
- Locust 分布式压测
-
JMeter 场景设计
-
移动端测试 :
- Appium 跨平台方案
- ADB 命令实战
建议每天实践 1 小时,两个月内就能达到企业初级自动化测试工程师的水平。记住:自动化测试不是替代手工测试,而是让测试工程师从重复劳动中解放出来,更专注于探索性测试和质量体系建设。
