You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 15:37:32