【pytest学习12】@pytest.mark.skip()跳过用例

执行自动化用例的过程中,遇到已知bug或者其他平台的执行内容,这个时候我们可以选择用跳过用例,在unittest中有无条件跳过,也有满足条件进行跳过,那么pytest中也存在跳过用例。

skip

前面介绍了mark的时候,知道mark属于标记用例,那么当mark.skip的时候就表示无条件进行跳过用例

复制代码
import pytest

class Test01():

    @pytest.mark.skip()
    def test_01(self):
        print('---用例01---')

    def test_02(self):
        print('---用例02---')

    @pytest.mark.skip()
    def test_03(self):
        print('---用例03---')

if __name__ == '__main__':
    pytest.main(['-vs'])
复制代码

通过下图可以发现,我们执行的用例1和用例3均被跳过了。

reason参数

执行跳过用例过程中,可以进行加入reason参数进行对跳过的用例进行补充说明详细信息,以及跳过的原因内容

复制代码
import pytest
data =  [{'user': "anjing",
         'pwd': "123",},
        {'user': "admin",
         "pwd": "123"},]

@pytest.fixture(params=data)
def login(request):
        yield request.param


class Test01():

    @pytest.mark.skip(reason='该用例存在bug,请跳过!')
    def test_01(self):
        print('---用例01---')


    def test_02(self):
        print('---用例02---')

    @pytest.mark.skip(reason='该用例还没有编写完成,请跳过')
    def test_03(self):
        print('---用例03---')

if __name__ == '__main__':
    pytest.main(['-vs'])
复制代码

通过下图可以看出来,用例1和用例3进行了跳过,并补充了详细的说明

函数中判断是否跳过

举个例子,如果我们测试后台过程中,不同的账号登录,会有不同的权限,如果其中一个用户没有改权限测试此功能,也让跳过,这个时候我们就会通过pytest.skip的方法进行判断进行跳过

复制代码
import pytest
data =  [{'user': "anjing",
         'pwd': "123",},
        {'user': "admin",
         "pwd": "123"},]

@pytest.fixture(params=data)
def login(request):
        yield request.param


class Test01():

    def test_01(self,login):
        if login['user']=='anjing' and login['pwd']=='123':
            print('用户:%s登录成功'%login['user'])
            print('执行用例01')
        else:
            pytest.skip("用户:%s没有权限进行操作xx功能"%login['user'])

    def test_02(self):
        print('---用例02---')

    def test_03(self):
        print('---用例03---')

if __name__ == '__main__':
    pytest.main(['-vs'])
复制代码

通过执行结果发现,参数admin没有通过,然后进行了跳过。当然用例之间的判断不仅仅这样,只是简单的举个例子,具体的结合实际项目为准

skipif

 skipif也是属于mark中的一个方法,也是跳过用例的内容,支持条件跳过,比如该用例只能在Windows上执行。 @pytest.mark.skipif(condition, reason='跳过的原因!') 

其中condition表示跳过的条件,为True则跳过,reason和上述一样,表示跳过的自定义条件

复制代码
import pytest
import sys


class Test01():

    @pytest.mark.skipif(sys.platform=='win32', reason='在linux上运行,跳过Windows')
    def test_01(self):
        print('---用例01---')

    def test_02(self):
        print('---用例02---')

    def test_03(self):
        print('---用例03---')

if __name__ == '__main__':
    pytest.main(['-vs'])
复制代码

通过下图可以发现,安静在Windows上运行代码时,自动跳过了。注意:skipif必须要带上跳过的详细信息,要不然会报错

整个类自动跳过

skip和skipif不仅仅能够函数上进行添加装饰器,还可以直接在类上进行使用,直接跳过整个类。

复制代码
import pytest
import sys

@pytest.mark.skipif(sys.platform=='win32', reason='在linux上运行,跳过Windows')
class Test01():

    def test_01(self):
        print('---用例01---')

    def test_02(self):
        print('---用例02---')

    def test_03(self):
        print('---用例03---')

if __name__ == '__main__':
    pytest.main(['-vs'])
复制代码

先来个图为skipif在类上进行跳过

skip跳过类

复制代码
import pytest


@pytest.mark.skip(reason='改功能还未实现,请跳过用例')
class Test01():

    def test_01(self):
        print('---用例01---')

    def test_02(self):
        print('---用例02---')

    def test_03(self):
        print('---用例03---')

if __name__ == '__main__':
    pytest.main(['-vs'])
复制代码

xfail

在执行自动化的时候,会有这种情况,知道该功能存在稳定性问题,不想要执行,但是也不想要跳过。这个时候我们就可以使用xfail,xfail表示测试期望是失败的,不会影响测试用例的执行,如果执行成功则报xpass,如果失败就会报xfail。

复制代码
import pytest

class Test01:

    @pytest.mark.xfail()
    def test_01(self):
        print('---用例01---,该功能暂未实现!')

    def test_02(self):
        print('---用例02---')

    @pytest.mark.xfail()
    def test_03(self):
        print('---用例03---,预期用例失败!')
        assert 1==2

if __name__ == '__main__':
    pytest.main(['-vs'])
复制代码

通过执行结果可以看出来,我们通过xfail标记的用例,已经全部执行,执行成功的显示xpass,失败的显示xfail,执行失败也没有继续报错。

 

 

 另一种写法:

有的小伙伴们觉得,在用例前标记比较麻烦,能在用例中进行标记吗?当然是可以的。

复制代码
import pytest

class Test01:

    def test_01(self):
        pytest.xfail(reason='该功能暂时未实现!')
        print('---用例01---')

    def test_02(self):
        print('---用例02---')

    def test_03(self):
        print('---用例03---,预期用例失败!')
        pytest.xfail(reason='该功能存在bug')
        assert 1==2

if __name__ == '__main__':
    pytest.main(['-vs'])
复制代码

通过执行结果可以看到,test_01和test_03已经被预计失败了,细心的朋友会发现,pytest.xfail在用例中标记的时候,代码执行完这句话后就立即退出该用例,继续执行下一条用例。

posted @ 2021-05-31 16:07  陈晓猛  阅读(367)  评论(0编辑  收藏  举报