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

2022-07-26 14:27:13 浏览数 (1)

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、运行结果:

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

0 人点赞