初识httprunner
“一站式接口解决方案”。只需维护一份YAML/JSON/Pytest脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。
Httprunner3.0比2.0概念简化,集成pytest(插件已达900+),框架引入pydantic系统,内置http web server,测试用例编写语法提示(链式调用rest-assured)。
测试用例:独立性(hook机制,setup/teardown)由一到多个有序的step构成,step可被引用。
Debugtalk.py:作为项目根目录的锚点,用例中的相对路径会在当前目录查找该文件,没找到再去上层找。。把动态运算放在debugtalk.py中,在用例中进行引用。实现约定大于配置的思路。
https://github.com/HttpRunner/HttpRunner
1.准备python虚拟环境
创建:python -m venv anny-env
进入环境:执行anny-env\Scripts\activate.bat
2.安装httprunner
pip install httprunner (3.1.4)
检查:httprunner -V httprunner -h
3.脚手架生成项目httprunner startproject ***
这里用到原始命令httprunner,其他地方可以用子命令hrun
4.生成的项目可通过ide打开,设置中要配置创建的python虚拟环境。
5.通过hrun demo***.py运行demo.yml用例。
用例运行逻辑将.yml/.json用例生成.py用例并格式化,用pytest运行。
6.通过charles抓包导出为.har文件,用har2case命令将.har文件默认转换为.py文件,使用pytest命令运行。
7.也可将.har文件使用har2case -2y转换为.yml文件,使用hrun命令运行。
8.查看报告:默认安装了pytest-html。hrun testcases --html=./reports/demo.html
也支持allure。
以mubu.com为例:
生成脚本:
1. 使用charles抓包mubu.com登录并新建文档录入标题、内容,导出为mubu_login.har文件。
2. 在pycharm中将.har文件转换为.py文件并用Pytest直接运行OK.
3. 查看回放后在mubu.com中生成的文档,发现生成的文档内容为空。
定位脚本问题:
排查方法:缩小范围
引用变量:${}
1.关联参数:找关联参数进行引用变量的替换。
参数关联:提取参数
.extract()
.with_jmespath("body.data.id","docID")
2.全局变量:对于memberId要通过charles看一下是通过服务端生成还是前端JS生成。如果请求使用memberId前没有出现,就说明在前端生成的。这种情况不用非做关联参数处理,但会存在较多接口存在该值,理解为一个全局变量,因此将其放在config中添加.variables(**{"memberId":"7506370717891848"}),将所有参数替换为${memberId}。全局变量的生效范围只在当前用例中,如果多用例共享,在debugtalk.py中定义。
3.把userid进行参数关联。
这里要注意extract()放的位置
4. 代码调整结束后回放成功,新生成一个demo文档,内容也一致。
5. 对脚本做更多的优化:csrf_token、SESSION不需要写死,去掉。
6. data_unique_id做参数化。
目的:脚本简洁,没有写死的数据
原则:看下数据是否从服务端返回的,如果是做参数化关联。
其他:
1. SLARDAR_WEB_ID:httprunner中的日志埋点的前端框架,每个请求中有一个唯一的埋点,接口请求的后端经过后端服务将链路日志捞取出来,方便问题定位,是前端生成的。
2. 去掉cookies中一些无用的参数,如:reg_entrance,Hm_lvt_*,_gid,_gat,Hm_lpvt_*
3. Jwt-Token不能删除但也不能写死,需要提取并参数化关联。注意Jwt-Token在jmespath中不支持直接-线,要用”Jwt-Token”引起来,不能用单引号。
Base_url抽取:抽取后的请求url中去掉base_url。
4.如果网站只有一个host,用base_url可实现整个替换。如果有两个host,就无法全部替换。
那就需要通过把host设置为全局变量的形式,然后在出现mubu.com的地方引用$host.
这样就实现了把所有请求中的mubu.com进行参数化。
5.用全局变量抽取帐号、密码。
定义局部变量:在step中生效
调整校验器,增加assert.
6.想在接口后等待指定时间:使用setup/teardown hook. sleep方法是写在框架里的。
在hook中调用函数时是需要知道函数的运行结果的,并期望结果能在后续使用。用到hook的另一种用法。
7.模拟签名算法:在debugtalk.py中定义函数
用例中引用函数的值:
用例解耦:
1.把登录用例抽取出来创建一个用例文件,需要引用登录用例的地方这样写:
对于用到的login中提取的参数,两边都进行export输出变量值:
参数化数据驱动:
1.在yaml文件中添加参数:
2.使用hmake生成pytest文件,引入了parameters库。
运行.yml文件就会发现运行了两次。
将生成的.py文件中的参数驱动代码放入需要的文件中。
@pytest.mark.parametrize("param", Parameters({"index": [1, 2]}))
def test_start(self, param):
super().test_start(param)
@pytest.mark.parametrize("param", Parameters({"docTitle": ["demo-1", "demo-2","demo-3"]}))
引用函数生成参数列表:将生成的文件名称函数写入debugtalk中,调用函数。
def gen_doc_title(num):
return [get_random_title() for _ in range(num)]
@pytest.mark.parametrize("param", Parameters({"docTitle": "${gen_doc_title(3)}"}))
对于数据文件比较多的时候,可以引用CSV文件,文件中用,分隔参数。引用时,多个参数用-连接,比如:“phone-password”:“${parameterize(data/accounts.csv)}”引用值。data/accounts.csv是路径。注意执行时有两组数据的话,会执行四次,参数值进行迪卡尔乘积,而不是两次。
查看报告:
1.默认pytest-html hrun --html=login.html
2.使用allure hrun --allulredir=reports/ allure serve reports/
性能测试:
1.pip install locust
2.locusts -f testcases/mubu_login_test.py 以并发的形式把性能测试跑起来
- 点赞
- 收藏
- 关注作者
评论(0)