引入
在测试执行过程中, 我们常常出现这种情况:因为功能阻塞,未实现或者环境有问题等等原因,一些用例执行不了,这时我们就需要跳过这些用例。如果将用例删除或注释掉,也太low了点。开始我们的学习~
跳过测试用例
@pytest.mark.skip()
如果我们想要跳过某条用例,我们可以直接用@pytest.mark.skip()标签来装饰该用例。
吃个小荔枝:我们在要跳过的测试用例上加上@pytest.mark.skip()标签,可以选择传入一个非必须参数reason表示原因。需要说明的是我们在pytest.main()方法中新加了一个参数"-r",他可以显示出每个用例的简短的执行结果,关于参数可以查看学习pytest的第一天-----安装+用例设计规则+pytest命令。
#文件名是test_firstFile.py
#coding=utf-8
import pytest
class Test_Pytest():
@pytest.mark.skip(reason="就是不想执行而已")
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_Pytest.py','test_Pytest.py'])
运行结果如下图1:我们可以清楚的看到被标记的测试方法,被跳过去未被执行。
@pytest.mark.skipif()
其实看到了标签我们就已经猜到了它是根据某个条件来判断是否跳过该用例,如果该条件的返回值是True便跳过。
吃个荔枝:我们在要判断是否要跳过的测试用例上添加@pytest.mark.skipif()标签;传入condition参数,也就是判断条件,该参数是必须参数;可以选择传入非必须参数reason:跳过的原因;如果多个标签一起使用,满足其中一个跳过条件则会跳过该用例。
#文件名是test_firstFile.py
#coding=utf-8
import pytest
class Test_Pytest():
@pytest.mark.skipif(condition=2>1,reason="因为2比1大")
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_Pytest.py','test_Pytest.py'])
执行结果和上图一样,这里便不展示了。
无论是@pytest.mark.skip()标签还是@pytest.mark.skipif()标签,如果你想在多个测试方法上装饰,依次写起来很麻烦的话,你可以选择定义个变量让它等于标签,然后在装饰的时候用该变量代替标签。这种方法,你还可以通过在其他模块中导入的变量的方式,在其他模块中共享标签;如果可以这样的话,我们为什么不新建一个模块用来存放标签呢?这样是不是又方便了许多。
#test_Pytest.py文件
#coding=utf-8
import pytest
myskip=pytest.mark.skipif(condition=2>1,reason="就是不想执行")
class Test_Pytest():
@myskip
def test_one(self,):
print("test_one方法执行" )
assert 1==1
def test_two(self):
print("test_two方法执行" )
assert "o" in "love"
@myskip
def test_three(self):
print("test_three方法执行" )
assert 3-2==1
if __name__=="__main__":
pytest.main(['-s','-r','test_Pytest.py','test_Pytest.py'])
pytest.skip()
除了通过使用标签的方式,还可以在测试用例中调用pytest.skip()方法来实现跳过,可以选择传入msg参数来说明跳过原因;如果想要通过判断是否跳过,可以写在if判断里(_)。
荔枝:
#文件名是test_firstFile.py
#coding=utf-8
import pytest
class Test_Pytest():
def test_one(self):
pytest.skip(msg="就是不想执行")
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_Pytest.py','test_Pytest.py'])
运行结果稍有不同:它显示出了跳过的位置。
跳过测试类
跳过测试类其实和跳过测试方法一样,我们可以使用@pytest.mark.skip()和@pytest.mark.skipif()两个标签,用他们装饰测试类就好啦。
这里就举一个简单的小荔枝:判断条件是当然Python版本低于3.6。
#test_Pytest.py文件
#coding=utf-8
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_Pytest.py','test_Pytest.py'])
运行结果如下图:运行的环境是3.5.2,所以测试类中的所有用例都跳过了。
强烈建议不要在使用继承的类上使用skipif。 pytest中的一个已知错误标记可能会导致超类中的意外行为(虽然现在还不知道这句话是啥意思,但是看到就先记录下来)。
跳过模块
我们跳过测试用例和测试类可以标签装饰他们,那我们要跳过模块要怎么装饰他们呢?我们使用pytestmark(不可更改变量名)变量,让他等于标签即可。
荔枝:
#test_Pytest.py文件
#coding=utf-8
import pytest
import sys
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_Pytest.py','test_Pytest.py'])
运行结果如下图:
再充一点:
在学习skip过程中,发现如果想要运行多个文件可以这么写:依次将要运行的文件名写在后面即可,用逗号隔开,无需链表元组等形式。
pytest.main(['-s','test_Pytest.py','test_firstFile.py'])