编写健壮的单元测试离不开对边界情况的覆盖。本文基于unittest框架,总结常见的边界场景分类与测试方法。
一、数据输入边界场景
1. 数值型输入边界
- 极值场景:0、1、-1、sys.maxsize、float(‘inf’)
- 特殊数值:零、负数、整数与浮点数混合运算
- 类型校验:非数值类型输入应触发异常
import unittest
class TestMathFunctions(unittest.TestCase):
def test_division(self):
self.assertEqual(divide(10, 2), 5.0) # 正常运算
self.assertAlmostEqual(divide(1, 3), 0.333, places=3) # 浮点精度
def test_zero_division(self):
with self.assertRaises(ZeroDivisionError):
divide(5, 0) # 零值异常检测
2. 字符串处理边界
- 空字符串:长度为0的输入
- 特殊字符:空格、换行符、Unicode字符
- 超长字符串:超出常规长度的输入
class TestStringMethods(unittest.TestCase):
def test_reverse_edge_cases(self):
self.assertEqual(reverse(""), "") # 空字符串反转
self.assertEqual(reverse("ab😊"), "😊ba") # Unicode处理
3. 集合类型边界
- 空集合:空列表/字典的容错处理
- 单元素集合:仅有一个元素的容器
- 重复元素:全相同元素的特殊场景
class TestListOperations(unittest.TestCase):
def test_empty_list(self):
self.assertIsNone(find_max([])) # 空列表返回值验证
def test_duplicate_elements(self):
self.assertEqual(find_max([5,5,5]), 5) # 重复元素处理
二、逻辑与异常边界场景
1. 业务逻辑边界
- 数值极值:年龄负数、超过120岁
- 状态切换:用户权限阈值、库存零值
- 特殊规则:闰年日期、节假日逻辑
class TestBusinessLogic(unittest.TestCase):
def test_age_validation(self):
self.assertFalse(is_valid_age(-1)) # 非法负值
self.assertTrue(is_valid_age(120)) # 合法上限值
2. 异常处理规范
- 非法输入:None、错误类型、格式错误
- 依赖异常:文件不存在、网络超时
- 自定义异常:业务错误类型捕获
class TestExceptions(unittest.TestCase):
def test_file_operations(self):
with self.assertRaises(FileNotFoundError):
read_file("invalid_path.txt") # 文件依赖异常
def test_custom_error(self):
with self.assertRaises(PaymentFailedError):
process_payment(0) # 业务异常触发
三、高效测试策略
1. 参数化测试
- 使用@parameterized.expand减少重复代码
- 批量验证边界值组合
from parameterized import parameterized
class TestParameterized(unittest.TestCase):
@parameterized.expand([
(0, False),
(1, True),
(120, True),
(121, False)
])
def test_age_boundaries(self, age, expected):
self.assertEqual(is_valid_age(age), expected)
2. 测试环境管理
- 通过setUp()初始化测试数据
- 使用tearDown()清理资源
- Mock外部依赖提升测试速度
class TestUserAPI(unittest.TestCase):
def setUp(self):
self.test_user = User(name="test", role="guest") # 预置测试数据
def test_role_change(self):
self.test_user.upgrade_role()
self.assertEqual(self.test_user.role, "vip")
3. 覆盖率优化
- 使用coverage.py检测未覆盖代码
- 优先覆盖核心业务逻辑
- 定期清理无效测试用例
总结建议
- 分层测试:将基础数据验证与业务逻辑验证分离
- 模式规范:统一采用Arrange-Act-Assert三段式结构
- 持续集成:将边界测试加入CI/CD流水线
通过系统化的边界用例设计,可提升代码健壮性。unittest框架配合参数化工具,能使测试代码量减少,建议重点掌握边界值分析法和异常场景模拟技术。