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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子虹脯,更是在濱河造成了極大的恐慌驴娃,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件循集,死亡現(xiàn)場(chǎng)離奇詭異唇敞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)暇榴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)厚棵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蔼紧,你說(shuō)我怎么就攤上這事『萸幔” “怎么了奸例?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)向楼。 經(jīng)常有香客問(wèn)我查吊,道長(zhǎng),這世上最難降的妖魔是什么湖蜕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任逻卖,我火速辦了婚禮,結(jié)果婚禮上昭抒,老公的妹妹穿的比我還像新娘评也。我一直安慰自己,他們只是感情好灭返,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布盗迟。 她就那樣靜靜地躺著,像睡著了一般熙含。 火紅的嫁衣襯著肌膚如雪罚缕。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天怎静,我揣著相機(jī)與錄音邮弹,去河邊找鬼。 笑死蚓聘,一個(gè)胖子當(dāng)著我的面吹牛腌乡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播或粮,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼导饲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起渣锦,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤硝岗,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后袋毙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體型檀,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年听盖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胀溺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡皆看,死狀恐怖仓坞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腰吟,我是刑警寧澤无埃,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站毛雇,受9級(jí)特大地震影響嫉称,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜灵疮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一织阅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧震捣,春花似錦荔棉、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至诉植,卻和暖如春祥国,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晾腔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工舌稀, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人灼擂。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓壁查,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親剔应。 傳聞我的和親對(duì)象是個(gè)殘疾皇子睡腿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

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