实际写代码的时候会遇到这样的问题,以登录登出为例,登录失败后我们怎么跳过登出的用例,因为登录失败后测试登出没有意义结果里的报错也没有意义。
这里使用到了pytest的三方插件,dependency方法。官方文档大家可以参考下:Using pytest-dependency — pytest-dependency
注:此方法仅能用于pytest框架,如要使用unittest框架,请移步我的另一篇文章,传送门:unittest跳过用例-----上一个测试用例失败后跳过下一个测试用例
1、安装
pip install pytest-dependency
2、基本用法
语法
@pytest.mark.dependency(name=None, depends=0, scope='module')
参数解释:
- name(str):依赖测试所引用的测试名称。如果未设置,则默认为pytest定义的节点ID。名称必须唯一。
- depends(iterable of str) : 依赖项,该测试所依赖的测试名称列表。除非所有依赖项都已成功运行,否则将跳过测试。依赖项也必须已被标记修饰。依赖项的名称必须适应范围。
- scope(str):搜索依赖项的范围。必须是'session'、'package'、'module'或'class',默认为module
使用注意点:
- 首先我们需要在用例开始的位置打上一个装饰器@pytest.mark.dependency(),这是代表这条用例作为主条件,如果这条用例失败,关联它的用例会跳过执行。
- 在被关联的用例上,也打上带参数的装饰器@pytest.mark.dependency(),depends接受的参数是关联的依赖用例名。
- 在depends也可以用别名的方式指定用例名。
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已被跳过。所以这一个也将被跳过
3、依赖范围scope
- scope=class, 作用于所属的类,外部类不会被关联
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
- scope=module,不传递scope参数时,默认参数是'module',作用于当前文件,且只会查找当前文件的符合条件的函数名,类里同名的方法不会被依赖。
我们将上面的代码稍微改下,新增一个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同理
- scope=package或session
package作用于当前目录同级的依赖函数,跨目录无法找到依赖的函数,必须在同一目录层级下。
使用方法:
session作用于全局,可跨目录调用。但被依赖的用例必须先执行,否则用例会执行跳过!!!!
代码如下文章来源:https://www.toymoban.com/news/detail-408694.html
# 当前在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")
文章来源地址https://www.toymoban.com/news/detail-408694.html
到了这里,关于pytest上一个用例失败后,跳过下一个用例(用例a失败,跳过与之关联的b用例)。pytest.mark.dependency用例依赖。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!