~_~ 不会画太粗糙了
1.clone
github:git clone https://github.com/git-gsxl/FastTester.git
gitee:git clone https://gitee.com/qq772262624/FastTester.git
2.pip install:pip install -r requirements.txt -i https://pypi.douban.com/simple
3、demo运行测试:
cd tests
pytest
# Windows 可直接运行:`startCollect.cmd`
1、将项目下utils/httpCat/fiddler.txt
复制文本粘贴,FiddlerScript
1、将项目下utils/httpCat/config.ini
过滤域名改为自己需要配置的域名以及业务领域
2、需要配置代理证书等,详看
3、运行文件:startCollect.cmd
如出现报错请检查 pip install -r requirements.txt 是否已安装?
或 pip install mitmproxy==5.0.0
1、你会得到:xxx.txt 文件
2、如需要用例入库,则执行命令行:
cd test
pytest --red_txt=true
另外可能需要进行数据库连接配置model/dbBase.py
,默认为sqlite
命令行参数说明(部分可在pytest.ini下默认配置),与pytest框架一致,并且新增以下参数:
cd tests
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
cd tests
pytest test_playback.py --env=domain,env --param={\"version\":\"1\"}
ps:Windows可以默认ini参数直接一键运行并生成报告:testStart.cmd
(支持替换变量,存储变量,引用变量,响应断言)
参数提取器,默认是取第1个值(支持提取response与headers接口的返参)
Jsonpath语法请参考:https://goessner.net/articles/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]}
1)获取正则表达式的值并命名为env:[{'re':['env','http://(.+?)/']}] ----> {'env':'value'}
2)获取正则表达式的值并命名为env及取第n个值:[{'re':['env','http://(.+?)/', -1]}] ----> {'name':'value'}
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'))
1.直接写正则表达式即可,如:[{'re':'http://(.+?)/'}]
使用本系统且遵循Faker语法直接引用:${Faker语法}
ppl_开头,为自定义生成数据方法
Faker 更多请查阅官方文档:https://faker.readthedocs.io/en/stable/locales/zh_CN.html#faker-providers-address
1)手机号:${phone_number}
18520149907
2)身份证号码:${ssn}
410622198603154708
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
1)姓名:${name}
王凯
2)姓名(女):${name_female}
戴丽丽
3)姓名(男):${name_male}
刘荣
4)姓:${last_name}
宋
5)名字:${first_name}
强
2)省:${province}
河北省
3)市:${city}
长春县
4)地区:${district}
白云
默认使用sqlite
,一般只需要连接sqlite
更改1、账号环境配置
信息即可
1) gray:默认就好,一般会使用如:AB测试模型使用,定制化区分环境
2) Tester:登录获取token或cookie初始化,可配置多个登录信息,如下有两种例子:
collects:表示后置处理器 collect (使用详细查看第三点),用例提取token或cookie作为登录态
{
"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"]
}
}
]
}
1) filter_path:过滤path为列表的,如登录/退出登录接口
2) filter_code:根据返回retCode字段,判断是否=0或='0',是则数据符合,否则跳过该数据
3) re_list:一般不需要使用,如AB测试模型时,则根据业务情况配置从response(uri/body/header)中正则匹配
4) db_pop:获取用例过滤:数据库字段转dict,去除非必要的字段,默认就好
5) filter_headers:过滤不必要的headers,默认就好
6) split_url_handle:path不需要特殊处理可默认,一般php接口可能需要处理,如下
例子:"split_url_handle":{".php":"path + '?r=' + query.pop('r')"}
表示:如果'.php'在path中,则运行path=eval("path+'?r='+query.pop('r')"
{
"filter_path":[
"/user/logout",
"/user/login"
],
"filter_code":{"retCode":[ 0, "0" ]},
"re_list":[],
"db_pop":[
"id","curl","response",
"_sa_instance_state",
"create_time","update_time"
],
"filter_headers":[
"content-length","accept-encoding","host","user-agent","accept",
"origin","referer","sec-ch-ua","connection","sec-fetch-dest",
"sec-fetch-mode","sec-fetch-site","pragma","accept-language",
"sec-ch-ua-mobile","sec-ch-ua-platform","postman-token",
"cache-control","x-requested-with","accept-encoding"
],
"split_url_handle":{}
}
因篇幅问题不能全部显示,请点此查看更多更全内容