/Apimock

Api接口 mock server返回,常用于app api容错测试

Primary LanguagePython

Apimock

Api接口 mock server返回,用于app api容错测试

#原理:

该mock指 mock,api服务器端返回的response

app通过代理wifi访问pc,pc开fiddler(或anyproxy)抓包,经二次开发fiddler(anyproxy),将指定数据包劫持发给 mockserver ,mockserver会根据其内部定义的规则篡改数据包并返回给fiddler(anyproxy),完成一次mock

启动mockserver后

轮询mock---会根据黑白名单 依次对api 的各json字段做fuzz mock,之后当再次劫持该api时执行一种fuzz

fuzz规则: A.json字段的fuzz 'fun:del','fun:more','fun:blank','fun:none','fun:null','fun:0','fun:-1','fun:0.00002','fun:2.00001','fun:maxint','fun:maxlong','fun:*n','fun:/n','fun:ext','fun:cut','fun:overlen','fun:illega'

B.body相关的fuzz 'body={}','body=abc{}','code=404','code=502','code=302','net=delay'

另外可通过proxy.py来注入篡改规则 ,完成注入后 app再次访问api来进行Mock测试

conf.yml配置文件: pairwisetest : False 是否使用正交算法 combination : False 是否使用用例组合算法 specialapi : 特殊api,将使用对应项和值作api区分

  • "/index.php?method"
    #- "/index.php?method,__version,__channel" whitelist: 白名单 -"/index.php?method=clientconf.firstscreen&__version=3.0.6.3203&__plat=android&__channel=guanwang" #- "/index.php?method=clientconf.firstscreen" #- "/index.php?"

blacklist: 黑名单 #-"index.php?method=clientconf.firstscreen&__version=3.0.6.3203&__plat=android&__channel=guanwang" getobjfromnet : False 用例mock集合是否从web上获取及存储 batch: 4 用例模式每次执行多少条case (单独的mockserver未使用该项)

Obj.yml 配置文件: 抓取白名单中api 并将需要执行的mock测试case记录到该文件中,可自定义配置设置哪些需要执行(删除或#)

Tested.yml 配置文件: 将已经测试过的case记录到该文件,可断点续测后续case

运行时log: current testing Api : /ajax_get_myinfo?option,roomid,_ (当前正在测试的api)

current testing mock Queue : (当前mock规则队列,显示当前mock规则及+4) num = 9 ['errno=fun:del', 'errno=fun:more', 'errno=fun:blank', 'errmsg=fun:del', 'errmsg=fun:more']

current testing mock key : (当前mock规则) errno=fun:del

current server state : (当前mock server内部状态机) ishang|type|api|key|value|time|body|code|delay False key ['/ajax_get_myinfo'] ['errno'] {'errno': 'fun:del'} 0 {} 200

#运行:

1.将fiddlerjs/fiddler.js 内容复制替换到 fiddler->Rules->Customize Rules中

(或anyproxy -i --rule anyproxyjs.js --intercept   启动anyproxy 定制使用anyproxyjs.js 启用https劫持)

并修改filterUrl="panda.tv" 来劫持指定域名的数据包 (anyproxy 修改anyproxyjs.js中host)

2.启动mockserver.py(按规则轮询mock 或 动态注入mock)

3.动态运行 python proxy.py xxx 来注入规则

-p 1 hang住server内部状态 -p 0 解除hang

-a xxx 劫持修改具体某个api 或不定义则修改任意api

-r 1 清空已经定义的规则

-s 5 server暂停5s再返回,模拟服务器hang

-d 2g 模拟2g网络

-d 100 延迟100毫秒,模拟网络延迟

-c 404 返回404

-b xx 篡改整个body,可以是非json

-k data.uid=1 修改路径为data.uid的键值为1

-k re:name=zhao 修改正则表达式为name的键值为zhao

        =fun:xxx  xxx是内部快捷函数
        
        内部函数如下:
        
        fun:del 删除该键
        
        fun:more 兄弟节点下添加多余的其他键
        
        fun:blank 键值为''  ,fun:none,fun:null,fun:0,fun:-1,fun:0.00002,fun:2.00001,fun:maxint,fun:maxlong
        
        fun:*n 数字n倍  ,fun:/n 除n
        
        fun:ext 字符串延长  ,fun:cut 缩短
        
        fun:overlen 超长
        
        fun:illega 非法字符

(anyproxy 暂不支持-c -d -s)

例子:

Python proxy.py -p 1 Python proxy.py -p 0

python proxy.py -a /api/user/get -k errno=1   

python proxy.py -a /api/user/get -k re:name="H1 \u266a@\u5c0f\u8776\u6c42\u5b88\u62a4"

python proxy.py -r 1

python proxy.py -s 5

python proxy.py -d 150

python proxy.py -d 2g

python proxy.py -b {}

python proxy.py -a /api/user/get -k re:name=fun:del

python proxy.py -a /api/user/get -k data.uid=fun:maxint