httprunner測試框架(一):支援不同環境執行

七年!發表於2024-04-29

首先,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

sys.path.append('..')
from log.log import MyLog


path = ''
# MyLog.debug('環境變數檔案路徑 ->{}'.format(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()
# print(allEnvList)
 

3、編寫自定義方法,過步驟1中的得出的執行環境查詢當前環境的資料
- 結合debugtalk.py檔案實現(以下程式碼在debugtalk.py中編寫)

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. 對執行人員黑盒,減少組內成員理解不同環境成本,直接呼叫即可

相關文章