写点什么

软件测试 / 测试开发全日制培训|Pytest 跳过用例和失败重试

  • 2024-01-04
    北京
  • 本文字数:2078 字

    阅读完需:约 7 分钟

前言

在我们日常进行自动化测试时,经常会遇到功能阻塞,未实现或者环境有问题等等原因,一些用例执行不了,如果我们注释掉或删除掉这些测试用例,后面可能还要进行恢复操作,这个时候 pytest 的跳过测试功能就能帮助我们,先跳过,等到问题解决时,恢复执行即可;同时我们还有可能会遇到需要对失败用例重新运行进行测试的情况,pytest 也能满足我们的需求,本文就来给大家介绍一下 Pytest 跳过用例和失败重试的实现。

跳过测试用例

Pytest 测试框架中存在两个跳过测试的方法:skipskipif ,即无条件直接跳过和满足条件跳过。


  • 无条件跳过 skip


skip方法为无条件跳过测试用例,使用方法:@pytest.mark.skip标记在需要跳过的测试用例上。


  • 有条件跳过 skipif


skipif方法为有条件跳过测试用例,条件满足即跳过该用例,使用方法:@pytest.mark.skipif(condition=跳过的条件, reason=跳过的原因),标记在需要符合条件跳过的测试用例上。


  • 参数 condition:跳过的条件,为 True 则跳过测试,为 False 则继续执行测试,默认为 True。

  • 参数 reason:标注跳过的原因,必填参数。


使用示例


# 导入pytestimport pytest

# 编写测试用例def login_data(): return "muller", "123456"

# 无条件跳过@pytest.mark.skipdef test_register(): """注册用例""" print("注册步骤") assert False

# 当条件为真,跳过测试@pytest.mark.skipif(login_data()[0] == "muller", reason="muller用户不存在")def test_login(): """不记住密码登录""" username = login_data()[0] password = login_data()[1] print(f"输入用户名{username}") print(f"输入密码{password}") print("点击登录按钮") assert username == "muller"

def test_shopping(): """购物下单""" print("购物流程") assert True

if __name__ == '__main__': pytest.main()python
----------------运行结果如下:============================= test session starts =============================collecting ... collected 3 items
test_c.py::test_register SKIPPED (unconditional skip)Skipped: unconditional skip
test_c.py::test_login SKIPPED (muller用户不存在)Skipped: muller用户不存在
test_c.py::test_shopping 购物流程PASSED
======================== 1 passed, 2 skipped in 0.02s =========================
复制代码

Pytest 失败重试

Pytest 失败重试就是,在执行一次测试脚本时,如果一个测试用例执行结果失败了,则重新执行该测试用例。


我们要实现失败重跑,需要安装一个 pytest 的配套插件——pytest-rerunfailures,安装命令如下:


pip install pytest-rerunfailures
复制代码


实现方式:


  • 在命令行或者main()函数中使用


pytest.main(['-vs','test_a.py','--reruns=2'])或者是pytest -vs ./test_a.py --reruns 2 --reruns-delay 2


注: reruns为重跑次数,reruns_delay为间隔时间,单位 s。


  • pytest.ini配置文件中使用


pytest.ini配置文件中addopts添加reruns重试参数


[pytest]addopts = -s --reruns 2 --reruns-delay 2python_files = test_c.pypython_classes = Test*python_functions = test*
复制代码


示例如下:


# 1.导入pytestimport pytest

# 2.编写测试用例@pytest.mark.run(order=2)def test_login(): """登录用例""" print("登录步骤") assert "abcd" in "abcdefg"

@pytest.mark.run(order=1)def test_register(): """注册用例""" print("注册步骤") assert False

@pytest.mark.run(order=4)def test_shopping(): """购物下单""" print("购物流程") assert True

@pytest.mark.run(order=3)def test_cart(): """购物车用例""" print("购物车流程") assert True

if __name__ == '__main__': pytest.main(['-vs', 'test_c.py', '--reruns=2'])
----------------------运行结果如下:
============================= test session starts =============================collecting ... collected 4 items
test_c.py::test_login test_c.py::test_register 登录步骤PASSED注册步骤RERUNtest_c.py::test_register 注册步骤RERUNtest_c.py::test_register 注册步骤FAILEDtestcase2\test_c.py:110 (test_register)@pytest.mark.run(order=1) def test_register(): """注册用例""" print("注册步骤")> assert FalseE assert False
test_c.py:115: AssertionError购物流程PASSED购物车流程PASSED

test_c.py::test_shopping test_c.py::test_cart
============== 1 failed, 3 passed, 4 warnings, 2 rerun in 4.10s ===============
复制代码


注:如果在达到我们设置的重跑次数前,用例运行成功,则后续次数不会跑完。

总结

Pytest 提供了灵活的机制来跳过不符合条件的测试用例,并在失败时自动重试,这些功能有助于优化测试流程并提高测试的鲁棒性。通过合理地利用这些功能,您可以更有效地管理测试用例,确保测试的稳定性和可靠性。希望本文能够帮到大家!

用户头像

社区:ceshiren.com 微信:ceshiren2021 2019-10-23 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料,实时更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬。

评论

发布
暂无评论
软件测试/测试开发全日制培训|Pytest跳过用例和失败重试_霍格沃兹测试开发学社_InfoQ写作社区