接口依赖怎么处理

接口依赖

面试的时候经常会被问到在接口自动化测试过程中怎么处理接口依赖?

首先我们要搞清楚什么是接口依赖。

1. 什么是接口依赖

接口依赖指的是,在接口测试的过程中一个接口的测试经常需要依赖另一个或多个接口成功请求后的返回数据。

那怎么处理呢?不同场景的处理方式有所不同。

2. 接口依赖的多种场景

2.1 单接口测试

在单接口测试时接口依赖有两种场景。

  1. 在整个接口用例测试前的依赖

    例如:需要登录后的接口,需要在测试前先访问登录接口获取对应的鉴权凭证,例如 token。

  2. 在接口的每一个用例测试前的依赖

    例如:项目审核接口,需要在每次测试前都创建一个项目

2.2 业务流测试

多接口测试业务流时,下一个接口依赖上一个接口的执行结果。

3. 解决方案

不同场景下的解决方案不同。我们在做接口自动化时不管是 python 语言还是 Java 语言,都会使用单元测试框架。这里我们主要以 python 的 unittest 框架为主,不同框架只是实现方式有所不同,但是思想架构都大同小异。

不管是那种场景的接口依赖都可以通过单元测试框架的前置条件/脚手架代码进行处理,不同的是如何传递依赖的数据。几乎是所有的单元测试框架中用例都被设计成隔离的,也即是用例对象和用例对象间是隔离的,独立的。所以传递依赖数据需要一个第三方容器。一般有两种方案:

  1. 定义一个全局变量来共享
  2. 通过当前测试用例类的类属性共享

3.1 单接口测试场景 1 解决方案

在整个接口用例测试前的依赖,我们放在 unittest 框架的类级前置方法 setUpClass 中进行处理。数据传递通过全局变量和类属性进行共享都可以,代码示例如下:

  import unittest


def do_something():
    """
    模拟表示前置接口
    """
    return 3.14


# 定义一个全局变量类

class EnvData:
    pass


class SomeTestCase(unittest.TestCase):

    @classmethod
    def setUpClass(cls) -> None:
        # 执行前置操作
        data = do_something()
        # 将data绑定到全局变量类的类属性上
        EnvData.data = data
        # 将data绑定到当前类的类属性上
        cls.data = data

    def test_something(self):
        print('执行测试')
        # 获取前置方法中产生的数据
        # 从全局变量中获取
        print(EnvData.data)
        # 从当前用例的类属性中获取
        print(self.__class__.data)
        # 如果当前用例对象没有同名对象属性,也可以直接从对象属性中获取
        print(self.data)

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

推荐使用类属性进行传递。

3.2 单接口测试场景 2 解决方案

在接口的每一个用例测试前的依赖,放到 unittest 框架的方法级前置方法 setUp 中进行处理。数据可以通过全局变量,类属性,对象属性进行传递,推荐使用对象属性。代码示例如下:

  import unittest


def do_something():
    """
    模拟表示前置接口
    """
    return 3.14


class SomeTestCase(unittest.TestCase):

    def setUp(self) -> None:
        # 执行前置操作
        data = do_something()
        # 将data绑定到当前对象的属性上
        self.data = data

    def test_something(self):
        print('执行测试')
        # 获取前置方法中产生的数据
        # 从对象属性中获取
        print(self.data)

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

3.3 业务流测试场景解决方案

业务流测试时,需要将前一个用例的结果传递给后面的用例。因为用例间是隔离的,所以可以通过全局变量和类属性进行传递。代码示例如下:

  import unittest

# 定义一个全局变量类

class EnvData:
    pass


class SomeTestCase(unittest.TestCase):
  
    def test_01case(self):
        # 模拟接口返回需要传递的数据
        res1 = 1
        # 将需要传递的数据保存到全局变量类的属性中
        EnvData.res1 = res1
        # 也可以绑定到当前用例类中进行传递
        self.__class__.res1 = res1
  
    def test_02case(self):
        # 获取上一个接口传递的数据
        # 通过全局变量类获取
        res1 = EnvData.res1
        # 通过类属性获取
        res1 = self.__class__.res1
        # 如果没有同名的对象属性也可以直接通过对象属性获取
        res1 = self.res1

4. 总结

了解了上面的类容,我们来总结一下,接口自动化时怎么处理接口依赖 这个问题的回答如下:

对于单接口测试如果依赖接口只需要在测试开始执行一次,那么可以将依赖接口的请求放在类级前置方法中,然后通过全局变量或者当前用例类属性来传递依赖数据。

对于单接口测试如果依赖接口需要在每个用例前执行,那么可以将依赖接口的请求放在方法级前置方法中,然后通过用例对象属性来传递依赖数据

对于多接口的业务流测试,可以将下一个接口需要依赖的数据通过当前用例类属性来传递依赖数据。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、接口测试:接口(重点) A、是什么? 数据交互的入口和出口,是一套规范一套标准分类:硬件 ----- USB ...
    MAVIS_42bf阅读 724评论 0 0
  • 1.能够大致讲一下你们接口自动化框架是怎么搭建的吗? 好的,我们采用unittest和ddt数据驱动思想搭建测试框...
    arvin_one阅读 4,725评论 0 21
  • 第一阶段:前置基础知识 知识点: 1)计算机基础 计算机组成部分、操作系统分类、B/S和C/S架构、常用DOS命令...
    鹤子青云上阅读 2,376评论 0 1
  • 测试发现bug 开发不认为是bug的时候你怎么办? 1.1、首先明确开发说不是bug的理由。 1.2、如果是需求变...
    贩低阅读 634评论 0 0
  • 网络协议 0.1 http与https 10.1.1 什么是超文本 超文本是用超链接的方法,将各种不同空间的文字信...
    会冒泡的鱼____阅读 531评论 0 0