Pytest接口关联的三种方式

什么是接口关联

接口的关联是指在接口测试中,将一个接口的输出作为另一个接口的输入,以便完成复杂的业务流程测试。这种关联通常出现在具有多步交互或依赖关系的接口测试场景中。

基于Pytest进行接口关联的3种方式

  1. 类的全局属性
  2. pytest的fixture
  3. pytest-dependency 第三方库

类的全局属性

这种方式一般是将作用域扩大,作为整个测试类的全局属性来处理,将前一个接口提取出来的值赋值给类的全局变量,然后就可以实现在不同方法之间进行调用

具体代码示例:

import pytest

class TestScope:

    token = None  # 全局变量

    def test_a(self):
        TestScope.token = "123456"  # 通过类名.变量名  将获取到的值给重新赋值

    def test_b(self):
        print(TestScope.token)  # 在第二个方法种通过 类名.变量名进行调用 会输出 123456

        
if __name__ == '__main__':
    pytest.main()

pytest的fixture

pytest 自己本身也提供了共享域的方法,通过一个通用方法,设定pytest的共享域范围大小,从而调用这个通用方法,进行接口的关联值获取

具体代码示例:

import pytest


@pytest.fixture(scope="session")  # 作用域为整个 session 域 
def value():
    return {
    
    
        "verify_code": ""
    }


class TestConnectInterface:

	# value["verify_code"] 通过这种方式,进行获取方法种指定的变量 然后可以赋值
	# 再通过value["verify_code"] 即可调用已经赋值过的变量值

    def test_verify_code1(self, value):
        value["verify_code"] = "123456"  # 给 verify_code  变量赋值

    def test_login_success(self, value):
     	# 调用 verify_code 输出 123456
        print("login_success:", value["verify_code"]) 
        

if __name__ == '__main__':
    pytest.main()


pytest-dependency 第三方库

pytest-dependency 是一个用于管理测试用例之间依赖关系的第三方库。在测试中,有时会遇到以下场景:

  • 某些测试用例依赖于其他测试用例的执行结果。 如果前置的测试失败,依赖它的测试应该被跳过。
  • pytest-dependency 提供了解决这种依赖关系的简单方法。
安装

可以通过 pip 安装该库:

pip install pytest-dependency
用法

声明依赖关系

  • 使用 @pytest.mark.dependency 标记依赖的测试用例。
  • 使用 depends 参数指定依赖的其他测试用例。
  • 将前一个接口变量 保存到 pytest 全局属性当中 , 再在下一个接口进行调用即可

具体代码示例:

import pytest


class TestDependency:

    """
        pip install pytest-dependency
    """
    @pytest.mark.dependency()
    def test_a(self):
        # 假设从接口或其他地方获取到验证码
        verify_code = "123456"
        pytest.verify_code = verify_code  # 将验证码存储到 pytest 的全局属性中
        print("test_a executed successfully")  # 确认 test_a 是否执行

	# 依赖前一个接口 depends=["TestDependency::test_a"] 
	# TestDependency::test_a 表明依赖于 TestDependency 类下面的  test_a 方法
    @pytest.mark.dependency(depends=["TestDependency::test_a"]) 
    def test_b(self):
        # 获取 test_a 存储的验证码
        code = pytest.verify_code  # 直接通过 pytest 获取验证码
        print("test_b:", code)  # 打印验证码 输出 123456


if __name__ == '__main__':
    pytest.main()

注意事项

以上3种方式均是依赖于上一个接口的运行结果,因此在具体运行的时候,需要全局进行运行,先执行上游接口,赋值,然后再进行下游接口调用
如果单独运行下游接口,则还没获取到上游接口的值,下游接口就直接调用,会获取失败;
因此代码也是有执行顺序的