Python测试框架pytest(15)skip、skipif、xfail跳过用例

29 篇文章 8 订阅
28 篇文章 13 订阅

目录

1、@pytest.mark.skip

2、pytest.skip()

3、pytest.xfail()

4、@pytest.mark.skipif() 

5、跳过标记 

6、pytest.importorskip() 


1、@pytest.mark.skip

@pytest.mark.skip 可以标记无法在某些平台上运行的测试功能,或者希望失败的测试功能。

希望满足某些条件才执行某些测试用例,否则 pytest 会跳过运行该测试用例。

实际常见场景:跳过非 Windows 平台上的仅 Windows 测试,或者跳过依赖于当前不可用的外部资源(例如数据库)的测试。

1、创建test_skip.py文件

跳过执行测试用例,有可选参数reason:跳过的原因,会在执行结果中打印。

脚本代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import pytest

@pytest.fixture(autouse=True)
def login():
    print("====登录====")

def test_case1():
    print("====test_case1====")

@pytest.mark.skip(reason="用例不执行")
def test_case2():
    print("====test_case2====")

class TestClass:
    def test_classcase1(self):
        print("====test_classcase1====")

    @pytest.mark.skip(reason="类里的用例不执行")
    def test_classcase2(self):
        print("====test_classcase2====")

@pytest.mark.skip(reason="类不执行")
class TestSkip:
    def test_skipcase1(self):
        print("=====test_skipcase1====")

2、运行结果:

函数test_case2跳过不执行

类TestClass里的方法test_classcase2跳过不执行

类TestSkip跳过不执行

知识点:

  • @pytest.mark.skip 可以加在函数上,类上,类的方法上。

  • 如果加在类上面,类里面的所有测试用例都不会被执行。

2、pytest.skip()

在测试用例执行期间强制跳过不再继续执行。类似 Python 的循环里面,满足某些条件则 break 跳出该循环。

示例一:

1、创建test_skip2.py文件

脚本代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import pytest

def test_case():
    n = 1
    while True:
        print(f"====第{n}条用例 执行====")
        n += 1
        if n == 5:
            pytest.skip("====第5条用例 退出====")

2、运行结果:

n等于5,满足条件,强制跳出while循环不再继续执行。

示例二:

pytest.skip("", allow_module_level=False)

当 allow_module_level=True 时,可以设置在模块级别跳过整个模块。

1、创建test_skip3.py文件

脚本代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import sys
import pytest

# 值为win是Windows平台;值为darwin是Mac平台;值为linux是Linux平台
if sys.platform.startswith("darwin"):
    pytest.skip("跳过仅限Mac的测试", allow_module_level=True)

@pytest.fixture(autouse=True)
def login():
    print("====登录====")

def test_case():
    print("====执行用例====")

2、运行结果:

因为系统平台满足在Mac环境,所以跳过整个模块。

3、pytest.xfail()

有3个用例,先执行用例a,当用例a失败的时候,如果用例b和用例c都是依赖于第一个用例的结果,那可以直接跳过用例b和c的测试,直接给他标记失败 xfail。

pytest 里面用 xfail 标记用例为失败的用例,可以直接跳过。

1、创建test_xfail.py文件

登陆作为前置操作,账户和密码进行参数化;3个测试用例全部调用fixture里面的login功能,test_case01用于测试登陆。

脚本代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import pytest

parameter = [{"username":"AllTests", "password":"123456"}]

@pytest.fixture(scope="module")
def login(request):
    username = request.param["username"]
    password = request.param["password"]
    print("login登录操作,账号:%s, 密码:%s" % (username, password))
    if password == "123456":
        return True
    else:
        return False

@pytest.mark.parametrize("login", parameter, indirect=True)
class TestSuite():

    def test_case01(self, login):
        result = login
        print("test_case01 用例结果:%s" % result)
        assert result == True

    def test_case02(self, login):
        result = login
        print("test_case02 用例结果:%s" % result)
        if not result:
            pytest.xfail("登录不成功,标记为xfail")

    def test_case03(self, login):
        result = login
        print("test_case03 用例结果:%s" % result)
        if not result:
            pytest.xfail("登录不成功,标记为xfail")

if __name__ == "__main__":
    pytest.main(["-s", "test_xfail.py"])

2、运行结果:3个测试用例全部执行成功。

3、将test_xfail.py文件,参数部分进行修改,使其用例1失败,用例2和3跳过不执行。

parameter = [{"username":"AllTests", "password":"111111"}]

4、运行结果:

用例test_case01执行失败,用例test_case02、test_case03跳过没有执行,并标记为xfail。

4、@pytest.mark.skipif() 

@pytest.mark.skipif(condition, reason="") 希望有条件地跳过某些测试用例。

注意:condition 需要返回 True 才会跳过。

1、创建test_skip4.py文件

脚本代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import sys
import pytest

# 值为win32是Windows平台;值为darwin是Mac平台;值为linux是Linux平台
@pytest.mark.skipif(sys.platform == "darwin", reason="不在Mac上运行")
class TestSkipIf(object):
    def test_case(self):
        print("====执行用例====")

2、运行结果:

判断系统平台是Mac环境为True,所以跳过测试用例。

5、跳过标记 

可以将 pytest.mark.skip 和 pytest.mark.skipif 赋值给一个标记变量,在不同模块之间共享这个标记变量,若有多个模块的测试用例需要用到相同的 skip 或 skipif,可以用一个单独的文件去管理这些通用标记,然后适用于整个测试用例集。

1、创建test_skip5.py文件

脚本代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import sys
import pytest

# 标记变量
skipmark = pytest.mark.skip(reason="不能在Mac上运行")
skipifmark = pytest.mark.skipif(sys.platform == 'darwin', reason="不能在Mac上运行")

@skipmark
class TestSkip_Mark(object):

    @skipifmark
    def test_function(self):
        print("测试标记")

    def test_case(self):
        print("测试标记")

@skipmark
def test_skip():
    print("测试标记")

2、运行结果:

全部满足跳过测试条件。

6、pytest.importorskip() 

如果缺少某些导入,则跳过模块中的所有测试。

pytest.importorskip(modname: str, minversion: Optional[str] = None, reason: Optional[str] = None)

参数列表:

  • modname:模块名

  • minversion:版本号

  • reason:跳过原因

示例一:

1、创建test_skip6.py文件

脚本代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import pytest

pexpect = pytest.importorskip("pexpect", minversion="0.5")
@pexpect
def test_import():
    print("====执行用例====")

2、运行结果:

找不到模块,跳过所有测试。

示例二:

1、创建test_skip7.py文件

脚本代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import pytest

sys = pytest.importorskip("sys", minversion="1.0")
@sys
def test_import():
    print("====执行用例====")

2、运行结果:

版本对应不上,跳过所有测试。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
引用\[1\]:在pytest中,可以使用`pytest.skip`函数来跳过测试用例。可以在测试函数或测试类中使用`pytest.skip`函数来指定跳过的原因。例如,在测试函数中使用`pytest.skip`函数可以跳过测试函数,并在跳过时提供一个消息。示例代码如下: ```python import pytest def test_01(): print("我是测试函数。") pytest.skip(msg="跳过此条用例。") assert 1 == 1 class TestSkip: def test_one(self): print("test_one方法执行") assert 1 == 1 def test_two(self): pytest.skip(msg="跳过此条用例。") print("test_two方法执行") assert "king" in "hello,king" ``` 在上述示例中,`test_01`函数和`test_two`方法都使用了`pytest.skip`函数来跳过测试用例,并提供了跳过的原因。当运行这些测试用例时,它们将被跳过执行。 引用\[2\]:另一种在pytest跳过测试用例的方法是使用`pytest.mark.skip`装饰器。可以在测试函数或测试类上使用`pytest.mark.skip`装饰器来指定跳过的原因。示例代码如下: ```python import pytest pytestmark = pytest.mark.skip(reason="跳过当前模块") def test_01(): print("我是测试函数。") assert 1 == 1 class TestSkip: def test_one(self): print("test_one方法执行") assert 1 == 1 def test_two(self): print("test_two方法执行") assert "king" in "hello,king" ``` 在上述示例中,使用`pytest.mark.skip`装饰器标记了整个模块为跳过状态,并提供了跳过的原因。当运行这个模块的测试用例时,所有的测试用例都将被跳过执行。 引用\[3\]:还可以使用`pytest.mark.skip`装饰器来跳过测试函数或测试类。示例代码如下: ```python import pytest @pytest.mark.skip(reason="跳过测试函数的测试case") def test_01(): print("我是测试函数。") assert 1 == 1 class TestSkip: @pytest.mark.skip(reason="跳过类里面case") def test_one(self): print("test_one方法执行") assert 1 == 1 def test_two(self): print("test_two方法执行") assert "king" in "hello,king" ``` 在上述示例中,使用`pytest.mark.skip`装饰器标记了`test_01`函数和`test_one`方法为跳过状态,并提供了跳过的原因。当运行这些测试用例时,它们将被跳过执行。 综上所述,pytest中可以使用`pytest.skip`函数或`pytest.mark.skip`装饰器来跳过测试用例,并提供跳过的原因。 #### 引用[.reference_title] - *1* *2* *3* [pytest测试框架系列 - Pytest skipskipif 跳过用例看这篇就够了!](https://blog.csdn.net/u010454117/article/details/118469127)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangmcn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值