前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python测试框架pytest(15)skip、skipif、xfail跳过用例

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

作者头像
wangmcn
发布2022-07-26 14:27:13
6560
发布2022-07-26 14:27:13
举报
文章被收录于专栏:AllTests软件测试

Python测试框架pytest(15)

skip、skipif、xfail跳过用例

目录

  • 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:跳过的原因,会在执行结果中打印。

脚本代码:

代码语言:javascript
复制
#!/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文件

脚本代码:

代码语言:javascript
复制
#!/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文件

脚本代码:

代码语言:javascript
复制
#!/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用于测试登陆。

脚本代码:

代码语言:javascript
复制
#!/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跳过不执行。

代码语言:javascript
复制
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文件

脚本代码:

代码语言:javascript
复制
#!/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文件

脚本代码:

代码语言:javascript
复制
#!/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()

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

代码语言:javascript
复制
pytest.importorskip(modname: str, minversion: Optional[str] = None, reason: Optional[str] = None)

参数列表:

  • modname:模块名
  • minversion:版本号
  • reason:跳过原因

示例一:

1、创建test_skip6.py文件

脚本代码:

代码语言:javascript
复制
#!/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文件

脚本代码:

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import pytest

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

2、运行结果:

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AllTests软件测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档