Python测试框架pytest(15)skip、skipif、xfail跳过用例
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、运行结果:
版本对应不上,跳过所有测试。


本文来自博客园,作者:AllTests软件测试,转载请注明原文链接:https://www.cnblogs.com/alltests/p/15457338.html

浙公网安备 33010602011771号