通用技术 [分享] 自己写的 mock 管理平台 simple_mock

r455678 · 发布于 2017年09月24日 · 最后由 r455678 回复于 2017年10月15日 · 2094 次阅读
本帖已被设为精华帖!

- 背景

1、由于最近需要做一些和第三方对接的功能测试,部分第三方的返回结果无法模拟或者模拟效率低,导致部分场景无法测试。
2、所在部门前后端分离,但web进度常年领先后端,而web开发自己又懒得写UT。导致最后经常在SIT缓解暴露问题,提供一个平台方便他们自己进行UT。
3、部分自动化测试需要依赖mock进行,传统的mock数据修改和管理又不是那么集中以及友好。

- 调研

google了一些工具,没找到什么太适合的,于是还是决定自己写个(重复造个轮子)吧。

- 整体思路

1、采用的是python+flask,根据请求的内容进行解析结果,然后在数据库中进行数据的校验和匹配,返回预期结果。
2、mock_server进行请求的接收和响应,mock_web提供和web端交互的接口。
3、目前功能:提供增删改查、复制、excel导入、禁用/启用等功能。

  • 下边直接上图和git地址


  • DEMO

  • 部分核心代码

def checkpath(domain,varsvalue,method):
    method=method.lower()
    varsvalue.sort()
    checksize(domain,method)#判断请求方法和模式是否匹配
    if len(varsvalue) == 0:
        conn = pymysql.connect(**config)
        cur = conn.cursor()
        cur.execute('select resparams from mock_config where status=0 and domain=%s and methods=%s', (domain, method))
        resparams = cur.fetchone()
        conn.close()
        if resparams[0] == '':
            return jsonify({"msg": "对应请求没有配置预期返回值"})
        else:
            return resparams[0].encode("utf-8")
    else:
        varsvalue1=getvar(varsvalue)#实际请求
        conn = pymysql.connect(**config)
        cur = conn.cursor()
        cur.execute('select reqparams,resparams,methods,ischeck from mock_config where status=0 and domain=%s and methods=%s',(domain, method))
        reqparams = cur.fetchall()
        if reqparams == ():
            return jsonify({"msg": u"请求方法和参数不匹配"})
        elif reqparams[0][3]==1:
            return reqparams[0][1]
        else:
            rdata=checkparams(reqparams,varsvalue1)
        return rdata

def checkparams(reqparams,varsvalue1):
    varsvalue2 = reqparams[0][0]  # 数据库中的预期请求参数
    if reqparams[0][2].lower()=='get' or (reqparams[0][2].lower()=='post' and varsvalue1[0] != '}' and varsvalue1[-2] != '}'):
        arr = varsvalue2.split('&')
        for i in range(len(arr)):
            arr[i] = arr[i] + '&'
        arr.sort(reverse=True)
        str = ''.join(arr)[0:-1]
        if str==varsvalue1:
            return reqparams[0][1].encode("utf-8")
        if reqparams[0][0] == '':
            return jsonify({"msg": u"对应请求没有配置预期返回值"})
        else:
            return jsonify({"msg": u"请求方法和参数不匹配"})
    elif reqparams[0][2].lower()=='post':
        varsvalue1 = varsvalue1.replace("\t", "").replace("\r", "").strip()[:-1]
        varsvalue2 = varsvalue2.replace("\t", "").replace("\r", "").strip()
        if varsvalue1 == varsvalue2:
            return reqparams[0][1].encode("utf-8")
    else:
        return jsonify({"msg": u"暂不支持该类型请求方法"})
  • git地址 现已开源

    https://github.com/r455678/simple_mock

  • 使用须知:

    1、使用前需安装依赖库。
    2、20170824.xlsx为导入模板。
    3、数据库信息配置在db.config文件。
    4、mock_config.sql为数据库建表语句。
    5、web端配置地址在mock/js/config.js文件中。

  • PS:

    1、如果使用过程中存在问题或者bug建议提issue,最近996了可能无法第一时间回复。
    2、其实写好了有一段时间了,like通配符那有个sql注入的漏洞一直没时间修复。
    3、还是希望能帮助到有需要的同学们,如果有更好的idea也欢迎提出来。
    4、另虽然mock的话更加注重的是mock本身的思想已经运用场景,但是有个贴合实际场景的平台的话还是会事半功倍的。

- 又到一年入学季,同时也为自己远走他乡第十个年头Mark一下,不忘初心方得始终!

共收到 16 条回复
10666

mock在特殊场景测试还是蛮好用的。
但是个人觉得 如果用到UI自动化,如果接口变动,维护接口参数、response,感觉挺麻烦的

10945
r455678 · #2 · 2017年09月25日 作者
10666harmo 回复

设计了两种模式:
A、不校验请求参数,可以只维护response的content。
B、填写多条,每次通过禁用启用的方式管理。

110

这个点赞,思路和我的一致……

7145

服务启动后,提示:网址为 http://0.0.0.0:5201/ 的网页可能暂时无法连接,或者它已永久性地移动到了新网址。

104 seveniruby 将本帖设为了精华贴 09月25日 19:54
605

挺不错的,想问下有考虑支持 callback 类型的 mock 不?不少第三方是通过 callback 的方式返回数据的。

10945
r455678 · #7 · 2017年09月26日 作者
7145yzwy 回复

是这样的,管理页面没和项目做集成,要单独部署在web容器里。主页是index.html

10945
r455678 · #8 · 2017年09月26日 作者
605chenhengjie123 回复

暂时没有,看10月份再说。。。。。

9楼 已删除
7145
10945r455678 回复

能否具体说下方法(操作步骤)呢?谢谢

10945
r455678 · #11 · 2017年09月27日 作者
7145yzwy 回复

1、执行sql脚本建表
2、修改db.config数据库配置文件
3、安装需要的第三方依赖库,运行mock_server.py。
4、运行mock_web.py。
5、把web项目拷贝到web容器中正常访问,修改mock/js/config.js接口访问地址为mock_web的地址和端口。
6、打开index页,添加/导入自己需要的mock数据。

7145
10945r455678 回复

感谢~😀

1203
10945r455678 回复

1、执行sql脚本建表

2、修改db.config数据库配置文件

3、安装需要的第三方依赖库,运行mock_server.py。
4、运行mock_web.py。

5、把web项目拷贝到web容器中正常访问,修改mock/js/config.js接口访问地址为mock_web的地址和端口。
这句话不了解,web容器是指的什么?能否具体说明

6、打开index页,添加/导入自己需要的mock数据。

10945
r455678 · #14 · 2017年10月11日 作者
1203hello2014 回复

5、比如nginx tomcat IIS 等

15269

@r455678 首先你初始化sql里面,那个insert 语句有问题了,增加的values值少了一个status的值,我看下你源码没发现是干嘛用的,但你在帖子里面checkpath方法缺有一个status=0,所以给你默认设置了一个0;

INSERT INTO mock_config.mock_config VALUES ('1', '请求登陆11', 'var1=1&var2=2&var3=3', 'post', '/login/manageLogin2',  'var1=1&var2=2&var3=3', '{\"status\":\"fail\",\"msg\":\"111用户名或密码错误,密码输错超过5次将被锁定哦!已输错1次\",\"data\":\"\",\"externData\":null}',  '2017-08-10 17:54:05','0', '0', '营销平台');

15269

@r455678
你mock_server.py的def _getexcelparas这个方法的名称单词写错了吧?

晚上花了点时间看了下楼主的源码,有些问题以及一些idea方便的话跟你交流下,我可以协助你提交掉代码以及一些代码的bug修复
WeChat:357166781
PS:你现在github上的代码是最新的么?

10945
r455678 · #17 · 2017年10月15日 作者
15269ajbone 回复

是最新的,已加你的WeChat

10945
r455678 · #18 · 2017年10月15日 作者
15269ajbone 回复

status是作为是否启用的状态,sql里不是status没value,是ischeck字段改了代码没改sql脚本。
PS:既然已经开源,欢迎改代码,不用和我说。

19楼 已删除
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册