什么是接口关联
接口的关联是指在接口测试中,将一个接口的输出作为另一个接口的输入,以便完成复杂的业务流程测试。这种关联通常出现在具有多步交互或依赖关系的接口测试场景中。
基于Pytest进行接口关联的3种方式
- 类的全局属性
- pytest的fixture
- 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种方式均是依赖于上一个接口的运行结果,因此在具体运行的时候,需要全局进行运行,先执行上游接口,赋值,然后再进行下游接口调用
如果单独运行下游接口,则还没获取到上游接口的值,下游接口就直接调用,会获取失败;
因此代码也是有执行顺序的