如何通过Pytest验证prod.py中add函数的返回值为整数类型
解决Pytest中验证函数返回值为int类型的问题
你当前的测试代码没生效,核心原因是你错误地检查了expected的类型,而不是**add函数实际返回值**的类型。expected本身就是你定义的int,所以那个if type(expected) is not int的判断永远不会触发失败。
要实现你的需求——只有当add返回int类型时测试通过,返回float时测试失败,你需要直接断言返回值的类型为int。
修改后的测试代码(test_prod.py)
from prod import add import pytest @pytest.mark.parametrize("a, b, expected", [(4, 4, 256), (2, 3, 8)]) def test_prod(a, b, expected): result = add(a, b) # 先断言数值匹配 assert result == expected # 再严格断言返回值是int类型 assert isinstance(result, int), f"返回值类型错误:预期int,实际是{type(result)}" @pytest.mark.parametrize("expected_exception, one, two", [(TypeError, 4, 'a'),]) def test_check(expected_exception, one, two): with pytest.raises(expected_exception): add(one, two)
验证两种场景
1. 不应通过测试的prod.py
def add(x, y): return x ** y add(4.1, 4) # 这个调用不影响测试,测试用例是(4,4)和(2,3)
如果想模拟返回float的场景(比如输入整数但返回浮点结果),可以修改prod.py为:
def add(x, y): return float(x ** y) # 强制返回float类型
执行测试命令python3 -m pytest /home/user/test/test_prod.py -v时,test_prod会失败,报错信息会明确提示类型不匹配:AssertionError: 返回值类型错误:预期int,实际是<class 'float'>,完全符合你的需求。
2. 应该通过测试的prod.py
def add(x, y): return int(x ** y) print(add(4, 4.1))
执行测试命令后,所有测试用例都会通过,因为add返回的结果既是正确的数值,又是int类型。
补充说明
- 使用
isinstance(result, int)是Python中类型检查的推荐写法,它比type(result) is int更灵活(虽然int没有子类,两者效果相近)。 - 添加自定义错误提示能让测试失败时更直观地定位问题,减少排查时间。
内容的提问来源于stack exchange,提问作者Wood
相关产品推荐
相关产品推荐

