(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')

好了,其他就没啥好说的了,因为公司有严格的保密政策,所以这个平台不会开源。

posted @ 2018-03-23 13:57  fengyca  阅读(2491)  评论(0编辑  收藏  举报