我的测试学习站TEST LEARNING HUB
开始学习
首页/精华文章/5. 异常处理在测试脚本中怎么用

5. 异常处理在测试脚本中怎么用

异常处理是 Python 测试脚本稳定性的重要保障。很多自动化脚本不是因为系统 Bug 失败,而是因为文件路径错误、接口超时、字段不存在、JSON 解析失败、数据库连接失败等异常直接中断。测试工程师如果不会合理处理异常,脚本就会变得脆弱;如果滥用异常,把所有错误都吞掉,又会掩盖真实问题。

面试中问异常处理,不要只背 try except finally。更好的回答是:异常处理用于捕获脚本执行中的可预期错误,记录日志、保留现场、给出清晰失败原因,但不能随便忽略错误。测试自动化中,异常处理应该帮助定位问题,而不是隐藏问题。

一、什么是异常

异常是程序运行过程中出现的错误。例如:

  • 文件不存在;
  • 除以零;
  • 字典 key 不存在;
  • JSON 格式错误;
  • 接口请求超时;
  • 数据库连接失败;
  • 类型转换失败。

如果不处理,程序会中断。

二、基本语法

try:
    result = 10 / 0
except ZeroDivisionError as e:
    print(f"计算异常: {e}")

常见结构:

try:
    # 可能出错的代码
    pass
except Exception as e:
    # 异常处理
    print(e)
else:
    # 没有异常时执行
    pass
finally:
    # 无论是否异常都执行
    pass

finally 常用于关闭文件、关闭数据库连接、清理资源。

三、接口请求中的异常处理

接口自动化最常见的是请求异常。

import requests

try:
    response = requests.get("https://api.example.com", timeout=5)
except requests.exceptions.Timeout:
    print("接口请求超时")
except requests.exceptions.RequestException as e:
    print(f"请求异常: {e}")

测试场景:

  • 服务不可用;
  • 网络超时;
  • DNS 解析失败;
  • 连接被拒绝;
  • HTTPS 证书问题。

捕获后要记录 URL、请求参数、异常信息,方便定位。

四、JSON 解析异常

接口返回不是合法 JSON 时,解析会失败。

try:
    data = response.json()
except ValueError as e:
    print(f"响应不是合法 JSON: {e}")

测试中如果接口预期返回 JSON,但实际返回 HTML 错误页,就可能触发这个异常。

五、字段不存在异常

接口响应字段缺失时,直接取值会报 KeyError。

try:
    code = data["code"]
except KeyError:
    print("响应缺少 code 字段")

更推荐先断言字段存在:

assert "code" in data

测试脚本要能明确告诉你缺哪个字段。

六、文件读写异常

读取测试数据时常见:

try:
    with open("case.json", "r", encoding="utf-8") as f:
        content = f.read()
except FileNotFoundError:
    print("测试数据文件不存在")

自动化框架中,文件路径错误是常见失败原因。

七、数据库异常

数据库连接、SQL 执行可能失败。

常见原因:

  • 数据库地址错误;
  • 用户名密码错误;
  • SQL 语法错误;
  • 表不存在;
  • 查询超时。

异常处理要记录 SQL、数据库环境和错误信息,但不要把数据库错误吞掉后继续断言。

八、异常处理和断言的区别

异常处理不是替代断言。

断言用于判断实际结果是否符合预期。

异常处理用于处理脚本运行过程中的错误。

例如接口返回业务 code 不对,应该用断言失败;接口请求超时,是请求异常。

九、不要滥用 except Exception

很多人写:

try:
    run_case()
except Exception:
    pass

这是非常危险的。它会吞掉所有错误,导致用例看起来通过但实际没有验证。

如果使用通用异常,也要记录日志并让用例失败。

十、异常处理在框架中的作用

自动化框架中,异常处理常用于:

  • 记录失败日志;
  • 截图;
  • 保存请求响应;
  • 清理测试数据;
  • 关闭连接;
  • 生成报告失败原因;
  • 保证一个用例失败不影响全部用例执行。

例如 UI 自动化失败时截图,接口自动化失败时记录请求和响应。

十一、面试回答模板

如果面试官问“异常处理在测试脚本中怎么用”,可以这样回答:

异常处理主要用于提高测试脚本稳定性和可定位性。接口自动化中常见异常有请求超时、连接失败、响应不是 JSON、字段缺失、文件不存在、数据库连接失败等。我会用 try except 捕获可预期异常,记录 URL、请求参数、响应内容和异常信息,必要时截图或写日志;但不会随便把异常吞掉,因为异常可能代表真实问题。断言失败和脚本异常也要区分,业务结果不符合预期用断言,脚本执行错误用异常处理。

十二、常见追问

追问:finally 有什么用?

无论是否发生异常都会执行,常用于关闭文件、数据库连接、清理资源。

追问:为什么不能直接 except Exception pass?

会吞掉真实错误,导致用例假通过,降低自动化可信度。

追问:接口返回非 JSON 怎么处理?

捕获 JSON 解析异常,记录状态码、响应文本和请求信息,再让用例失败。

十三、练习清单

  1. 捕获请求超时;
  2. 捕获文件不存在;
  3. 捕获 JSON 解析失败;
  4. 捕获 KeyError;
  5. 使用 finally 关闭资源;
  6. 区分异常和断言失败;
  7. 记录异常日志;
  8. 不吞掉异常;
  9. 在框架中保存失败现场;
  10. 准备异常处理面试回答。

异常处理的目标不是让脚本“不报错”,而是让错误更清楚、更可定位、更不影响整体执行。

配套刷题: