3. 测试脚本常见异常类型

在自动化测试脚本的执行过程中,异常几乎不可避免。真正决定脚本健壮性的,不是“能否一次跑通”,而是“异常发生时能否被准确识别、分类并采取正确的恢复策略”。如果对所有异常都统一重试,往往会把真正的产品缺陷掩盖掉;如果对所有异常都直接失败,又会造成大量误报。因此,识别异常类型是异常恢复与重试机制的第一道关口。

异常识别的核心原则:先判断异常是“环境/基础设施类”还是“业务/断言类”。前者通常可重试,后者往往需要人工介入或直接判定失败。

一、五类常见异常的特征与识别方法

测试脚本中的异常可以按来源分为五类:网络超时、元素定位失败、数据依赖缺失、环境不稳定、断言失败。它们在外在表现、日志特征、可恢复性上都有明显差异。

异常类型 典型特征 日志/报错关键词 可恢复性
网络超时 请求长时间无响应、连接被重置、响应时间突增 Timeout、ETIMEDOUT、Read timed out、Connection reset 高,可重试
元素定位失败 页面已加载但找不到目标元素、元素被遮挡、iframe 未切换 NoSuchElement、ElementNotVisible、StaleElementReference 中,需等待或刷新
数据依赖缺失 前置数据未生成、账号被占用、接口返回空数据 NullPointer、data not found、404、empty result 低,需修复数据
环境不稳定 服务偶发 502/503、数据库连接池耗尽、容器重启 502 Bad Gateway、Connection refused、Service Unavailable 中高,可重试
断言失败 实际结果与预期不符、数值偏差、状态码错误 AssertionError、expected: X but was: Y 低,通常为真实缺陷

二、异常识别流程

识别异常不能只看异常名称,而要结合“发生阶段 + 报错信息 + 上下文状态”三者综合判断。下面这张图展示了从异常捕获到分类判定的完整信号链,帮助你在脚本中建立清晰的判断路径。

测试脚本异常识别信号链 脚本执行中捕获异常 判断发生阶段:请求 / 定位 / 数据 / 断言 提取报错关键词与堆栈 网络超时 Timeout / reset → 可重试 元素定位失败 NoSuchElement → 等待/刷新 数据依赖缺失 null / 404 / empty → 修复数据 环境不稳定 502 / refused → 可重试 断言失败 AssertionError → 人工介入 分类结果 → 决定重试策略 / 失败策略 可重试类:网络超时、环境不稳定 | 需修复类:数据缺失、断言失败

三、典型场景与代码识别示例

以 Python + Selenium 为例,可以通过捕获不同异常类型并匹配关键词来分类。下面是一段简化的异常分类代码:

from selenium.common.exceptions import (
    TimeoutException, NoSuchElementException,
    StaleElementReferenceException
)
import requests

def classify_exception(exc):
    msg = str(exc).lower()
    if isinstance(exc, (TimeoutException, requests.Timeout)):
        return "NETWORK_TIMEOUT"          # 可重试
    if isinstance(exc, NoSuchElementException):
        return "ELEMENT_NOT_FOUND"        # 等待或刷新
    if isinstance(exc, StaleElementReferenceException):
        return "ELEMENT_STALE"            # 重新定位
    if "502" in msg or "503" in msg or "connection refused" in msg:
        return "ENV_UNSTABLE"             # 可重试
    if "assert" in msg or "expected" in msg:
        return "ASSERTION_FAILED"         # 人工介入
    if "null" in msg or "not found" in msg or "404" in msg:
        return "DATA_MISSING"             # 修复数据
    return "UNKNOWN"
识别时优先看异常类型(如 TimeoutException),再看消息关键词(如 502、null)。类型优先于关键词,避免误判。

四、误区与复盘

在实际项目中,异常识别最常见的误区有三个:

  • 把所有异常都当成可重试异常。断言失败如果被重试,可能连续多次失败后仍被标记为“环境问题”,从而掩盖真实缺陷。
  • 只看异常名称,不看上下文。同样是 NoSuchElementException,可能是页面未加载完(可等待),也可能是元素真的被删除了(需修复脚本)。
  • 忽略异常发生的时间点。在登录阶段超时和在断言阶段超时,恢复策略完全不同。前者可重试登录,后者应检查业务逻辑。
建议在脚本中为每个异常记录:发生阶段、异常类型、关键日志、重试次数、最终结果。这些字段是后续复盘和优化重试策略的基础数据。

复盘时,可以按“异常类型 → 发生频率 → 恢复成功率 → 是否掩盖缺陷”四个维度统计。如果某类异常重试成功率长期低于 30%,说明它大概率不是环境问题,而应转为人工排查。通过持续的分类与复盘,测试脚本的异常恢复机制才能从“盲目重试”走向“精准恢复”。