实际写代码的时候会遇到这样的问题,以登录登出为例,登录失败后我们怎么跳过登出的用例,因为登录失败后测试登出没有意义结果里的报错也没有意义。
这里使用到了pytest的三方插件,dependency方法。官方文档大家可以参考下:Using pytest-dependency — pytest-dependency
注:此方法仅能用于pytest框架,如要使用unittest框架,请移步我的另一篇文章,传送门:unittest跳过用例-----上一个测试用例失败后跳过下一个测试用例
pip install pytest-dependency
语法
@pytest.mark.dependency(name=None, depends=0, scope='module')
参数解释:
使用注意点:
import pytest
@pytest.mark.dependency() # 代表这条用例为主条件
@pytest.mark.xfail(reason="deliberate fail") # 标记为xfail
def test_a():
assert False # 故意让test_a失败,后续依赖于test_a的用例均会跳过
@pytest.mark.dependency()
def test_b():
pass # test_b成功,后续依赖于test_b的用例均会执行,不会跳过
@pytest.mark.dependency(depends=["test_a"])
def test_c():
pass # test_c依赖于test_a,所以直接跳过
@pytest.mark.dependency(depends=["test_b"])
def test_d():
pass # test_d依赖于test_b,由于b是成功的,所以test_d会执行通过
@pytest.mark.dependency(depends=["test_b", "test_c"])
def test_e():
pass # test_e取决于test_b和test_c。test_b确实成功了,但test_c已被跳过。所以这一个也将被跳过。
从结果得知
test_a 故意失败。
test_b 成功。
测试_c 被跳过,因为它取决于test_a。
测试_d 取决于成功的test_b。它也将运行并成功。
test_e 取决于test_b和test_c。 test_b确实成功了,但test_c已被跳过。所以这一个也将被跳过
import pytest
class Test1(object):
@pytest.mark.dependency()
@pytest.mark.xfail()
def test_a(self):
assert False
class Test2(object):
@pytest.mark.dependency()
def test_a(self):
pass
@pytest.mark.dependency(depends=["test_a"], scope="class")
def test_b(self):
pass
这种情况下,依赖的test_a为当前class Test2中的test_a,所以test_b的结果是pass。
如果想让其依赖于class Test1中的test_a可以将depends=["test_a"],修改为depends=["Test1::test_a"],代码就不贴了,大家改下就行,执行结果如下,test_b就会变为skip
我们将上面的代码稍微改下,新增一个test_a的函数,将Test1的test_a改为pass,代码如下
import pytest
@pytest.mark.dependency()
@pytest.mark.xfail()
def test_a():
assert False
class Test1(object):
@pytest.mark.dependency()
def test_a(self):
pass
class Test2(object):
@pytest.mark.dependency()
def test_a(self):
pass
@pytest.mark.dependency(depends=["test_a"], scope="module")
def test_b(self):
pass
从结果得知,test_b跳过了,其依赖的test_a为最上面的函数test_a。
经本人多次试验,其依赖关系是本py文件内第一个运行的test_a(本类中同名的test_a除外),大家有兴趣的话可以依次删除最上方的函数test_a和class Test1中的test_a试一下。
如果想指定依赖Test1中的test_a,与上面一样将depends=["Test1::test_a"]即可,依赖Test2中的test_a同理
package作用于当前目录同级的依赖函数,跨目录无法找到依赖的函数,必须在同一目录层级下。
使用方法:
session作用于全局,可跨目录调用。但被依赖的用例必须先执行,否则用例会执行跳过!!!!
代码如下
# 当前在B/testB2.py文件下的代码写法
@pytest.mark.dependency(depends=["B/testB1.py::Test1::test_a"], scope="package")
@pytest.mark.dependency(depends=["A/testA1.py::Test1::test_a"], scope="session")