基于httprunner实现接口测试框架(一):实现不同环境执行脚本

首先,httprunner已经是一个较完善的接口测试框架了,基本可以拿来即用,本文提供一种支持不同环境执行用例的实现思想,其余部分均是采用httprunner脚手架搭建

  • httprunner工作原理:执行前会先加载.env文件,将.env文件中的内容加载到内存中,如下图所示
    在这里插入图片描述

  • .env文件
    htttprunner可以获取.env文件中的环境变量,因此,可以通过如下角度实现:
    1、先获取当前的执行环境,通过方法:${ENV(envType)}
    2、通过json/yml文件维护一份环境信息,用于区分不同环境,如:账号、密码、域名等

    • 环境信息格式:

      • 环境信息格式
       {
        "id": "873e1ffa-9b86-41ab-b541-99c22a173007",
        "name": "环境1",
        "values": [
          {
            "key": "host",
            "value": "www1.test.vip",
            "type": "default",
            "enabled": true,
            "remarks": "域名"
          },
          {
            "key": "username",
            "value": "邱开亮2",
            "type": "default",
            "enabled": true,
            "remarks": "用户名"
          }
        ]
      }
      
      • 框架结构(每个环境单独维护一个文件,如截图中所示)
        在这里插入图片描述
    • 读取所有环境信息,汇聚list存储所有环境信息(和上述环境信息存在同一文件夹下,命名:env.py)

       import json
       import os
       import sys
       from log.log import MyLog
       path = ''
       
       def getValues_ofEnv(dir):
           """
           :param dir: env.json文件路径
           :return: env.json文件{key:"",value:""}"""
           with open(dir, 'rb') as f:
               data = json.load(f)
           return data
       
       
       envFileList = [path + 'env14.json', path + 'envIM.json', path + 'envCN.json']
       dataList = [getValues_ofEnv(envFileList[0]), getValues_ofEnv(envFileList[1]), getValues_ofEnv(envFileList[2])]
       
       
       def getValueByKey(values, key):
           """
           :param values: env.json文件{key:"", value:""}:param key: env.json文件key字段对应值
           :return: env.json文件中value字段值
           """
           for i in values:
               # i = {'key': 'host', 'value': 'www14.teacherin.vip', 'type': 'default', 'enabled': True}
               if i['key'] == key:
                   return i['value']
           else:
               return ''
       
       
       def getAllEnvList():
           """
           :return: 所有环境的变量key 以及其对应不同环境value值,形如
           {'key': 'host', 'value14': 'www14.teacherin.vip', 'valueIM': 'www.teacherin.vip', 'valueCN': 'www.teacherin.cn'}
           """
           env14 = dataList[0]['values']
           env_list = []
           for j in range(len(env14)):
               # env14[j] = {'key': 'host', 'value': 'www14.teacherin.vip', 'type': 'default', 'enabled': True}
               key = list(env14[j].values())[0]
               value14 = list(env14[j].values())[1]
               remarks = list(env14[j].values())[-1]
               env_dict = {
                   "key": key,
                   "remarks": remarks,
                   "value14": value14,
                   "valueIM": getValueByKey(dataList[1]['values'], key=key),
                   "valueCN": getValueByKey(dataList[2]['values'], key=key)
               }
               env_list.append(env_dict)
       
           return env_list
       allEnvList = getAllEnvList()
       	
      
      

    3、编写自定义方法,过步骤1中的得出的执行环境查询当前环境的数据

    • 结合debugtalk.py文件实现(以下代码在debugtalk.py中编写)

      # 根据key、执行环境获取当前环境的value
      from environment.env import allEnvList, getAllEnvList
      def getValeByEnvType(key, envType):
          # MyLog.debug('环境-->:{}'.format(envType))
          target = 'value' + str(envType)
          for i in allEnvList:
              if i['key'] == key:
                  return i[target]
          return 'NUll'
      

    4、具体使用

    1. 每个用户的config中,先获取环境的值
    2. 在用例的全局变量中,获取个环境的信息(调用debugtalk方法)
    3. 用例中引用全局变量
    4. 代码如下
      # 执行用例前,重写.env文件即可(写在run.py方法内,run.py方法作为程序主入口)
      with open(envFile, 'a') as f:
      	  f.truncate(0)  # 清空文件
      	  f.write("envType={}".format(envType))
      
      # 用例文件
      from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
      
      
      class TestCaseWorkspace(HttpRunner):
          config = Config("用户访问工作台").variables(**{
              "env": "${ENV(envType)}",
              "cookie": "${getValeByEnvType(cookie,$env)}"
               }).base_url("https://${getValeByEnvType(host,$env)}").verify(False)
      
          teststeps = [
              Step(
                  RunRequest("个人工作台-/api/v1/user/history/view/3")
                  # .setup_hook("${request_update($request)}")
                  .get("/api/v1/user/history/view/3")
                  .with_headers(
                      **{
                          "accept": "application/json, text/plain, */*",
                          "accept-encoding": "gzip, deflate, br, zstd",
                          "accept-language": "zh-CN,zh;q=0.9",
                      }
                  )
                  .with_cookies(**{"cookie": "$cookie"})
                  .validate()
                  .assert_equal("status_code", 200)
                  .assert_equal("body.code", 0)
                  .assert_equal("body.message", "ok")
              )]
      if __name__ == "__main__":
          TestCaseWorkspace().test_start()
      

做此改造的目的:

  1. 支持多环境执行
  2. .env文件维护起来比较方便
  3. 将账号信息等区分不同环境且较稳定不易变化的信息单独存放,框架结构更加清晰
  4. 对执行人员黑盒,减少组内成员理解不同环境成本,直接调用即可
  • 19
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值