11.pytest_skip跳过测试用例

pytest.mark.skip可以标记无法在某些平台上运行的测试功能,或者您希望失败的测试功能

skip意味着只有在满足某些条件时才希望测试通过,否则pytest应该跳过运行测试。 常见示例是在非Windows平台上跳过仅限Windows的测试,或跳过测试依赖于当前不可用的外部资源(例如数据库)。

xfail意味着您希望测试由于某种原因而失败。 一个常见的例子是对功能的测试尚未实施,或尚未修复的错误。 当测试通过时尽管预计会失败(标有pytest.mark.xfail),它是一个xpass,将在测试摘要中报告。

pytest计数并分别列出skip和xfail测试。 未显示有关跳过/ xfailed测试的详细信息默认情况下,以避免混乱输出。 您可以使用-r选项查看与“short”字母对应的详细信息显示在测试进度中;

pytest -rxXs # show extra info on xfailed, xpassed, and skipped tests

@pytest.mark.skip()

如果我们想要跳过某条用例,我们可以直接用@pytest.mark.skip()标签来装饰该用例。
我们在要跳过的测试用例上加上@pytest.mark.skip()标签,可以选择传入一个非必须参数reason表示原因。需要说明的是我们在pytest.main()方法中新加了一个参数"-r",他可以显示出每个用例的简短的执行结果

import pytest


@pytest.mark.skip(reason="就是不想执行而已")
def test_one():
        print("test_one方法执行" )
        assert 1==1

def test_two():
        print("test_two方法执行" )
        assert "o" in "love"

def test_three():
        print("test_three方法执行" )
        assert 3-2==1


if __name__=="__main__":
    pytest.main(['-s','test_skipDemo01.py'])

运行结果:

est_skipDemo01.py::test_one SKIPPED                                     [ 33%]
Skipped: 就是不想执行而已

test_skipDemo01.py::test_two PASSED                                      [ 66%]test_two方法执行

test_skipDemo01.py::test_three PASSED                                    [100%]test_three方法执行


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

@pytest.mark.skipif()

其实看到了标签我们就已经猜到了它是根据某个条件来判断是否跳过该用例,如果该条件的返回值是True便跳过。

我们在要判断是否要跳过的测试用例上添加@pytest.mark.skipif()标签;传入condition参数,也就是判断条件,该参数是必须参数;可以选择传入非必须参数reason:跳过的原因;如果多个标签一起使用,满足其中一个跳过条件则会跳过该用例。

import pytest


@pytest.mark.skipif(condition=2>1,reason="因为2>1条件为真,所以跳过")
def test_one():
        print("test_one方法执行" )
        assert 1==1

def test_two():
        print("test_two方法执行" )
        assert "o" in "love"

def test_three():
        print("test_three方法执行" )
        assert 3-2==1


if __name__=="__main__":
    pytest.main(['-s','test_skipDemo01.py'])

运行结果:

test_skipDemo01.py::test_one SKIPPED                                     [ 33%]
Skipped: 因为2>1条件为真,所以跳过

test_skipDemo01.py::test_two PASSED                                      [ 66%]test_two方法执行

test_skipDemo01.py::test_three PASSED                                    [100%]test_three方法执行


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

因为上面consition中条件为真,所有才跳过,如果为假,就继续执行;
无论是@pytest.mark.skip()标签还是@pytest.mark.skipif()标签,如果你想在多个测试方法上装饰,依次写起来很麻烦的话,你可以选择定义个变量让它等于标签,然后在装饰的时候用该变量代替标签。这种方法,你还可以通过在其他模块中导入的变量的方式,在其他模块中共享标签;如果可以这样的话,我们为什么不新建一个模块用来存放标签呢?这样是不是又方便了许多。

import pytest
#定义全局标签
myskip=pytest.mark.skipif(condition=2>1,reason="就是不想执行")
@myskip
def test_one():
        print("test_one方法执行" )
        assert 1==1

def test_two():
        print("test_two方法执行" )
        assert "o" in "love"
@myskip
def test_three():
        print("test_three方法执行" )
        assert 3-2==1


if __name__=="__main__":
    pytest.main(['-s','test_skipDemo01.py'])

pytest.skip()

除了通过使用标签的方式,还可以在测试用例中调用pytest.skip()方法来实现跳过,可以选择传入msg参数来说明跳过原因;如果想要通过判断是否跳过,可以写在if判断里(_)。

import pytest


def test_one():
        #执行跳过
        pytest.skip(msg="跳过原因:不想执行")
        print("test_one方法执行" )
        assert 1==1

def test_two():
        print("test_two方法执行" )
        assert "o" in "love"

def test_three():
        print("test_three方法执行" )
        assert 3-2==1


if __name__=="__main__":
    pytest.main(['-s','test_skipDemo01.py'])

跳过测试类

跳过测试类其实和跳过测试方法一样,我们可以使用@pytest.mark.skip()和@pytest.mark.skipif()两个标签,用他们装饰测试类就好啦。

import pytest
import sys

@pytest.mark.skipif(condition= sys.version >'3.6' ,reason='python版本高于3.6')
class Test_Pytest():

        def test_one(self,):
                print("test_one方法执行" )
                assert 1==1

        def test_two(self):
                print("test_two方法执行" )
                assert "o" in "love"

        def test_three(self):
                print("test_three方法执行" )
                assert 3-2==1

if __name__=="__main__":
    pytest.main(['-s','-r','test_skip_class.py','test_skip_class.py'])

运行结果:


test_skip_class.py::Test_Pytest::test_one SKIPPED                        [ 33%]
Skipped: python版本高于3.6

test_skip_class.py::Test_Pytest::test_two SKIPPED                        [ 66%]
Skipped: python版本高于3.6

test_skip_class.py::Test_Pytest::test_three SKIPPED                      [100%]
Skipped: python版本高于3.6


============================= 3 skipped in 0.04s ==============================

强烈建议不要在使用继承的类上使用skipif。 pytest中的一个已知错误标记可能会导致超类中的意外行为(虽然现在还不知道这句话是啥意思,但是看到就先记录下来)。

跳过模块

我们跳过测试用例和测试类可以标签装饰他们,那我们要跳过模块要怎么装饰他们呢?我们使用pytestmark(不可更改变量名)变量,让他等于标签即可。

import pytest
import sys
#变量名pytestmark是固定写法
pytestmark=pytest.mark.skipif(condition=sys.version_info>(3,6),reason='python版本高于3.6')
class Test_Pytest():

        def test_one(self,):
                print("test_one方法执行" )
                assert 1==1

        def test_two(self):
                print("test_two方法执行" )
                assert "o" in "love"

        def test_three(self):
                print("test_three方法执行" )
                assert 3-2==1

if __name__=="__main__":
    pytest.main(['-s','-r','test_skip_class.py'])

运行结果:

test_skip_class.py::Test_Pytest::test_one SKIPPED                        [ 33%]
Skipped: python版本高于3.6

test_skip_class.py::Test_Pytest::test_two SKIPPED                        [ 66%]
Skipped: python版本高于3.6

test_skip_class.py::Test_Pytest::test_three SKIPPED                      [100%]
Skipped: python版本高于3.6


============================= 3 skipped in 0.03s ==============================

再充一点:
在学习skip过程中,发现如果想要运行多个文件可以这么写:依次将要运行的文件名写在后面即可,用逗号隔开,无需链表元组等形式

pytest.main(['-s','test_Pytest.py','test_firstFile.py'])

你可能感兴趣的:(Pytest)