上次我們完善了登入註冊相關頁面,還有後端介面,算是從0到1完成了乙個功能的編碼工作。可能前端部分會講的比較粗糙,因為第一可能是筆者造詣不夠,第二也跟我們直接從現有的框架進行改造有關,很多東西不是從0
寫到1
,而是從1
到1.1
,但是後面不一樣:
後面的頁面都是咱們自己寫,自己用,從0寫到1
終端輸入pip3 install requests
並執行。
要知道,咱們這是乙個介面測試平台(後續可能會整合ui自動化,但是這個筆者也還沒有想好)。乙個介面自動化平台,最核心的當然是對api的請求操作,所以咱們刻不容緩,加快進度,趁熱打鐵,來點乾貨吧。用requests
來協助我們完成介面自動化請求。
我們新建乙個檔案:middleware/httpclient.py
import datetime
import requests
class request(object):
def __init__(self, url, session=false, **kwargs):
self.url = url
self.session = session
self.kwargs = kwargs
if self.session:
self.client = requests.session()
return
self.client = requests
def get(self):
return self.request("get")
@staticmethod
def get_elapsed(timer: datetime.timedelta):
if timer.seconds > 0:
return f".s"
return f"ms"
def request(self, method: str):
status_code = 0
elapsed = "-1ms"
try:
if method.upper() == "get":
response = self.client.get(self.url, **self.kwargs)
elif method.upper() == 'post':
response = self.client.post(self.url, **self.kwargs)
else:
response = self.client.request(method, self.url, **self.kwargs)
status_code = response.status_code
if status_code != 200:
return request.response(false, status_code)
elapsed = request.get_elapsed(response.elapsed)
data = response.json()
return request.response(true, 200, data, response.headers, response.request.headers, elapsed=elapsed)
except exception as e:
return request.response(false, status_code, msg=str(e), elapsed=elapsed)
def post(self):
return self.request("post")
@staticmethod
def response(status, status_code=200, response=none, response_header=none,
request_header=none, elapsed=none, msg="success"):
request_header =
response_header =
return
如果我是產品經理的話,那麼postman就是我的原型圖:
講解一下各個方法,首先這是乙個request
請求類,他擁有核心方法:request
,目前咱們暫時先只做到支援json類的請求,後續補全form
,file
等型別的請求。
其實這個類做的事情很簡單,就是把requests相關的方法剝離了出來,封裝了一層。
其中建構函式提供了一些選項,包括請求的資訊,url,是否以session的方式請求等等,kwargs涵蓋了requests原生的引數,只要你想傳,你都可以傳進來。
get_elapsed
是根據postman為參照,對請求時間做的乙個處理,如果大於1s的請求響應時間,那我們以秒
為單位顯示,否則以毫秒
為單位顯示。
response
是構造返回結構物件,對本次請求的資料進行整理。
request
就封裝了requests庫的核心操作,基本上屬於原生處理,並且判斷了http狀態碼。
新建controllers/request/http.py
return jsonify(dict(code=101, msg="請求方式不能為空"))
url = data.get("url")
if not url:
return jsonify(dict(code=101, msg="請求位址不能為空"))
body = data.get("body")
headers = data.get("headers")
r = request(url, data=body, headers=headers)
response = r.request(method)
return jsonify(dict(code=0, data=response, msg="操作成功"))
其實和登入/註冊介面都很相似,基本上就是創立了乙個blueprint,字首是/request,後續就是引入剛才的request類,進行http請求,最後返回response。
我們新建了乙個藍圖,需要去run.py進行註冊:
本節內容就到這裡了,下一節咱們編寫屬於自己的第乙個元件:postman
。又是前端內容了,咱們做乙個接近postman的頁面即可,不需要多高大上,做東西要抓住使用者的使用習慣。畢竟咱們不是
測試平台系列 11 封裝Request類
上次我們完善了登入註冊相關頁面,還有後端介面,算是從0到1完成了乙個功能的編碼工作。可能前端部分會講的比較粗糙,因為第一可能是筆者造詣不夠,第二也跟我們直接從現有的框架進行改造有關,很多東西不是從0寫到1,而是從1到1.1,但是後面不一樣 後面的頁面都是咱們自己寫,自己用,從0寫到1 終端輸入pip...
物件導向系列二(封裝)
僅僅須要最簡單的操作就能實現一系列複雜的功能。是做乙個個技術攻克的目的。一台精密儀器,一架家用電器,乙個小公尺手機,這些可能我們都在用,或者用過。它們的內部都無比的複雜。使用了各種各樣的配件,運用了極多的原理和知識。我們在使用的時候都具有同樣的感受 簡單 方便 太好了!面對原本複雜的東西,我們卻能通...
小酌重構系列 24 封裝集合
當方法返回型別或屬性型別為集合時,有些開發者會千篇一律地使用ilist集合。然而ilist具有集合的所有操作,這意味著呼叫者不僅可以讀取集合資訊,還能夠修改集合。業務需求本來只是為呼叫者提供乙個可讀的集合,例如資料的查詢和展示,但當方法返回ilist時,無疑隱式地開放了集合可寫的許可權。此時,我們無...