pytest 框架 +yaml 文件驱动 轻松接口自动化

本文介绍了如何利用pytest框架结合yaml文件进行接口自动化测试。通过yaml文件管理接口数据,利用pytest的parameterize特性驱动多个接口测试,同时探讨了登录接口的处理、断言方法、依赖接口的处理、测试报告定制以及日志记录等关键点。
摘要由CSDN通过智能技术生成

目录

前言:

1:如何获取 yaml 文件中的数据 这个真的够啰嗦

2:将接口数据写到 yaml 文件中 然后读取测试其实很简单 和 excel 操作一样,只需要封装一些操作 yaml 文件的函数即可.但是如果用 pytest 框架将如何实现多个接口驱动呢?

3: 接上个问题 有关联的接口该怎么办 我还没有什么明智的解放 那就只能一个一个处理了,但是有关联的接口也可以再划分 比如登录接口,那是所以接口都会依赖的 主要是取其 token 数据 那就把它放到 conftest 中 登录一次 返回 token 即可

4:如何断言 前辈的 demo 中 有二种比对 比对全部 json 传 比对包含的数据 比对全部数据 使用情况极少,因为很少接口返回每次都一样的数据, 比对包含的字符我又用 我又加了一种 那就是比对 key-value,用到了 我上边说的工具函数

5:测试中总不可能只涉及到一个被测系统 比如需要修改一些配置等 那肯定要设计到后台的一些功能 当然用 selenium 的方式也可以实现 这里还是统一风格 用接口吧

6: pytest-html 默认的报告模式无法满足我 ,我只想保留错误接口的日志输出 ,想要添加一些 description 来说明接口测试的流程 所以需要在最外层的 conftest.py 中添加两个 hook

7:用例不通过 如何快速定位 当日是通过详细的 log 了 我的 log 信息 记录了每一个接口的输入输出 以及对用例步骤进行了日志的区分 如下


前言:

pytest 框架 +yaml 文件驱动是一个非常方便的接口自动化测试方法。它可以让我们通过 yaml 文件来配置测试用例,简化测试代码的编写和维护。

先看下 yaml 文件的设计 yaml 文件我也比较喜欢 可以用& * 等符合定义和引用变量 很方便 这样这个接口数据会比较少

---
Test:
 desc: "登录"
 parameters:
  -
    #测试登录
    desc: 测试登录
    method: post
    url: /gw-driver/zhuanche-driver/driver/login
    data:
       -
      request-ts: '1574940616636'
      sign: 0841B69FB087643979BF464E34350AA3
      type: '2'
    ··-
      request-ts: '1574940616636'
      sign: 0841B69FB087643979BF464E34350AA3
      type: '1'
    header: &header
        car-pf: ANDROID_DRIVER
        car-ps: shouqi
        car-sv: 8.1.0
        car-mv: OPPO OPPO PACM00
        appCode: android_special_driver
    assert_code: 200
    assert_in_text: 登录成功
    assert_contents:
       code: 0

1:如何获取 yaml 文件中的数据 这个真的够啰嗦

class GetData():


  def __init__(self,file_name):
      '''
      获取filename.yaml 配置文件的所有数据
      '''
      self.desc = []
      self.method = []
      self.url = []
      self.data = []
      self.header = []
      self.assert_code = []
      self.assert_text = []
      self.assert_in_text = []
      self.assert_body_has = []
      log.info('解析yaml文件 path:' + str(path) + ' Param/Yaml/'+file_name+'.yaml')
      param = get_param(file_name)
      for i in range(0, len(param)):
          self.method.append(param[i]['method'])
          self.url.append(param[i]['url'])
          self.header.append(param[i]['header'])
          if 'desc' in param[i]:
              self.desc.append(param[i]['desc'])
          else:
              self.desc.append(None)
          if 'data' in param[i]:
              self.data.append(param[i]['data'])
          else:
              self.data.append(None)
          if 'assert_code' in param[i]:
              self.assert_code.append(param[i]['assert_code'])
          else:
              self.assert_code.append(None)
          if 'assert_text' in param[i]:
              self.assert_text.append(param[i]['assert_text'])
          else:
              self.assert_text.append(None)
          if 'assert_body_has' in param[i]:
              self.assert_body_has.append(param[i]['assert_body_has'])
          else:
              self.assert_body_has.append(None)
              # 断言数据列表化
          if 'assert_in_text' in param[i]:
              text = param[i]['assert_in_text']
              Ltext = list(text.split(' '))
              self.assert_in_text.append(Ltext)
          else:
              self.assert_in_text.append(None)

我以抛出问题的方式讲述吧

2:将接口数据写到 yaml 文件中 然后读取测试其实很简单 和 excel 操作一样,只需要封装一些操作 yaml 文件的函数即可.但是如果用 pytest 框架将如何实现多个接口驱动呢?

毕竟有很多接口其实都没有依赖性的 我们没有必要一个接口写一个 test 那样效率太堪忧 其实基于 pytest 的 parameterize 特性 一切就可以解决了

#urls 为读取到yaml文件中的所有url type:list 如何获取数据 查看 title1
 @pytest.mark.parametrize('url',urls)
    def test_home_page(self,url):
        '''
        :param url:
        :return:
        '''
        request = Request.Request(res)

        #获取测试数据在yaml文件中的索引 关于重复的url目前还没有解决 所以只支持不同的url
        index=urls.index(url)
        log.info('测试接口描述:'+str(descs[index])) #打印日志

        response=request.send_request(methods[index],urls[index],params[index],headers[index])

        assert test.assert_code(response['code'], assert_codes[index])
        if assert_in_texts[index] is not None:
            assert test.assert_in_text(response['body'],*assert_in_texts[index])


 @pytest.mark.parametrize('url',base_conf.urls)
    def test_home_page_config(self,get_init_data,url):
        '''
        测试首页单接口
        :param get_init_data:
        :param url:
        :return:
        '''

        res=get_init_data
        request = Request.Request(res)
        #获取测试数据在yaml文件中的索引
        index=base_conf.urls.index(url)
        if base_conf.run[index] == False:
            pytest.skip('skip')
            base_conf.log.info('测试接口描述:'+str(base_conf.descs[index]))

        replace_data(res,base_conf.headers[index],base_conf.params[index])

        #处理一个接口有多个用例数据
        if type(base_conf.params[index])==list:
            for i in base_conf.params[index]:
                response&
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
码尚是一家提供各种IT 培训的机构,而python requests、pytest、allure、yaml、ddt和logs是接口自动化测试中非常常用的一些工具和框架Python requests是Python中一个非常强大的HTTP客户端库,可以轻松地向Web服务器发送HTTP请求,并处理服务器响应。Python requests库优雅的API设计和灵活的功能使得它成为了接口测试中必不可少的一部分。 PytestPython中一个非常简洁、灵活的单元测试工具,它支持多种测试方法和插件,并且易于配置和使用。Pytest接口自动化测试中的一个非常好的特性是支持参数化,能够让测试数据更清晰地呈现,并且可以减少重复代码。 Allure 是一个开源的测试报告框架,兼容多种编程语言和测试框架,可以生成美观且易于沟通的测试报告,支持各种报告维度和数据展示方式,让测试结果更加清晰明了。 Yaml 是一种流行的轻量级数据序列化语言,可以方便的表示数据结构和模型,被广泛应用于接口自动化测试中的测试数据存储和管理。 DDT是一个Python数据驱动测试工具,它可以用来重复运行测试用例并且使用不同参数输入,使得测试用例变得更加灵活和节省测试时间。 Logs 是一种在接口自动化测试中常用的日志框架,它可以记录测试过程中的详细信息和异常信息,以便后续分析问题和排查错误。 通过使用这些工具和框架,码尚可以建立一个方便、快捷、稳定的接口自动化测试框架,提高测试效率和可靠性。每个工具和框架都有自己的优势和特点,选择合适的工具和框架可以更好地满足测试需求和提高诊断精度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值