(2)静态mock平台设计及搭建思路
为什么做这个平台?
归结起来搭建这个平台是个事件驱动的结果,因为工作中需要与外部系统交互,这句话说来简单,其实是一件很痛苦的事情,沟通需要花费大量的时间,还不一定能顺利做好,那么我们有什么方法来模拟外部系统呢?思考多日并参考网上资料发现用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')
好了,其他就没啥好说的了,因为公司有严格的保密政策,所以这个平台不会开源。