边界条件测试聚焦程序在临界值附近的行为,涵盖数值、序列、字符串、逻辑分支等显式边界,以及文件、时间、第三方库、递归深度等隐式边界,并借助pytest参数化、类型提示与mypy提升覆盖与预警能力。

边界条件测试是Python单元测试中非常关键的一环,重点验证程序在输入临界值附近的行为是否正确。它不是测“正常情况”,而是专门盯住那些容易出错的“边缘地带”——比如列表索引的-1和len()、数字比较的等于号两侧、字符串长度为0或刚好超限等。
识别常见的Python边界点
写测试前先理清代码里哪些位置存在天然边界:
- 数值类:整数上下限(如0、sys.maxsize)、浮点数精度临界(如0.1 + 0.2 != 0.3)、除零前的判断
- 序列类:空列表[]、单元素列表[x]、索引-1(最后一个)、len(seq)(越界)
- 字符串类:空串""、含Unicode字符(如emoji)、超长字符串(触发截断或内存限制)
- 逻辑分支类:if条件中==、>=、对应的左右值,例如if age >= 18:,就要测17、18、19
用pytest+参数化高效覆盖边界
避免手写一堆相似测试用例,用@pytest.mark.parametrize批量注入边界数据:
import pytest
<p>def get_first_item(items):
return items[0] if items else None</p><p>@pytest.mark.parametrize("input_data,expected", [
([], None), # 空列表
(["a"], "a"), # 单元素
(["x", "y"], "x"), # 正常多元素
])
def test_get_first_item(input_data, expected):
assert get_first_item(input_data) == expected
对数字边界可结合pytest.approx处理浮点误差,或用pytest.raises捕获预期异常(如IndexError)。
立即学习“Python免费学习笔记(深入)”;
别漏掉隐式边界和环境边界
有些边界不写在代码逻辑里,但真实运行时会暴露问题:
- 文件操作:读空文件、文件大小刚好等于缓冲区、路径含中文或特殊符号
- 时间处理:datetime.min、datetime.max、时区切换边界(如夏令时起止时刻)
- 第三方库约束:requests请求体超过10MB、PIL打开超大图片触发DecompressionBombError
- 递归/循环深度:函数调用栈逼近sys.getrecursionlimit(),或生成器yield次数达到上限
结合类型提示与mypy提前发现潜在边界风险
虽然类型提示不直接做运行时检查,但它能帮你主动识别易出错的边界设计:
- 用Optional[str]明确标出可能为None的返回值,提醒你在测试中覆盖None分支
- 对索引参数标注int不够,可配合Literal或文档说明取值范围(如0 )
- mypy报error: Argument 1 to "func" has incompatible type "None",就是边界未处理的信号灯










