pytest系列——mark之跳过测试和预期失败

图片

迅捷小莫

迅捷小莫

本公众号日常更新自动化技术,编程知识,迅捷掌握一切测试工程师需要的技术!

12篇原创内容

公众号

Pytest

在pytest中,用例的执行状态分为下面几种:

  1. passed:测试通过

  2. failed:测试失败

  3. error: 代码错误

  4. xfailed: 预期失败

  5. xpassed:预期失败,但成功了

  6. skipped: 被跳过

passed和failed,error都好理解,但xfailed,xpassed和skipped这种状态怎么产生呢?这需要用到我们pytest中的mark。

01

skip跳过测试

pytest中为我们提供了@pytest.mark.skip和@pytest.mark.skipif 两个方法可以帮助我们来跳过测试。

import pytest  # 导入pytest


@pytest.mark.skip(reason="跳过") # 让test_001不执行 ,跳过
def test_001():
    print("test_001 done")


def test_002():
    print("test_002 done")


def test_003():
    print("test_003 done")


if __name__ == '__main__':  # 定义主函数
    pytest.main()  # 调用pytest

我们在tesst_001函数上使用了@pytest.mark.skip,并且指定了reason,这里的reason指的是原因。这样的话,在执行测试的时候,就不会去执行test_001

执行结果:

============================= test session starts ==============================
platform darwin -- Python 3.8.2, pytest-6.2.1, py-1.10.0, pluggy-0.13.1 -- /Users/zhangyingkai/PycharmProjects/pytest_demo/venv/bin/python
cachedir: .pytest_cache
rootdir: /Users/zhangyingkai/PycharmProjects/pytest_demo, configfile: pytest.ini
collecting ... collected 3 items

test_pytest.py::test_001 SKIPPED (跳过)                                  [ 33%]
Skipped: 跳过

test_pytest.py::test_002 PASSED                                          [ 66%]test_002 done

test_pytest.py::test_003 PASSED                                          [100%]test_003 done


========================= 2 passed, 1 skipped in 0.02s =========================

可以看到test_001已经被跳过了,最终的统计结果为2 passed, 1 skipped in 0.02s,两个测试用例被跳过。

假如我们想在是否跳过加上判断条件的话,就需要用到@pytest.mark.skipif:

import pytest  # 导入pytest


@pytest.mark.skip(reason="跳过")
def test_001():
    print("test_001 done")


@pytest.mark.skipif(True, reason="跳过")
def test_002():
    print("test_002 done")


@pytest.mark.skipif(False, reason="跳过")
def test_003():
    print("test_003 done")


if __name__ == '__main__':  # 定义主函数
    pytest.main()  # 调用pytest

skipif我们第一个参数为boolean,所以我们传入True和False分别看一下效果,结果如下:

collecting ... collected 3 items

test_pytest.py::test_001 SKIPPED (跳过)                                  [ 33%]
Skipped: 跳过

test_pytest.py::test_002 SKIPPED (跳过)                                  [ 66%]
Skipped: 跳过

test_pytest.py::test_003 PASSED                                          [100%]test_003 done
========================= 1 passed, 2 skipped in 0.02s =========================

此时跳过了2条用例,skipif为True的用例test_002被跳过,而为False没被跳过。

02

标记测试用例预期失败

有时候当我们的测试用例没有编写完毕,或者因为一些bug没有处理,导致用例一定执行失败的时候,我们希望去执行他,不去跳过他,但是又不希望会影响到最终的执行成功的结果,那么就可以把它标记为预期失败。在pytest中,我们使用@pytest.mark.xfail来标记。

import pytest  # 导入pytest


@pytest.mark.xfail(reason="预期失败")  # 标记测试预期失败
def test_001():
    print("test_001 done")


def test_002():
    print("test_002 done")


def test_003():
    print("test_003 done")


if __name__ == '__main__':  # 定义主函数
    pytest.main()  # 调用pytest

在上面我们把test_001标记为预期失败,让我们看一下执行的结果:

XPASS (预期失败)                                [ 33%]test_001 done

test_pytest.py::test_002 PASSED                                          [ 66%]test_002 done

test_pytest.py::test_003 PASSED                                          [100%]test_003 done


========================= 2 passed, 1 xpassed in 0.02s =========================

可以看到现在的状态是XPASS,这里可能有人会问,为什么不是XFAIL呢?这是因为此时用例虽然是预期失败的,但是它并没有失败,而是成功了,pytest认为这种用例是XPASS的。我们给他改一改:

@pytest.mark.xfail(reason="预期失败")  # 标记测试预期失败
def test_001():
    print("test_001 done")
    assert False # 手动抛出异常

那么此时该用例的状态就是XFAIL了:

XFAIL (预期失败)                                [ 33%]test_001 done

@pytest.mark.xfail(reason="预期失败")  # 标记测试预期失败
    def test_001():
        print("test_001 done")
>       assert False
E       assert False

test_pytest.py:7: AssertionError

那今天分享的内容到此结束,本期内容很简单,快速掌握。

迅捷小莫

迅捷小莫

本公众号日常更新自动化技术,编程知识,迅捷掌握一切测试工程师需要的技术!

12篇原创内容

公众号

图片

图片

@SUMMER

微信号

ya1kaikai

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值