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、运行结果:
版本对应不上,跳过所有测试。