pytest简易教程汇总,详见:https://www.cnblogs.com/uncleyong/p/17982846
应用场景
1、受限环境,某些用例无法运行
实现方案
@pytest.mark.skip
@pytest.mark.skip(reason="")
@pytest.mark.skipif(condition, reason="")
pytest.skip(reason="")
pytest.skip(reason="",allow_module_level=False)
skip
无条件跳过,也就是始终跳过该测试用例
源码:
class _SkipMarkDecorator(MarkDecorator):
@overload # type: ignore[override,misc,no-overload-impl]
def __call__(self, arg: Markable) -> Markable:
...
@overload
def __call__(self, reason: str = ...) -> "MarkDecorator":
...
方法:skip(reason=None)
参数:可选参数reason,用于标注跳过的原因,会在测试结果中显示
使用方法:@pytest.mark.skip(reason="xxx")
函数/方法级跳过
示例:无参数reason
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : 韧
# @wx :ren168632201
# @Blog :https://www.cnblogs.com/uncleyong/
import pytest
@pytest.mark.skip
def test_case():
print("代码开发中")
结果:
示例:有参数reason
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : 韧
# @wx :ren168632201
# @Blog :https://www.cnblogs.com/uncleyong/
import pytest
@pytest.mark.skip(reason="代码开发中")
def test_case():
print("---skip")
结果:
函数/方法执行过程中跳过
示例:代码中添加跳过
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : 韧
# @wx :ren168632201
# @Blog :https://www.cnblogs.com/uncleyong/
import pytest
import platform
def test_case():
if platform.system() == "Windows":
pytest.skip("win下跳过")
print("---skip")
else:
print("不跳过")
结果:pytest.skip后面代码没执行
类级跳过
示例:修饰器加在类上
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : 韧
# @wx :ren168632201
# @Blog :https://www.cnblogs.com/uncleyong/
import pytest
@pytest.mark.skip(reason="代码开发中")
class TestCase:
def test_case1(self):
print("test_case1---skip")
def test_case2(self):
print("test_case2---skip")
结果:
模块级跳过
pytest.skip(msg="原因描述", allow_module_level=False)
allow_module_level为True时,跳过当前模块
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : 韧
# @wx :ren168632201
# @Blog :https://www.cnblogs.com/uncleyong/
import sys
import pytest
if sys.platform=="win32":
pytest.skip('win中该模块跳过', allow_module_level=True)
class TestCase:
def test_case1(self):
print("test_case1---skip")
def test_case2(self):
print("test_case2---skip")
def test_case3():
print("test_case3---skip")
def test_case4():
print("test_case4---skip")
结果:
或者:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : 韧
# @wx :ren168632201
# @Blog :https://www.cnblogs.com/uncleyong/
import pytest
pytestmark = pytest.mark.skip(reason="win中该模块跳过")
class TestCase:
def test_case1(self):
print("test_case1---skip")
def test_case2(self):
print("test_case2---skip")
def test_case3():
print("test_case3---skip")
def test_case4():
print("test_case4---skip")
结果:
skipif
condition条件为True跳过该测试用例
源码:
class _SkipifMarkDecorator(MarkDecorator):
def __call__( # type: ignore[override]
self,
condition: Union[str, bool] = ...,
*conditions: Union[str, bool],
reason: str = ...,
) -> MarkDecorator:
...
方法:skipif(condition, reason=None)
参数:
condition:跳过的条件,可选
reason:标注跳过的原因,可选
使用方法:@pytest.mark.skipif(condition, reason="xxx")
函数/方法级跳过
示例:condition和reason都不填
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : 韧
# @wx :ren168632201
# @Blog :https://www.cnblogs.com/uncleyong/
import pytest
@pytest.mark.skipif
def test_case1():
print("---skipif")
assert 1==1
结果:
示例:condition和reason都填
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : 韧
# @wx :ren168632201
# @Blog :https://www.cnblogs.com/uncleyong/
import pytest
import sys
@pytest.mark.skipif(sys.platform.startswith("win"), reason="win环境中跳过")
def test_case1():
pass
@pytest.mark.skipif(sys.version_info < (3, 9), reason="python3.9以下跳过")
def test_case2():
pass
结果:
类级跳过
示例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : 韧
# @wx :ren168632201
# @Blog :https://www.cnblogs.com/uncleyong/
import sys
import pytest
@pytest.mark.skipif(sys.platform.startswith("win"), reason="win环境中跳过")
class TestCase:
def test_case1(self):
print("test_case1---skip")
def test_case2(self):
print("test_case2---skip")
def test_case3():
print("test_case3---skip")
def test_case4():
print("test_case4---skip")
结果:
模块级跳过
示例:下面只能是pytestmark,不能改为其它的
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : 韧
# @wx :ren168632201
# @Blog :https://www.cnblogs.com/uncleyong/
import sys
import pytest
pytestmark = pytest.mark.skipif(sys.platform=="win32", reason="win中该模块跳过")
def test_case1():
print("test_case1---skip")
def test_case2():
print("test_case2---skip")
结果:
补充:importorskip
缺少模块或者版本低于参数值就跳过
源码:
def importorskip(
modname: str, minversion: Optional[str] = None, reason: Optional[str] = None
) -> Any:
"""Import and return the requested module ``modname``, or skip the
current test if the module cannot be imported.
:param modname:
The name of the module to import.
:param minversion:
If given, the imported module's ``__version__`` attribute must be at
least this minimal version, otherwise the test is still skipped.
:param reason:
If given, this reason is shown as the message when the module cannot
be imported.
:returns:
The imported module. This should be assigned to its canonical name.
Example::
docutils = pytest.importorskip("docutils")
"""
import warnings
__tracebackhide__ = True
compile(modname, "", "eval") # to catch syntaxerrors
with warnings.catch_warnings():
# Make sure to ignore ImportWarnings that might happen because
# of existing directories with the same name we're trying to
# import but without a __init__.py file.
warnings.simplefilter("ignore")
try:
__import__(modname)
except ImportError as exc:
if reason is None:
reason = f"could not import {modname!r}: {exc}"
raise Skipped(reason, allow_module_level=True) from None
mod = sys.modules[modname]
if minversion is None:
return mod
verattr = getattr(mod, "__version__", None)
if minversion is not None:
# Imported lazily to improve start-up time.
from packaging.version import Version
if verattr is None or Version(verattr) < Version(minversion):
raise Skipped(
f"module {modname!r} has __version__ {verattr!r}, required is: {minversion!r}",
allow_module_level=True,
)
return mod
参数:
modname:模块名
minversion:要求的最低版本
reason:跳过原因
示例一:modname不满足
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : 韧
# @wx :ren168632201
# @Blog :https://www.cnblogs.com/uncleyong/
import pytest
@pytest.importorskip("requestsx", minversion="2.31.0")
def test_case():
print("---importorskip")
结果:
示例二:minversion不满足
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : 韧
# @wx :ren168632201
# @Blog :https://www.cnblogs.com/uncleyong/
import pytest
@pytest.importorskip("requests", minversion="2.31.0")
def test_case():
print("---importorskip")
结果:
示例三:modname和minversion都满足
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : 韧
# @wx :ren168632201
# @Blog :https://www.cnblogs.com/uncleyong/
import pytest
@pytest.importorskip("requests", minversion="2.26.0")
def test_case():
print("---importorskip")
结果: