pytest上一个用例失败后,跳过下一个用例(用例a失败,跳过与之关联的b用例)。pytest.mark.dependency用例依赖。

实际写代码的时候会遇到这样的问题,以登录登出为例,登录失败后我们怎么跳过登出的用例,因为登录失败后测试登出没有意义结果里的报错也没有意义。

这里使用到了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
     

使用注意点:

  1. 首先我们需要在用例开始的位置打上一个装饰器@pytest.mark.dependency(),这是代表这条用例作为主条件,如果这条用例失败,关联它的用例会跳过执行。
  2. 在被关联的用例上,也打上带参数的装饰器@pytest.mark.dependency(),depends接受的参数是关联的依赖用例名。
  3. 在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已被跳过。所以这一个也将被跳过。

pytest上一个用例失败后,跳过下一个用例(用例a失败,跳过与之关联的b用例)。pytest.mark.dependency用例依赖。_第1张图片

从结果得知

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

pytest上一个用例失败后,跳过下一个用例(用例a失败,跳过与之关联的b用例)。pytest.mark.dependency用例依赖。_第2张图片 这种情况下,依赖的test_a为当前class Test2中的test_a,所以test_b的结果是pass。

如果想让其依赖于class Test1中的test_a可以将depends=["test_a"],修改为depends=["Test1::test_a"],代码就不贴了,大家改下就行,执行结果如下,test_b就会变为skippytest上一个用例失败后,跳过下一个用例(用例a失败,跳过与之关联的b用例)。pytest.mark.dependency用例依赖。_第3张图片

  • 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

pytest上一个用例失败后,跳过下一个用例(用例a失败,跳过与之关联的b用例)。pytest.mark.dependency用例依赖。_第4张图片

 从结果得知,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作用于全局,可跨目录调用。但被依赖的用例必须先执行,否则用例会执行跳过!!!!

代码如下

# 当前在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")

pytest上一个用例失败后,跳过下一个用例(用例a失败,跳过与之关联的b用例)。pytest.mark.dependency用例依赖。_第5张图片

你可能感兴趣的:(python3,pytest,测试用例,压力测试,python3)