首先,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、具体使用
- 每个用户的config中,先获取环境的值
- 在用例的全局变量中,获取个环境的信息(调用debugtalk方法)
- 用例中引用全局变量
- 代码如下
# 执行用例前,重写.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()
-
做此改造的目的:
- 支持多环境执行
- .env文件维护起来比较方便
- 将账号信息等区分不同环境且较稳定不易变化的信息单独存放,框架结构更加清晰
- 对执行人员黑盒,减少组内成员理解不同环境成本,直接调用即可