初识httprunner

举报
yk00932 发表于 2021/05/20 11:30:32 2021/05/20
【摘要】 “一站式接口解决方案”。只需维护一份YAML/JSON/Pytest脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。Httprunner3.0比2.0概念简化,集成pytest(插件已达900+),框架引入pydantic系统,内置http web server,测试用例编写语法提示(链式调用rest-assured)。测试用例:独立性(hook机制,setup/tea...

一站式接口解决方案。只需维护一份YAML/JSON/Pytest脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。

Httprunner3.02.0概念简化,集成pytest(插件已达900+),框架引入pydantic系统,内置http web server,测试用例编写语法提示(链式调用rest-assured)。

测试用例:独立性(hook机制,setup/teardown)由一到多个有序的step构成,step可被引用。

Debugtalk.py:作为项目根目录的锚点,用例中的相对路径会在当前目录查找该文件,没找到再去上层找。。把动态运算放在debugtalk.py中,在用例中进行引用。实现约定大于配置的思路。

https://docs.httprunner.org/

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-htmlhrun 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_tokenSESSION不需要写死,去掉。

6. data_unique_id做参数化。

目的:脚本简洁,没有写死的数据

原则:看下数据是否从服务端返回的,如果是做参数化关联。

其他:

1. SLARDAR_WEB_IDhttprunner中的日志埋点的前端框架,每个请求中有一个唯一的埋点,接口请求的后端经过后端服务将链路日志捞取出来,方便问题定位,是前端生成的。

2. 去掉cookies中一些无用的参数,如:reg_entrance,Hm_lvt_*,_gid,_gat,Hm_lpvt_*

3. Jwt-Token不能删除但也不能写死,需要提取并参数化关联。注意Jwt-Tokenjmespath中不支持直接-线,要用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 以并发的形式把性能测试跑起来 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。