flask_http_methods_demo 是一个简单的Flask项目,在本地创建一些http接口,方便用于测试本框架。执行命令 python app.py
即可在本地启动一个http服务器,默认监听5000端口。
record_HTTP_API_via_mitmproxy 启动mitmproxy
监听一个端口,可抓取产品使用中的http api接口数据并存到csv文件中,例如 apirecord_demo.csv
generate_newcase_from_apirecord_csv 处理mitmproxy
抓取的api数据文件,生成新api的测试数据"*_cases.csv",例如 apirecode_demo_cases.csv
app_apibase.py:核心类,包括登录、发送 http 请求(get、post...)以及以 json 格式返回数据
注:登录接口请求后,通常需要往headers
增加字段,请根据实际情况完善login_session
函数结尾已注释部分。
jsonschema_handle.py 主要功能有两个:
通过pytest
框架管理测试用例,建议按功能模块分区。已覆盖功能范围:
feature A Demo API
feature B Demo API
base_config.py:读取 'config.yaml' 文件以获取 base_url、email和password,...
config.yaml: 填写测试环境,base_url, 账号、密码,要执行的case优先级等信息。
对于 case_pytest_lst
里每项实际是pytest的参数,如-n
表示pytest-xdist多进程。
保存脚本生成的日志
http接口请求数据记录(csv格式)
保存 Allure 生成的测试报告
pip install -r requirement.txt
安装依赖包config_sample.yaml
生成config.yaml
文件,并进行配置。python app.py
命令在本地启动一个http测试服务端,否则请忽略。python3 run_api_cases.py
,完成后默认会自动打开测试报告网页。
另外,我们可以在第一个参数中指定运行环境,例如 python3 run_api_cases.py prod
报告会展示每个case的请求和返回数据,如果失败会注明原因,如下图所示:
Q: 各功能模块的测试用例 .csv
文件和jsonschema
文件是如何得到的?
方法有两种:
jsonschema
文件也要手动写这种验证选项。mitmproxy
抓取产品使用过程中的数据,再用脚本自动生成新接口的测试用例 .csv
文件和 jsonschema
文件。Q: 如何用mitmproxy
自动抓取产品使用中的http api接口数据?
启动 record_http_apis.py 监听一个端口,设置产品通过该代理访问,这样脚本可将产品使用过程中的http api请求数据自动记录到csv
文件中,内容可参考示例文件 api reocde demo ,具体用法详情可参考 这里
Q: 如何根据跟mitmproxy
自动记录的数据,生成新的测试用例csv
文件和jsonschema
文件?
将mitmproxy
抓取得到的csv文件,放到 generate_newcase_from_apirecord_csv 下, 运行 python generate_newcases_from_api_record.py
,可得到新api的用例数据文件 *_cases.csv
, 每行数据即是一个接口用例,其包括request url,method,params,payload,status code等,以及用于校验返回数据的jsonschema
文件(验证返回json数据的结构和数据内容,如字段是否缺失,字段类型是否正确、字段值是否符合预期等),这些新api的jsonschema文件在 new_jsonschema_files_dir
下,根据实际将其完善后放到 cases/jsonfiles
下。
Q: 某些接口的响应状态码可能有多个,如200
和502
都符合预期,该如何处理?
通常来说,响应状态码status_code
字段的值为200
,如果可以是多个,则可将该字段值改成[200, 502]
,如 测试用例csv demo, 第15-16行。
Q: 某些接口仅允许在特定环境,或某个测试账号才执行,该如何处理?
如果某些接口只允许在指定的环境运行, 可修改run_env
字段,其默认值为 all
,表示在所有环境都运行。如果改成prod
,则表示仅在prod
环境才运行。
Q: 某些接口仅允许某个测试账号才执行,该如何处理?
如果某些接口只允许某个账号身份登录才运行,可修改run_env
字段,其默认值为 all
,表示所有用户都运行。如果改成abcd@yourapp.info
,则表示仅测试账号为abcd@yourapp.info
时才运行。
Q: 如何提取响应数据为变量,供之后的接口用例所使调用?
在测试过程中,经常遇到下一个接口B
需要用到上一个接口A
响应数据的情况,这个时候就涉及到参数的提取。
本框架在csv用例数据中定义了字段 var_extract
来进行后置参数的提取,根据接口返回响应数据(暂仅支持JSON,若是text则需要进一步完善)提取参数,保存在变量中,可供之后的接口用例所使调用。字段 var_extract
可转为dict
,其key
为变量名,v
是jsonnpath
表达式。
假设接口A
的返回为
{"data": [{"name": "Lucy", "age": "10", "grade": 4},
{"name": "John", "age": "12", "grade": 6}]
}
若var_extract
字段为 {"name": "$..name", "age": "$..age"}
,则表示将接口返回的json中的第一个name
字段值Lucy
,存到变量name
中,该模块之后的用例接口B
可通过 ${name}
来引用,age
同理。关于jsonpath表达式,可自行查询该库的更多具体用法。
如果还有更它需要,如要取返回的最后一个字段,或者某个返回字段值中的部分,可以在注释 step 2: extract variables
结束部分再自行补充。
如 测试用例csv示例文件, 第2行的var_extract
字段,就表示从该接口返回数据取第一个"name"字段,然后在第3行的payload
中引用该字段。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。