第5篇:进阶优化:数据驱动+日志体系+失败重试实战

前言: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报告,包含用例通过率、执行时间、失败详情,可直接打开查看

五、实战练习(巩固优化特性)

基于优化后的框架,完成以下实战练习,巩固三大优化特性的使用:

需求:实现"商品搜索"功能的多数据测试,涵盖以下场景:

  1. 用Excel存储测试数据:搜索关键词(Python书籍、Java教程、空值、超长字符)、预期结果(是否有搜索结果、结果数量)

  2. 封装商品搜索页面对象(product_search_page.py),集成日志记录

  3. 编写数据驱动测试用例,集成失败重试和自动截图

  4. 运行用例并查看日志、截图、测试报告,验证优化效果

提示:商品搜索页面对象需继承BasePage,复用公共操作;测试数据模板参考登录数据的设计思路,新增"结果数量"列;运行时可故意制造一个失败场景(如修改预期结果),验证失败截图功能。

六、总结与下一篇预告

本篇文章我们完成了企业级UI自动化框架的三大核心优化,总结一下重点:

  • 数据驱动:实现Excel/JSON两种数据驱动方式,数据与代码分离,提升测试覆盖率和维护效率

  • 日志体系:搭建"控制台+文件"双输出的企业级日志,实现测试全流程追溯,快速定位问题

  • 稳定性优化:通过失败重试解决偶发问题,失败自动截图保存页面状态,大幅提升脚本稳定性

  • 框架整合:将三大特性无缝集成到基础框架中,形成"多数据+可追溯+高稳定"的企业级雏形

下一篇文章我们将进入"企业级落地"阶段,学习Jenkins持续集成+Allure精美报告,实现"代码提交→自动测试→报告生成→邮件通知"的全流程自动化,彻底解决"自动化测试只在本地跑,无法落地团队"的核心痛点!

如果这篇文章对你有帮助,别忘了点赞+收藏+关注,后续会持续更新UI自动化系列教程~ 有任何问题欢迎在评论区留言!

专栏地址:【保姆级实战】UI自动化从入门到企业落地全系列(持续更新)

相关推荐
小白学大数据2 小时前
随机间隔在 Python 爬虫中的应用实践
开发语言·c++·爬虫·python
智象科技2 小时前
高效运维新利器-裸金属自动化重装系统
运维·自动化·it运维·一体化运维
旗讯数字2 小时前
【技术实测】旗讯OCR手写问卷识别:从纸质文档到结构化表格的自动化方案
运维·自动化·ocr
tjjucheng2 小时前
专业小程序定制开发生产厂家
python
无我19872 小时前
靠谱的厌氧池清淤哪家妙
大数据·人工智能·python
aliprice2 小时前
告别手动调价:如何利用速卖通价格历史数据,构建自动化的动态定价策略
大数据·运维·自动化
坚持学习前端日记2 小时前
后台管理系统文档
java·开发语言·windows·spring boot·python·spring
小旺不正经2 小时前
解锁n8n:工作流自动化的魔法工具
运维·自动化·工作流·n8n
亲爱的非洲野猪2 小时前
基于 MCP 构建智能文档分析系统:技术实现详解
python·ai·mcp