Python 4.pytest 之 skip 跳过

Maple · 2020年12月26日 · 最后由 Maple 回复于 2021年02月26日 · 1790 次阅读

pytest.mark.skip 可以用于标记某些不想执行的测试用例。

创建test_04.py文件,内容如下

# filename:test_04.py
import pytest

class TestDemo01():

    @pytest.mark.skip(reason='我要跳过')
    def test_01(self):
        print('\ntest_01方法执行')
        assert 1 == 1

    def test_02(self):
        print('\ntest_02方法执行')
        assert 1 == 1

    def test_03(self):
        print('\ntest_03方法执行')
        assert 1 == 1

这样,被标记的方法test_01将不会被执行,也可以在代码执行过程中直接调用pytest.skip(reason)来强制跳过,我们修改test_02方法如下

def test_02(self):
    if 2 > 1:
        pytest.skip("2>1才跳过")
    print('\ntest_02方法执行')
    assert 1 == 1

执行 pytest -s test_04.py命令,你会得到如下结果

============================= test session starts =============================
platform win32 -- Python 3.7.1, pytest-6.0.2, py-1.9.0, pluggy-0.13.1
rootdir: D:\study\auto-pytest
collected 3 items

test_04.py ss
test_03方法执行
.

======================== 1 passed, 2 skipped in 0.06s =========================

还可以使用pytest.skip(reason, allow_module_level=True)来跳过整个 module,只需要在顶部加入:

if 2>1:
    pytest.skip('跳过整个模块',allow_module_level=True)

这样,只要条件为 True,那么整个模块下的测试用例将不会执行。

skipif

你可以使用 skipif 来在某些条件下跳过测试。 下面是一个在检查 python 的版本是否高于 3.6 的示例:

class TestDemo01():

    @pytest.mark.skipif(sys.version_info > (3, 6), reason='python版本大于3.6就跳过')
    def test_01(self):
        print('\ntest_01方法执行')
        assert 1 == 1

    def test_02(self):
        print('\ntest_02方法执行')
        assert 1 == 1

如果 python 安装版本大于 3.6,则 test_01 方法不会执行。

你可以在各个模块中共享 skipif 标记,比如有下面的模块定义:

import pytest
import sys

maxversion = pytest.mark.skipif(sys.version_info > (3, 6), reason='python版本大于3.6就跳过')

class TestDemo01():

    @maxversion
    def test_01(self):
        print('\ntest_01方法执行')
        assert 1 == 1

    def test_02(self):
        print('\ntest_02方法执行')
        assert 1 == 1

使用定义好的maxversion作为方法装饰器,则对应的用例将不会执行。

如果其他模块也会用到相同条件的跳过,可以从别的模块导入,你可以这样写

# filename: test_skip.py
from test_04 import maxversion

@maxversion
def test_function():
    .....

跳过模块或者 class 中的所有测试

你可以在 class 上使用 skipif 标记:

@pytest.mark.skipif(sys.version_info > (3, 6), reason='python版本大于3.6就跳过')
class TestDemo01():

    def test_01(self):
        print('test_01被执行')

如果要跳过模块的所有测试功能,可以在全局级别使用 pytestmark 名称

pytestmark = pytest.mark.skipif(sys.version_info > (3, 6), reason='python版本大于3.6就跳过')
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 2 条回复 时间 点赞

hello ,请教楼主,如何实现根据 test_01 的结果 true 就执行 test_02 用例,false 则跳过呢?

cwen 回复

弄个变量,如果 test01 通过,设置 1,不通过设置 0,在 skipif 中判断,你觉得可行吗

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册