前言:Hello 大家好!我是励志死磕计算机 ~ 上一篇我们搭建了Pytest+PO模式的基础框架,解决了"零散脚本"的问题。但在企业真实测试场景中,基础框架还会暴露三个核心痛点:多组测试数据需要重复写脚本、用例失败后无法快速定位问题、网络波动导致脚本不稳定。今天这篇文章,我们就对基础框架进行"进阶升级",手把手实现数据驱动测试(DDT)、搭建企业级日志体系、配置失败重试与自动截图,彻底解决这三大痛点,让你的自动化框架更贴合企业落地需求!全程代码实战,复制即可集成到自己的框架中~
本文核心目标:
-
理解数据驱动核心思想,掌握Excel/JSON两种数据驱动实现方式(多组数据批量测试)
-
搭建"控制台+文件"双输出的企业级日志体系,实现测试过程全追溯
-
配置失败重试与自动截图机制,大幅提升脚本稳定性(失败率降低80%+)
-
将三大优化特性整合到基础框架中,实现"多数据+可追溯+高稳定"的企业级自动化
-
掌握优化后框架的运行与问题排查技巧
一、前置准备:基础框架回顾与依赖安装
本次优化基于上一篇搭建的Pytest+PO基础框架,先回顾框架核心目录结构(确保大家环境一致),再安装新增依赖。
1. 基础框架目录回顾
ui_auto_framework/ # 项目根目录
├── config/ # 配置层
│ └── config.py # 全局配置
├── pages/ # 页面对象层
│ ├── base_page.py # 基础页面
│ ├── login_page.py# 登录页
│ └── home_page.py # 首页
├── tests/ # 测试用例层
│ └── test_login.py# 登录用例
├── utils/ # 工具层
│ └── __init__.py # 空文件,标记为模块
├── conftest.py # Pytest Fixture配置
└── requirements.txt # 依赖清单
2. 新增依赖安装
打开cmd/终端,执行以下命令安装本次所需依赖:
# 读取Excel测试数据
pip install openpyxl==3.1.2
# 失败重试插件
pip install pytest-rerunfailures==12.0
# 超时控制插件(防止用例无限等待)
pip install pytest-timeout==2.1.0
# JSON数据处理(Python内置,无需安装,确保版本3.8+)
更新requirements.txt文件(添加新增依赖,方便团队复用):
pytest==7.4.0
pytest-html==3.2.0
selenium==4.11.2
webdriver-manager==4.0.0
python-dotenv==1.0.0
openpyxl==3.1.2
pytest-rerunfailures==12.0
pytest-timeout==2.1.0
二、核心优化一:数据驱动测试(DDT)全实现
数据驱动测试(Data-Driven Testing)的核心思想是"数据与代码分离"------将测试数据(如不同账号、输入参数、预期结果)单独存储在Excel/JSON文件中,脚本通过读取数据批量执行用例,无需重复编写相同逻辑的代码。企业中常用这种方式提升测试覆盖率,新增数据无需修改脚本。
我们以"多账号登录测试"为实战场景,分别实现Excel数据驱动和JSON数据驱动。
1. Excel数据驱动(企业最常用)
适用场景:测试数据结构简单(如账号-密码-预期结果)、需要非技术人员(如测试助理)维护测试数据的场景。核心工具:openpyxl库(读取Excel文件)。
(1)步骤1:设计Excel测试数据模板
在项目根目录创建testdata/文件夹(用于存放所有测试数据文件),新建Excel文件login_data.xlsx,设计如下测试数据模板(3列4行,第一行为表头):
| 用户名 | 密码 | 预期结果 |
|---|---|---|
| test_user1 | test_pass1 | 欢迎您,test_user1 |
| test_user2 | wrong_pass2 | 用户名或密码错误 |
| wrong_user3 | test_pass3 | 用户名或密码错误 |
| 请输入用户名 |
小技巧:Excel文件建议放在版本控制中(如Git),方便团队共享;表头命名要清晰,避免歧义(如"预期结果"而非"结果")。
(2)步骤2:封装Excel数据读取工具
在utils/目录下新建excel_utils.py文件,封装读取Excel数据的公共方法(可复用):
# 文件名:utils/excel_utils.py
from openpyxl import load_workbook
import os
# 获取测试数据文件的绝对路径(避免路径问题)
def get_testdata_path(filename):
return os.path.join(os.path.dirname(os.path.dirname(__file__)), "testdata", filename)
# 读取Excel测试数据
def read_excel_data(filename, sheet_name="Sheet1"):
# 加载Excel文件
wb = load_workbook(get_testdata_path(filename))
# 选择工作表(默认Sheet1)
sheet = wb[sheet_name]
# 获取最大行数和列数
max_row = sheet.max_row
max_col = sheet.max_column
# 存储测试数据的列表
test_data = []
# 跳过表头(从第2行开始读取)
for row in range(2, max_row + 1):
row_data = {}
for col in range(1, max_col + 1):
# 表头作为key,单元格值作为value
key = sheet.cell(row=1, column=col).value
value = sheet.cell(row=row, column=col).value
row_data[key] = value
# 将每行数据添加到列表中
test_data.append(row_data)
# 关闭Excel文件
wb.close()
return test_data
# 测试读取功能(运行该文件可验证)
if __name__ == "__main__":
data = read_excel_data("login_data.xlsx")
print("读取的Excel测试数据:", data)
# 输出示例:
# [{'用户名': 'test_user1', '密码': 'test_pass1', '预期结果': '欢迎您,test_user1'}, ...]
(3)步骤3:结合Pytest参数化实现数据驱动
修改tests/test_login.py文件,通过@pytest.mark.parametrize装饰器将读取的Excel数据传入测试用例:
# 文件名:tests/test_login.py
import pytest
from pages.login_page import LoginPage
from pages.home_page import HomePage
from utils.excel_utils import read_excel_data
from utils.logger import logger # 后续日志会集成,先导入占位
# 读取Excel测试数据
login_excel_data = read_excel_data("login_data.xlsx")
class TestLogin:
# 数据驱动测试:多账号登录(Excel数据)
@pytest.mark.parametrize("test_data", login_excel_data)
def test_login_with_excel_data(self, init_driver, test_data):
logger.info(f"开始执行Excel数据驱动用例:{test_data}")
driver = init_driver
login_page = LoginPage(driver)
home_page = HomePage(driver)
# 执行登录操作(从Excel数据中获取用户名和密码)
login_page.login(test_data["用户名"], test_data["密码"])
# 断言预期结果
if "欢迎您" in test_data["预期结果"]:
# 登录成功场景:断言首页欢迎信息
assert test_data["预期结果"] in login_page.get_welcome_message()
logger.info(f"用例执行成功:{test_data}")
else:
# 登录失败场景:断言错误提示
assert test_data["预期结果"] == login_page.get_error_message()
logger.info(f"用例执行成功:{test_data}")
2. JSON数据驱动(复杂场景适用)
适用场景:测试数据结构复杂(如嵌套数据、多字段验证)、需要程序自动化生成数据的场景。JSON是轻量级数据交换格式,Python内置json模块可直接处理。
(1)步骤1:设计JSON测试数据模板
在testdata/目录下新建login_data.json文件,设计嵌套结构的测试数据(如添加"测试场景"描述):
{
"login_tests": [
{
"case_id": "login_001",
"case_name": "正常登录-正确账号密码",
"data": {
"username": "test_user1",
"password": "test_pass1"
},
"expected": {
"message": "欢迎您,test_user1",
"is_home_page": true
}
},
{
"case_id": "login_002",
"case_name": "异常登录-密码错误",
"data": {
"username": "test_user2",
"password": "wrong_pass2"
},
"expected": {
"message": "用户名或密码错误",
"is_home_page": false
}
},
{
"case_id": "login_003",
"case_name": "异常登录-空值输入",
"data": {
"username": "",
"password": ""
},
"expected": {
"message": "请输入用户名",
"is_home_page": false
}
}
]
}
(2)步骤2:封装JSON数据读取工具
在utils/目录下新建json_utils.py文件,封装读取JSON数据的公共方法:
# 文件名:utils/json_utils.py
import json
import os
# 获取测试数据文件的绝对路径
def get_testdata_path(filename):
return os.path.join(os.path.dirname(os.path.dirname(__file__)), "testdata", filename)
# 读取JSON测试数据
def read_json_data(filename):
with open(get_testdata_path(filename), "r", encoding="utf-8") as f:
# 加载JSON数据
data = json.load(f)
return data
# 测试读取功能
if __name__ == "__main__":
data = read_json_data("login_data.json")
print("读取的JSON测试数据:", data)
# 输出示例:{'login_tests': [{'case_id': 'login_001', ...}]}
(3)步骤3:结合Pytest参数化实现JSON数据驱动
在tests/test_login.py中新增JSON数据驱动的测试用例:
# 文件名:tests/test_login.py
from utils.json_utils import read_json_data # 导入JSON读取工具
# 读取JSON测试数据
login_json_data = read_json_data("login_data.json")["login_tests"] # 取login_tests列表
class TestLogin:
# 其他用例...
# 数据驱动测试:多账号登录(JSON数据,复杂场景)
@pytest.mark.parametrize("test_data", login_json_data)
def test_login_with_json_data(self, init_driver, test_data):
logger.info(f"开始执行JSON数据驱动用例:{test_data['case_name']}(case_id:{test_data['case_id']})")
driver = init_driver
login_page = LoginPage(driver)
home_page = HomePage(driver)
# 执行登录操作(从JSON数据中获取嵌套的用户名和密码)
login_page.login(test_data["data"]["username"], test_data["data"]["password"])
# 多条件断言(嵌套预期结果)
# 1. 断言提示信息
if test_data["expected"]["is_home_page"]:
assert test_data["expected"]["message"] in login_page.get_welcome_message()
# 2. 额外断言:是否跳转到首页
assert home_page.is_home_page()
else:
assert test_data["expected"]["message"] == login_page.get_error_message()
# 2. 额外断言:未跳转到首页
assert not home_page.is_home_page()
logger.info(f"用例执行成功:{test_data['case_name']}")
3. 数据驱动核心优势总结
-
效率提升:多组数据批量执行,无需重复编写相同逻辑的脚本
-
维护成本低:新增/修改测试数据无需修改代码,非技术人员也可维护
-
覆盖率提升:轻松覆盖正常场景、异常场景、边界场景(如空值、超长字符)
-
可扩展性强:支持Excel/JSON/CSV等多种数据格式,适配不同场景
二、核心优化二:企业级日志体系搭建
日志是自动化测试的"问题定位利器"------企业中自动化脚本运行在Jenkins等CI工具上,无法实时查看界面操作,此时日志就成为追溯测试过程、定位失败原因的核心依据。一个合格的日志体系需要满足:可区分日志级别、同时输出到控制台和文件、包含关键信息(时间、操作步骤、异常详情)。
我们基于Python内置的logging模块,搭建企业级日志体系。
1. 日志体系核心需求
-
日志级别:支持DEBUG(调试)、INFO(正常信息)、WARNING(警告)、ERROR(错误)四级,方便筛选关键信息
-
输出方式:同时输出到控制台(实时查看)和文件(长期保存,追溯历史)
-
日志格式:包含"时间戳、日志级别、模块名、操作描述",格式规范统一
-
文件管理:按日期生成日志文件(如test_log_20240520.log),避免单个文件过大
2. 封装日志工具(utils/logger.py)
在utils/目录下新建logger.py文件,封装日志工具(可直接复用):
# 文件名:utils/logger.py
import logging
import os
from datetime import datetime
# 1. 创建日志保存目录(若不存在)
LOG_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), "logs")
if not os.path.exists(LOG_DIR):
os.makedirs(LOG_DIR)
# 2. 定义日志文件名(按日期生成)
LOG_FILE_NAME = f"test_log_{datetime.strftime(datetime.now(), '%Y%m%d')}.log"
LOG_FILE_PATH = os.path.join(LOG_DIR, LOG_FILE_NAME)
# 3. 配置日志格式
LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s"
# 解释格式:时间戳 - 日志器名称 - 级别 - 文件名:行号 - 日志信息
# 4. 初始化日志器
logger = logging.getLogger("UI_AUTO_LOGGER")
logger.setLevel(logging.DEBUG) # 全局日志级别(DEBUG,最低级别,所有日志都能输出)
# 5. 配置控制台处理器(输出到控制台)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO) # 控制台只输出INFO及以上级别
console_handler.setFormatter(logging.Formatter(LOG_FORMAT))
# 6. 配置文件处理器(输出到文件)
file_handler = logging.FileHandler(LOG_FILE_PATH, encoding="utf-8")
file_handler.setLevel(logging.DEBUG) # 文件输出所有级别(包括DEBUG)
file_handler.setFormatter(logging.Formatter(LOG_FORMAT))
# 7. 给日志器添加处理器(避免重复输出)
if not logger.handlers:
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# 测试日志功能(运行该文件可验证)
if __name__ == "__main__":
logger.debug("这是DEBUG级日志:调试信息,如变量值")
logger.info("这是INFO级日志:正常操作,如用例开始执行")
logger.warning("这是WARNING级日志:警告信息,如元素定位超时但重试成功")
logger.error("这是ERROR级日志:错误信息,如用例执行失败")
3. 日志集成到框架(全流程追溯)
将日志工具集成到页面对象层、测试用例层、Fixture中,实现测试全流程的日志记录:
(1)集成到页面对象层(pages/base_page.py)
# 文件名:pages/base_page.py
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from utils.logger import logger # 导入日志器
from config.config import config
class BasePage:
def __init__(self, driver):
self.driver = driver
self.base_url = config.BASE_URL
self.explicitly_wait = config.EXPLICITLY_WAIT
def open(self, url):
logger.info(f"访问页面:{url}") # 记录访问操作
self.driver.get(url)
def wait_element_clickable(self, locator):
try:
element = WebDriverWait(self.driver, self.explicitly_wait).until(
EC.element_to_be_clickable(locator)
)
logger.info(f"元素可点击:{locator}") # 记录元素状态
return element
except TimeoutException:
logger.error(f"等待元素可点击超时:{locator}") # 记录错误
raise
# 其他方法(input_text、click、get_element_text等)都添加对应的日志,参考上面的写法
(2)集成到测试用例层(tests/test_login.py)
前面的数据驱动用例中已经导入了日志器,这里补充完整的日志记录逻辑:
# 文件名:tests/test_login.py
import pytest
from pages.login_page import LoginPage
from pages.home_page import HomePage
from utils.excel_utils import read_excel_data
from utils.logger import logger
login_excel_data = read_excel_data("login_data.xlsx")
class TestLogin:
@pytest.mark.parametrize("test_data", login_excel_data)
def test_login_with_excel_data(self, init_driver, test_data):
logger.info("="*50)
logger.info(f"开始执行Excel数据驱动用例:{test_data}")
driver = init_driver
login_page = LoginPage(driver)
home_page = HomePage(driver)
try:
login_page.login(test_data["用户名"], test_data["密码"])
if "欢迎您" in test_data["预期结果"]:
assert test_data["预期结果"] in login_page.get_welcome_message()
logger.info(f"用例执行成功:{test_data}")
else:
assert test_data["预期结果"] == login_page.get_error_message()
logger.info(f"用例执行成功:{test_data}")
except Exception as e:
logger.error(f"用例执行失败:{test_data},错误信息:{str(e)}", exc_info=True) # exc_info=True记录完整异常栈
raise # 抛出异常,让Pytest标记用例失败
finally:
logger.info("用例执行结束")
logger.info("="*50)
(3)集成到Fixture(conftest.py)
# 文件名:conftest.py
import pytest
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from config.config import config
from utils.logger import logger # 导入日志器
import os
from datetime import datetime
@pytest.fixture(scope="function")
def init_driver(request):
logger.info("="*50)
logger.info("开始初始化浏览器驱动")
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.maximize_window()
driver.implicitly_wait(config.IMPLICITLY_WAIT)
logger.info("浏览器驱动初始化完成")
def fin():
logger.info("开始执行后置操作:关闭浏览器")
driver.quit()
logger.info("浏览器驱动已关闭")
logger.info("="*50)
request.addfinalizer(fin)
yield driver
# 其他Fixture也添加对应的日志记录...
4. 日志查看与使用技巧
-
控制台查看:运行用例时实时查看INFO及以上级别日志,快速定位当前问题
-
文件查看 :日志文件保存在
logs/目录下,按日期命名,可通过搜索关键词(如"ERROR""用例执行失败")快速筛选失败用例的详细信息 -
日志级别调整:正式运行时可将控制台日志级别调整为WARNING,只关注警告和错误信息;调试时调整为DEBUG,查看详细调试信息
三、核心优化三:失败重试+自动截图(提升稳定性)
自动化脚本不稳定是企业落地的一大痛点------网络波动、页面加载延迟、元素偶发不可见等问题,都会导致用例"误失败"。通过"失败重试"(偶发问题自动重试)和"失败自动截图"(失败时保存页面状态),可大幅提升脚本稳定性,同时方便快速定位真实失败原因。
1. 失败重试:pytest-rerunfailures插件
核心功能:用例执行失败后,自动重试指定次数,若重试成功则标记为通过(解决偶发失败问题)。
(1)两种配置方式
方式1:命令行参数配置(临时生效)
运行用例时添加--reruns参数指定重试次数,--reruns-delay指定重试间隔(秒):
# 失败后重试2次,每次间隔1秒
pytest tests/test_login.py -v -s --reruns=2 --reruns-delay=1
方式2:配置文件永久生效(推荐)
在项目根目录创建pytest.ini文件(Pytest的配置文件),添加以下内容,永久配置失败重试:
[pytest]
# 失败后重试2次,间隔1秒
addopts = --reruns=2 --reruns-delay=1
# 测试用例搜索路径(默认tests目录)
testpaths = tests
# 测试文件命名规则
python_files = test_*.py
# 测试类命名规则
python_classes = Test*
# 测试方法命名规则
python_functions = test_*
配置完成后,直接运行pytest命令即可自动应用失败重试规则,无需每次添加命令行参数。
2. 失败自动截图:Fixture+截图工具
核心逻辑:通过Pytest的钩子函数捕获用例执行结果,若用例失败,则调用截图工具保存当前页面截图,截图文件名包含用例名和时间戳,方便对应查看。
(1)封装截图工具(utils/screenshot_utils.py)
# 文件名:utils/screenshot_utils.py
import os
from datetime import datetime
from utils.logger import logger
# 创建截图保存目录
SCREENSHOT_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), "screenshots")
if not os.path.exists(SCREENSHOT_DIR):
os.makedirs(SCREENSHOT_DIR)
# 失败自动截图
def take_screenshot(driver, case_name):
# 生成截图文件名(用例名+时间戳)
timestamp = datetime.strftime(datetime.now(), "%Y%m%d%H%M%S")
screenshot_name = f"{case_name}_{timestamp}.png"
screenshot_path = os.path.join(SCREENSHOT_DIR, screenshot_name)
# 保存截图
driver.save_screenshot(screenshot_path)
logger.error(f"用例执行失败,截图已保存至:{screenshot_path}")
return screenshot_path
(2)在Fixture中集成失败截图
修改conftest.py文件,通过pytest_runtest_makereport钩子函数捕获用例执行结果,失败时调用截图工具:
# 文件名:conftest.py
import pytest
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from config.config import config
from utils.logger import logger
from utils.screenshot_utils import take_screenshot # 导入截图工具
import os
from datetime import datetime
@pytest.fixture(scope="function")
def init_driver(request):
logger.info("="*50)
logger.info("开始初始化浏览器驱动")
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.maximize_window()
driver.implicitly_wait(config.IMPLICITLY_WAIT)
logger.info("浏览器驱动初始化完成")
def fin():
# 判断用例是否失败
if request.node.rep_call.failed:
# 调用截图工具,用例名作为截图文件名前缀
take_screenshot(driver, request.node.name)
logger.info("开始执行后置操作:关闭浏览器")
driver.quit()
logger.info("浏览器驱动已关闭")
logger.info("="*50)
request.addfinalizer(fin)
yield driver
# 钩子函数:捕获用例执行结果(必须添加,否则无法判断用例是否失败)
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
outcome = yield
rep = outcome.get_result()
# 将执行结果存储到item对象中,供fin()函数调用
setattr(item, "rep_call", rep)
# 超时控制:用例执行超过10秒自动终止(避免无限等待)
@pytest.fixture(scope="function")
def timeout_setup():
return 10
3. 稳定性优化效果验证
运行测试用例,模拟两种场景验证优化效果:
-
偶发失败场景:故意让某个用例因网络延迟偶发失败,运行后可看到用例失败后自动重试,若重试成功则标记为通过
-
真实失败场景 :修改某个用例的预期结果(确保失败),运行后可看到用例失败后重试2次,最终失败,同时在
screenshots/目录下生成对应的失败截图
最佳实践:失败重试次数建议设置为2次,间隔1-2秒------次数过多会增加总运行时间,次数过少无法解决偶发问题。
四、优化后框架整合与运行
将数据驱动、日志体系、失败重试三大优化特性整合后,框架目录结构如下(新增testdata、logs、screenshots文件夹及对应工具文件):
ui_auto_framework/ # 项目根目录
├── config/ # 配置层
│ └── config.py # 全局配置
├── pages/ # 页面对象层
│ ├── base_page.py # 基础页面
│ ├── login_page.py# 登录页
│ └── home_page.py # 首页
├── tests/ # 测试用例层
│ └── test_login.py# 登录用例(集成数据驱动)
├── testdata/ # 测试数据层
│ ├── login_data.xlsx # Excel测试数据
│ └── login_data.json # JSON测试数据
├── utils/ # 工具层
│ ├── __init__.py
│ ├── excel_utils.py # Excel读取工具
│ ├── json_utils.py # JSON读取工具
│ ├── logger.py # 日志工具
│ └── screenshot_utils.py # 截图工具
├── logs/ # 日志输出目录
├── screenshots/ # 截图输出目录
├── conftest.py # Pytest Fixture配置(集成日志、截图)
├── pytest.ini # Pytest配置文件(失败重试)
└── requirements.txt # 依赖清单
1. 框架运行命令
# 1. 运行所有测试用例(自动应用失败重试、日志、截图)
pytest -v -s
# 2. 运行指定测试文件,生成测试报告
pytest tests/test_login.py -v -s --html=reports/test_report.html
# 3. 只运行Excel数据驱动的用例(通过标记筛选,需给用例加@pytest.mark.excel)
pytest -v -s -m excel
# 4. 只运行JSON数据驱动的用例(通过标记筛选,需给用例加@pytest.mark.json)
pytest -v -s -m json
2. 运行结果查看
-
控制台:实时查看INFO级别日志,了解用例执行进度和结果
-
日志文件:logs/目录下按日期生成日志文件,包含完整的执行过程和异常详情
-
截图文件:失败用例的截图保存在screenshots/目录下,文件名包含用例名和时间戳
-
测试报告:reports/目录下的HTML报告,包含用例通过率、执行时间、失败详情,可直接打开查看
五、实战练习(巩固优化特性)
基于优化后的框架,完成以下实战练习,巩固三大优化特性的使用:
需求:实现"商品搜索"功能的多数据测试,涵盖以下场景:
-
用Excel存储测试数据:搜索关键词(Python书籍、Java教程、空值、超长字符)、预期结果(是否有搜索结果、结果数量)
-
封装商品搜索页面对象(product_search_page.py),集成日志记录
-
编写数据驱动测试用例,集成失败重试和自动截图
-
运行用例并查看日志、截图、测试报告,验证优化效果
提示:商品搜索页面对象需继承BasePage,复用公共操作;测试数据模板参考登录数据的设计思路,新增"结果数量"列;运行时可故意制造一个失败场景(如修改预期结果),验证失败截图功能。
六、总结与下一篇预告
本篇文章我们完成了企业级UI自动化框架的三大核心优化,总结一下重点:
-
数据驱动:实现Excel/JSON两种数据驱动方式,数据与代码分离,提升测试覆盖率和维护效率
-
日志体系:搭建"控制台+文件"双输出的企业级日志,实现测试全流程追溯,快速定位问题
-
稳定性优化:通过失败重试解决偶发问题,失败自动截图保存页面状态,大幅提升脚本稳定性
-
框架整合:将三大特性无缝集成到基础框架中,形成"多数据+可追溯+高稳定"的企业级雏形
下一篇文章我们将进入"企业级落地"阶段,学习Jenkins持续集成+Allure精美报告,实现"代码提交→自动测试→报告生成→邮件通知"的全流程自动化,彻底解决"自动化测试只在本地跑,无法落地团队"的核心痛点!
如果这篇文章对你有帮助,别忘了点赞+收藏+关注,后续会持续更新UI自动化系列教程~ 有任何问题欢迎在评论区留言!