【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在用例中标记的时候,代码执行完这句话后就立即退出该用例,继续执行下一条用例。