30行左右代碼實(shí)現(xiàn)一個(gè)類似httprunner的接口框架

框架的最終歸宿往往是領(lǐng)域語(yǔ)言+模板解析。
首先先約定一種所要執(zhí)行操作的表述格式。然后通過(guò)模板解析將描述語(yǔ)言轉(zhuǎn)化為代碼進(jìn)行執(zhí)行。例如,我們可以使用以下yaml文件描述多個(gè)步驟并且需要關(guān)聯(lián)的接口:
apis.yaml:

- name: 獲取百度token接口 # 接口名稱
  request:  # 請(qǐng)求報(bào)文
    url: https://aip.baidubce.com/oauth/2.0/token
    method: get
    params:
      grant_type: client_credentials
      client_id: kPoFYw85FXsnojsy5bB9hu6x
      client_secret: l7SuGBkDQHkjiTPU3m6NaNddD6SCvDMC
  extract:  # 提取變量, 字典格式
    token:  RESPONSE.json()['access_token']  # RESPONSE系統(tǒng)變量,代表響應(yīng)對(duì)象

- name: 百度ORC接口  # 第二個(gè)接口
  request:
    url: https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=${token}  # 使用變量
    method: post
    data:  # 請(qǐng)求體(表單格式)
      url: http://upload-images.jianshu.io/upload_images/7575721-40c847532432e852.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240
  verify:  # 斷言, 列表格式
    - RESPONSE.json()['words_result_num'] == 6

其中,name為該接口或步驟的名稱描述,request段是接口的信息,對(duì)應(yīng)requests.request()的每一個(gè)參數(shù),urlmethod是必要參數(shù),params,headers,cookies,data, json,files,timeout等,并使用對(duì)應(yīng)格式。extract用于提取值, token: RESPONSE.json()['access_token'] ,表示提取該接口響應(yīng)字典中的access_token字段的值保存為名為token的變量。
在第二個(gè)接口的url中通過(guò)使用${token},引用該變量。
verify段類似與extract, 計(jì)算表達(dá)式的值,通過(guò)結(jié)果的True/False判斷該條斷言是否通過(guò)。

上面我們定義了一套接口關(guān)聯(lián)的描述及規(guī)則,下面我們要對(duì)我們的規(guī)則進(jìn)行解析,并加載運(yùn)行,主要分為以下幾步:

  1. 讀取yaml文件并使用yaml.safe_load(f)轉(zhuǎn)為列表/字典
  2. 遍歷列表,每個(gè)列表項(xiàng)是一個(gè)接口
  3. 讀取當(dāng)前列表項(xiàng)(接口)的request段信息,處理${變量}
    1. 將request段(字典格式)重新轉(zhuǎn)會(huì)yaml字符串
    2. 如果包含$使用string.Template('字符串').safe_subtitute(locals()),從locals()當(dāng)前所有局部變量中找到$表示的同名變量,如token,并替換。
    3. 重新將替換后變量的字符串轉(zhuǎn)化為字典
  4. 字典拆包,發(fā)送request請(qǐng)求
  5. 如果請(qǐng)求中有extract字段,使用eval()計(jì)算表達(dá)式的值并保存到局部變量locals()中。
  6. 如果請(qǐng)求中有verify字段,使用eval()計(jì)算表達(dá)式的值,并判斷真假。

實(shí)現(xiàn)代碼:

需要安裝pyyaml: pip install pyyaml

apis_parser.py

import yaml
import requests
from string import Template

with open('apis.yaml', encoding='utf-8') as f:
    apis = yaml.safe_load(f)

for api in apis:
    print("處理請(qǐng)求:", api.get('name'))
    request = api.get('request', {})  # 請(qǐng)求報(bào)文,默認(rèn)值為{}
    # 處理參數(shù)化請(qǐng)求中的${變量}
    request_str = yaml.dump(request)  # 先轉(zhuǎn)為字符串
    if '$' in request_str:
        request_str = Template(request_str).safe_substitute(locals())  # 替換${變量}為局部變量中的同名變量
        request = yaml.safe_load(request_str)  # 重新轉(zhuǎn)為字典
    # 發(fā)送請(qǐng)求
    res = requests.request(**request)  # 字典解包,發(fā)送接口
    # 提取變量
    extract = api.get('extract')
    if extract is not None:  # 如果存在extract
        for key, value in extract.items():
            # 計(jì)算value表達(dá)式,可使用的全局變量為空,可使用的局部變量為RESPONSE(響應(yīng)對(duì)象)
            # 保存變量結(jié)果到局部變量中
            print("提取變量:", key, value)
            locals()[key] = eval(value, {}, {'RESPONSE': res})  
    # 處理斷言
    verify = api.get('verify')
    if verify is not None:
        for line in verify:
            result = eval(line, {}, {'RESPONSE': res}) # 計(jì)算斷言表達(dá)式,True代表成功,F(xiàn)alse代表失敗
            print("斷言:", line, "結(jié)果:", "PASS" if result else "FAIL") 

執(zhí)行結(jié)果:

處理請(qǐng)求: 獲取百度token接口
提取變量: token RESPONSE.json()['access_token']
處理請(qǐng)求: 百度ORC接口
斷言: RESPONSE.json()['words_result_num'] == 6 結(jié)果: PASS
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 框架的最終歸宿往往是領(lǐng)域語(yǔ)言+模板解析。首先先約定一種所要執(zhí)行操作的表述格式。然后通過(guò)模板解析將描述語(yǔ)言轉(zhuǎn)化為代碼...
    韓志超閱讀 835評(píng)論 1 3
  • 實(shí)現(xiàn)代碼: 需要安裝pyyaml: pip install pyyaml apis_parser.py impor...
    琉璃_233a閱讀 148評(píng)論 0 0
  • 前言: 最近在面試找工作,整理一下遇到的面試題.大公司更傾向于基礎(chǔ),小公司更偏向于業(yè)務(wù)處理,但整體上遇到的面試問(wèn)題...
    早_wsm閱讀 538評(píng)論 0 2
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,688評(píng)論 19 139
  • 本學(xué)期的語(yǔ)文教學(xué)工作圓滿收官,回顧這段充實(shí)忙碌的歷程,我始終緊扣提升學(xué)生語(yǔ)文綜合素養(yǎng)這一核心目標(biāo),有條不紊...
    會(huì)讀書(shū)的乘乘閱讀 121評(píng)論 0 0

友情鏈接更多精彩內(nèi)容