PPL-Tester

简介

http工具集,通过代理获取到API的请求与响应信息,将这些请求信息进行流量回放/锲约测试或快速生成用例, 亦可通过人工进行修改参数化提取、变量引用、断言等形成API自动化测试用例等! 你以为只是流量回放吗?错~走去瞧瞧v2版本!

看官~请记得给个star呗? 项目地址:

github gitee

功能介绍

流程图 (简陋ing···)

ps: 1、作者 Windows exe 运行,其它系统可自行打包或以 Python ppl x 执行. 2、运行程序需要在项目根目录下运行…

需要安装Python3环境及依赖库:

pip install -r requirements.txt

1、proxy http

command: ppl.exe f (python ppl.py f)

2023-01-20 10:39:53.628 | INFO | __main__:cmd:37 - run:http flows cat. exit:Ctrl+C

2023-01-20 10:39:53.642 | INFO | utils.flows:cat_mock_load:25 - loaded mock*.json match to will mock!

2023-01-20 10:39:53.644 | INFO | utils.flows:__init__:114 - Proxy server listening at http://0.0.0.0:8888

基本代理等使用请参阅博文:点击跳转

官方文档:https://docs.mitmproxy.org/stable

中文文档:https://ptorch.com/docs/10/mitmproxy_introduction

2、mock http response

可对 response 进行mock!

2.1 配置 config.ini

mock = ON

mock ON :开启mock

mock OFF:关闭mock

mode = ON

mode ON :向远程服务器发送任何数据,且根据mock数据交集返回数据从而响应

mode OFF:不向远程服务器发送任何数据

2.2 mock文件格式:mock*.json

2.3 随机参数引用格式:${faker}

结合 faker 的方法进行随机模式,文档请参考:https://faker.readthedocs.io/en/master/providers/faker.providers.python.html

mock demo:

{

"api/user/info": {

"bool": "${pybool}",

"name": "${name}",

"int": "${pyint}",

"float": "${pyfloat(0,1)}",

"data|1-3": [

{

"name": "${name}"

}

]

}

}

mock demo 输出

3、http flows replace

request 正则替换支持替换(headers url body cookie)

replace = {"pattern":"value","pattern1":"value1"}

使用场景:

1.鉴权:将 token 设置为空,如:

replace = {"old token xxx":""}

2.越权:将 token 设置为另用户token,越权又分为①水平越权(同角色)②垂直越权(向上级),如:

replace = {"old token xxx":"new token xxx"}

3.流量转发, 将test环境的前端去访问正式环境的数据(前端问题复现)

{"old host":"new host"}

PS:因前端本就发出 old host 请求,所以前端看到请求还是 old host 但真实是请求到 new host.

4、https证书过期检测

config.ini -> check_ssl hosts

check_ssl = app.xxx.com,web.xxx.com

command:

ppl.exe s

5、api playback

5.1 接口用例集合获取

方式1:Fiddler

1、将项目下desc/fiddler.txt复制文本粘贴,FiddlerScript

2、更改为符合自己业务领域配置,是项目绝对路径app目录,注意要用两个扛\\

方式2(推荐):mitmproxy

1、将项目下config.ini过滤域名改为自己需要配置的域名以及业务领域,如果填写db_url则流量信息直接入库 2、需要配置代理证书等,详看mitmproxy使用文档

3、运行

command:

ppl.exe f

以上方式1及方式2 会得到txt文件 或直接入库

如果基于方式2(mitmproxy),配置db_url可直接流量入库回放测试. 1、你会得到:./data/api-xxx.txt 或 fiddler-xxx.txt

2、如需要用例入库,则执行命令行:

ppl.exe --play=0

另外可能需要进行数据库连接配置./config.ini.db_url,默认为sqlite

mysql:db_url = mysql+pymysql://root:123456@127.0.0.1:3306/tester?charset=utf8

数据迁移:ppl.exe --move=new_db_url

5.2 执行测试

命令行参数说明(部分可在pytest.ini下默认配置),与pytest框架一致,并且新增以下参数:

–env:查询业务领域=ppl及环境=test的用例 如:--env=ppl,test

–param:附加将version参数替换为1或追加 如(Windows):--param={\"version\":\"1\"}

–file:读取app目录下所有txt文件进行流量回放,详细使用看流量回放 如:--file=1

–play:读取txt文件进行用例入库 如:–play=0 0:读取txt用例入库

1:读取db用例进行回放测试

2:读取txt文件流量回放

3: 读取阿里云日志流量并入库

–init:db表结构初始化,一般不需要用到 如:–init=1

方式1:txt文件流量回放

ps:不支持下载/上传文件回放,不要将txt文件换行或格式变化哦(只回放API响应码为200)

1)方式1:默认为app目录下全部txt文件(以下2-3不存在文件时亦是):pytest --file=1

2)方式2:指定app目录下的文件:pytest --file=fiddler_2022-7-31.txt

3)方式3:绝对路径指定文件(注意win下需要\\):pytest --file=E:\\fiddler_2022-7-31.txt

4)方式4:相对路径指定文件:pytest --file=./fiddler_2022-7-31.txt

方式2:经过用例入库,执行db用例测试

需要先配置 pytest.ini(推荐) 或 config db在进行运行.

详情查看 5.6 db或pytest config说明.

配置pytest.ini,作用与db用例映射执行对应环境测试.

ppl.exe --env=domain,env --param={\"version\":\"1\"}

ps:Windows可以生成allure报告:ppl.exe r (支持替换变量,存储变量,引用变量,响应断言)

5.3 后置处理器介绍:http_collect

参数提取器,默认是取第1个值(支持提取response与headers接口的返参) Jsonpath语法请参考:https://goessner.net/articles/JsonPath

1.Jsonpath 区分大小写

1)获取key的值:['key'] ----> {'key':'value'}

2)获取key的值并重新命名:[{'key':'name'}] ----> {'name':'value'}

3)获取key的值并指定取第n个:['key':n] ----> {'key':values[n]}

4)获取key的值并重新命名及指定取第n个:['key':['name',n]] ----> {'name':values[n]}

5)原生Jsonpath语法:['$.data.key'] ----> {'key':'value'}

6)原生Jsonpath语法并重新命名:[{'$.data.key':'name'}] ----> {'name':'value'}

7)原生Jsonpath语法并指定取第n个:[{'$.data.key':n}] ----> {'key':values[n]}

8)原生Jsonpath语法并重新命名及指定取第n个:[{'$.data.key':['name',n]}] ----> {'name':values[n]}

2.正则表达式

1)获取正则表达式的值并命名为env:[{'re':['env','http://(.+?)/']}] ----> {'env':'value'}

2)获取正则表达式的值并命名为env及取第n个值:[{'re':['env','http://(.+?)/', -1]}] ----> {'name':'value'}

5.4 断言使用介绍:http_assert

1.Jsonpath 断言

1.字符在里面:[“msgId”]

`实际为:assert "msgId" in response.text`

2.变量在里面:[“${msgId}”]

`实际为:assert "${msgId}" in response.text`

2.字符相等:[{“msgId”:“123456”}]

`实际为:assert 123456 == json_path(result.json(), 'msgId')`

3.字符在里面or其它:[{“msgId”:[“123456”,“in”]}] 注:in 可以是== != not in

`assert 123456 in response.get('msgId')`

4.长度:1 == len(response.get(‘msgId’)):[{“msgId”:[1,“len”]}]

`assert 1 == len(response.get('msgId'))`

2.正则表达式断言

1.直接写正则表达式即可,如:[{'re':'http://(.+?)/'}]

5.5 变量引用(参数化关联)

使用本系统且遵循Faker语法直接引用:${Faker语法}

ppl_开头,为自定义生成数据方法

Faker 更多请查阅官方文档:https://faker.readthedocs.io/en/stable/locales/zh_CN.html#faker-providers-address 字段数据结构及解释,亦可查阅代码model:

1.号码相关:

1)手机号:${phone_number} 18520149907

2)身份证号码:${ssn} 410622198603154708

2.时间日期相关

1)当前日期时间:${ppl_now_datetime} 2022-07-02 12:56:58

2)当前时间戳:${ppl_time} 1656737818

3)当前日期:${ppl_now_date} 2022-07-02

4)当前时间:${ppl_now_time} 12:56:58

5)过去7天的日期时间:${ppl_datetime(-7)} 2022-06-25 00:00:00

6)未来7天的日期时间:${ppl_datetime(7)} 2022-07-09 23:59:59

7)随机年-月-日:${date} 1996-03-20

8)随机(时:分:秒):${time} 04:52:23

9)未来的日期时间:${future_datetime(end_date=+7d)} 2022-07-07 16:01:23

10)过去的日期时间:${past_datetime(end_date=-7d)} 2022-06-29 13:29:20

3.名字相关:

1)姓名:${name} 王凯

2)姓名(女):${name_female} 戴丽丽

3)姓名(男):${name_male} 刘荣

4)姓:${last_name} 宋

5)名字:${first_name} 强

4.地址相关

1)地址:${address} 香港特别行政区大冶县上街钟街k座 664713

2)省:${province} 河北省

3)市:${city} 长春县

4)地区:${district} 白云

5)街道地址:${street_address} 武汉街D座

5.6 db或pytest config说明

使用pytest.ini.tester配置 或 db config表配置,配置一种即可。 推荐使用pytest.ini

账号环境配置

1、pytest.ini 例子(需要压缩json,不可格式化)

[test]

tester = {"gray":"gray","Tester":[{"https://blog.csdn.net":{"url":"/qq_42675140","body":{},"method":"GET","collects":["ppl_cookie"]}},{"http://open-ppl-getaway.com":{"Authorization":"Bearer ","key":"nf9vMghQLyEZkeyxxxxx0ln9klsPz","secretx":"ylJhZzwvaa2NxxxsecretlDtNsJSyMh"}}],"filter_code":{},"filter_path":["/user/logout","/user/login"]}

[test]:表示定义的环境 test,可以多个.

tester:pytest 账号登录/过滤等配置

1) gray:默认gray就好,一般用于AB测试模型则需要配置.

2) Tester:登录获取token或cookie初始化,可配置多个登录信息

collects:表示后置处理器 collect (使用详细查看第三点[后置处理器使用]),用例提取token或cookie作为登录态

3) filter_code:过滤某些接口响应内容,可不写

4) filter_path:过滤某些接口url,一般用于过滤登录及退出登录以免执行测试时影响登录态

2、db config如下例子, 直接复制粘贴保存即可(可格式化):

{

"gray":"gray",

"Tester":[

{

"https://app-xxx.com":{

"url":"/api/user/login",

"json":{

"mobile":18888888888,

"Password":"mVs6NwvIFRgN0aaUo4KZOiW9QZWbKZjqVX1eW9Gr2s4rgZ5atS3ppY39ZlyE37Tb2/zo6YWJV6VJV="

},

"method":"POST",

"collects":[

"clienttoken"

]

}

},

{

"https://web-xxx.com":{

"url":"/api/index.php?r=data/login",

"data":"user=admin&password=4076f862096d1536b6cac6866e386655=",

"method":"POST",

"headers":{

"content-Type":"application/x-www-form-urlencoded"

},

"collects":[

"ppl_cookie"

]

}

}

],

"filter_code":{

"$response_key":[

200,

"200"

]

},

"filter_path":[

"/api/user/logout",

"/api/user/login"

]

}

5.7 mysql等断言

待开发

6、web页面管理用例等

待开发

7、flows客户端,集成以上功能…

待开发

如有建议/疑问请联系我:https://blog.csdn.net/qq_42675140

好文推荐

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: