关闭

我们一起搭建MockSever

发表于:2020-6-19 11:09

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Py    来源:搜狗测试

  之前我们已经学习过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”,就可以完美解决了。
  
      本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号