Python 运行pytest用例时业务断言失败,用例统计是pass的问题,已解决

文章讨论了在Python使用pytest进行测试时,由于try-except结构导致assert断言失败但仍标记为pass的问题。作者分析了原因并提供了修改后的代码示例,通过抛出异常raiseAssertionError来确保测试用例正确标记为失败。另外,文章还提到了pytest.mark.xfail与try-except一起使用时失效的情况,并指出需要进一步理解其失效的根本原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:python 中assert断言,失败的用例,控制台不显示红色报错,pytest统计为pass,不统计为失败用例

现象:

在这里插入图片描述

业务断言失败,pytest统计为pass

原因分析:

python在pytest断言时,用了异常捕捉,断言失败也不会标记失败,因为try…except,当出现异常时,会进入except代码块,不会出现执行失败的情况,所以不会标记用例为失败。如果不抛出异常,则测试结果会表明为pass 的,所以需要再次抛出异常raise AssertionError(e),用例才会标记失败

修改前代码:

    def assert_business(self, assert_business):
        # 业务断言
        for k, v in assert_business.items():
            data = jsonpath.jsonpath(self.respond.json(), k)
            try:
                # 响应数据断言
                assert data[0] == v, f"业务断言失败,实际拿到的结果{
     data[0]},预期拿到的结果{
     v}"
                # 响应码断言
                assert self.respond
pytest是一个流行的Python测试框架,它允许你在测试套件中设置断言失败后停止后续的测试用执行。这种行为通常通过`pytest.mark.parametrize`的`raises`标志或者在测试函数内部使用`assertRaises`关键字来控制。 如,在`pytest.raises`装饰器中,你可以指定一个异常,如果测试抛出该异常,则会验证这个条件并停止执行后面的测试: ```python import pytest def test_divide_by_zero(): with pytest.raises(ZeroDivisionError): divide(5, 0) ``` 在这个子中,如果`divide`函数在除以零抛出了`ZeroDivisionError`,那么剩余的测试用将不会被执行。 同样,如果你在函数内部使用`assertRaises`,可以立即中断当前函数的执行,然后继续执行下一次测试: ```python def test_failing_case(): assert False # 这里会引发AssertionError # 下面的代码将不会被执行 def test_passing_case(): pass # 这个测试会直接跳过 ``` 如果你想在整个测试模块或类上应用这样的行为,可以在类或模块级别使用`@pytest.mark.parametrize`结合`skip`标记,当某个测试失败自动跳过余下的测试: ```python @pytest.mark.parametrize("value", [1, 2, 3]) @pytest.mark.skip_on_fail def test_multiply(value): if value % 2 == 0: assert multiply(value, 2) == value * 2 else: assert multiply(value, 2) != value * 2 ``` 在这里,如果`multiply`测试失败,那么所有带`@skip_on_fail`的测试都会被跳过,直到下一个模块或类开始执行。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值