我们一起搭建MockSever

2020/05/25 21:08
阅读数 217


哈喽,艾瑞巴蒂,之前我们已经学习过Mock的相关知识。相信有的同学已经自己使用过了,那么今天我们就来详细的说下该如何梳理自己的代码吧。 

代码结构

data :存放接口返回所需要的数据,mock_data.yaml文件配置接口和返回数据的对应关系,格式如下:


想要了解YAML文件格式的同学,请移步《YAML快速入门

mockSever:这里是主要的逻辑处理文件
  • mock.py:主要是读取YAML文件匹配接口,替换返回数据

import mitmproxy.http

import yaml


from src.utils.conf import DATA_PATH, JSON_PATH


class Mock:

def response(self, flow:mitmproxy.http.HTTPFlow):

# 读取url及替换的json文件路径

d = yaml.load(open(DATA_PATH, 'r', encoding='utf-8').read(), Loader=yaml.FullLoader)

yaml.warnings({'YAMLLoadWarning': False})


count = d['keyCount']


#读取替换json内容

for count in range(count, 0, -1):

print(count)

url = d['request' + str(count)]['url']

response_path = JSON_PATH + '\\' + d['request' + str(count)]['response']


# 读取替换json内容

f = open(response_path, encoding='utf-8')

replaced_data = f.read()


if url in flow.request.url:

flow.response = flow.response.make(200)

flow.response.set_text(replaced_data)

count += 1

else:

count += 1

return

  • mock_init.py:mitproxy的初始化函数,这个文件是整个工具的入口,使用这个文件进行MockServer的启动工作,代码如下:

import win32api

import win32con

import logging

import os


class mockInit:

def main(self):

self.open_monitoring()


def open_monitoring(self):

self.set_ie_proxy(1, "127.0.0.1:8080", "")

self.redirect_on()


def close_monitoring(self):

self.set_ie_proxy(0, "", "")


def redirect_on(self):

dir = os.path.dirname(os.getcwd()) + "\\utils"

opPath = os.getcwd()


os.chdir(dir)

os.system("mitmweb -s addons.py")

os.chdir(opPath)


def redirect_off(self):

dir = os.path.dirname(os.getcwd()) + "\\utils"

opPath = os.getcwd()


os.chdir(dir)

os.system("^C")

os.chdir(opPath)


def set_ie_proxy(self, enable, proxyIp, IgnoreIp):

"""

:param enable: 0-close proxy; 1-open proxy

:param proxyIp: proxy ip

:param IgnoreIp: ignored proxy ip

:return:

"""

KEY_PATH = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"

hKey = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, KEY_PATH, 0, win32con.KEY_ALL_ACCESS)


win32api.RegSetValueEx(hKey, "ProxyEnable", 0, win32con.REG_DWORD, enable)

win32api.RegSetValueEx(hKey, "ProxyServer", 0, win32con.REG_SZ, proxyIp)

win32api.RegSetValueEx(hKey, "ProxyOverride", 0, win32con.REG_SZ, IgnoreIp)


retVal = win32api.RegQueryValueEx(hKey, "ProxyEnable")

win32api.RegCloseKey(hKey)

if retVal[0] == enable:

print("切换IE代理成功")

logging.info("++++++++切换IE代理成功++++++++")

return True

else:

print("切换IE代理失败")

logging.error("++++++++切换IE代理失败++++++++")

return False


if __name__ == '__main__':

mockInit().main()

utils:存储调用关系和具体配置
  • addons.py:调用关系

from src.mockServer.mock import Mock


addons=[

Mock()

]

  • conf.py:路径配置文件

import os


DATA_PATH = os.path.dirname(os.getcwd())+ '\\data\\mock_data.yaml'

JSON_PATH = os.path.dirname(os.getcwd())+ '\\data\\json_files'

总结经验

遇到的问题(一)

由于小编所负责的搜狗商城使用的协议是HTTPS协议, 最初遇到的问题就是开启mitproxy工具后,浏览器访问https://mall.sogou.com地址后会直接报错,就像这样: 

解决方案(一)

小编也是费了九牛二虎之力找到了解决办法,在开启mitproxy工具后如果访问HTTPS协议需要安装一个它自带的证书“mitmproxy-ca-cert.p12”,就可以完美解决了。 
下载地址:https://pan.baidu.com/s/1cvKPzFWsNOuGa-xnlKdT6A 提取码:txay

欢迎添加我们的搜狗测试微信号,与我们一起聊聊测试



本文分享自微信公众号 - 搜狗测试(SogouQA)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部