為什么做這個平台?
歸結起來搭建這個平台是個事件驅動的結果,因為工作中需要與外部系統交互,這句話說來簡單,其實是一件很痛苦的事情,溝通需要花費大量的時間,還不一定能順利做好,那么我們有什么方法來模擬外部系統呢?思考多日並參考網上資料發現用mock思想可以順利的做好這件事兒。
平台設計思路
舉個簡單的例子,市面上有眾多的優秀的開源的mock框架可以使用,但是以MockServer框架舉例,這玩意兒需要寫代碼,寫判斷,寫邏輯,這些對於沒有代碼基礎的測試工程師來說簡直就是一個噩夢,那么我們能不能設計一個操作簡單的無需寫代碼的mock平台來陽光普照呢,我想試試…那么我們就必須要知道mockServer的實現原理,經過查資料呢,簡單的來說如下如:
我們只需要把server端的api地址修改到我們Mock平台的地址並定制響應內容即可。
思路有了,那么我們該如何設計平台呢,我首先考慮到了WEB化,標准化輸入,API數據存儲,用URL分發的方式來做一個實現熱加載的Mock平台。
思路有了,技術選型吧,這個純屬裝逼了…我只會Python啊,那么就來Django吧,與我的測試平台融合。
細節方面
Web配置接口設計流程如下圖:
不太會畫圖,隨便畫的…
Django處理請求流程圖如下圖:
大致是這么個結構。
下面上代碼吧,第一點URL過濾,我才用了正則表達式的方式,這種方式不好,因為是個web平台,所以暫時沒想到辦法區分request的URL到低是請求頁面的還是請求配置的接口,這是個明顯的缺陷,我曉得但是我目前沒想到解決方案。
下面是index函數:
1 @csrf_exempt 2 def index(request): 3 # 處理URL 4 url = request.get_full_path() 5 keys = url.split(conf['mysql']['HOST'])[-1][1:] 6 # 去除找不到API的異常 7 try: 8 obj = Api.objects.get(ApiName=keys) 9 except: 10 content = '沒有找到API【%s】請檢查一下!!' % (keys) 11 return HttpResponse(content=content) 12 method = obj.ErrorStatus 13 if method == 'GET': 14 ResponseType = obj.CorrectStatus 15 elif method == 'POST': 16 # 獲取當前API的參數,並以優先級為序list排列 17 listKey = execDict.getKeylist(obj.CorrectHeader) 18 data = request.body 19 # 獲取請求的參數和value 用以確定響應 20 key = '' 21 value = '' 22 for i in listKey: 23 for k, v in eval(data).items(): 24 if k == i: 25 key = k 26 value = v 27 # 判斷是否獲取了相關值 28 if key and value: # 正常獲取 29 msg = execDict.getTypeResponse(obj.RequesJson, key, value) 30 if msg: 31 ResponseType = msg[0] 32 content = msg[-1] 33 else: 34 content = '沒有找到key:【%s】對應值【%s】的擋板信息!!' % (key, value) 35 return HttpResponse(content=content) 36 else: # 異常獲取 返回異常 37 content = '沒有找到key:【%s】對應值【%s】的擋板信息!!' % (key, value) 38 return HttpResponse(content=content) 39 40 if method == 'GET': 41 if obj != '': 42 content = obj.CorrectResponse 43 if ResponseType == 'json': 44 return HttpResponse(content=content, content_type="application/json") 45 elif ResponseType == 'xml': 46 return HttpResponse(content=content, content_type="text/xml") 47 else: 48 content = '沒有找到API【%s】請檢查一下!!' % (keys) 49 return HttpResponse(content=content) 50 else: 51 return HttpResponse(content='沒有找到API【%s】請檢查一下!!' % (keys), status='200') 52 elif method == 'POST': 53 if obj != '': 54 if ResponseType == 'json': 55 return HttpResponse(content=content, content_type="application/json") 56 elif ResponseType == 'xml': 57 return HttpResponse(content=content, content_type="text/xml") 58 else: 59 content = '沒有找到API【%s】請檢查一下!!' % (keys) 60 return HttpResponse(content=content) 61 else: 62 return HttpResponse(content='沒有找到API【%s】請檢查一下!!' % (keys), status='200') 63 64 else: 65 return HttpResponse(content='暫不支持【%s】的請求方式!!' % (method), status='200')
好了,其他就沒啥好說的了,因為公司有嚴格的保密政策,所以這個平台不會開源。