HttpRunner是一款面向Http和HTTPS协议的通用测试框架,只需编写维护一份YAML/JSON脚本即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求,是基于关键字驱动的框架,基于Har实现接口录制和用例生成公告
安装命令 pip install httprunner==2.5.7 ,这里安装的是2.5.7版本,安装完毕后 httprunner -V查看当前版本,HttpRunner 2.**分层机制:api testcases testsuite
一、在HttpRunner中,主要存在如下几类文件
1、YAML/JSON(必须):测试用例文件,一个文件对应一条测试用例
2、debugtalk(可选):脚本函数,存储项目中逻辑运算函数,该文件存在时,将作为项目定位标记,其所在目录被视为项目工程的根路径(当前工作目录CWD),该文件不存在是,运行测试的路径讲被视为当前工作目录CWD,测试用例文件中的相对路径,如.csv均需基于当前工作目录CWD,运行测试后,测试报告文件夹reports会生成在当前工作目录
3、.env(可选):存储项目环境变量
4、reports(自动生成):运行后自动生成,无需创建
二、YAML(Yet Another Markup Language)一种基于Unicode容易阅读,容易和脚本语言交互的,用来表达资料序列的编程语言,YAML文件可以创建为.yml文件
1、基本语法:
格式要求:K:(空格) v: 标识一堆键值对,必须要写空格
以空格的缩进来控制层级关系,只要是左对齐的一列数据,都是同一个层级的
属性和值大小写敏感
缩进不能用table键
对于单个YAML/JSON文件来说,数据存储结构为 list of dict的形式,其中可能包含一个全局配置项(config)和若干个测试步骤(test);,HttpRunner划分了两层变量空间作用域(context),config:作为整个测试用例的全局配置项;test:测试步骤的变量空间(context)会继承或覆盖config中定义的内容,若某变量在config中定义了,在某test中没有定义,则该test会集成该变量;若某变量在config和test中定义了,则该test使用config中定义的变量值,哥哥测试步骤的变量空间相互堵路,互不影响,如需在多个测试步骤中传递参数值,则需要使用extract关键字,并且只能从前往后传递
三、利用HttpRunner发送请求
1、发送get请求
执行yml文件,执行yml文件之前需要进入该文件所在的根路径下 hrun ./xxx/yml文件名,也可以用CMD命令运行
2、发送带token(传参的)get请求
3、模拟请求头
4、发送post请求
5、设置变量
原来官方操作手册说明的是config和test中都能定义变量,如果二者同时定义相同的变量则以test为主,但是2.5.7版本来看,二者同时存在读取的config中的变量(从运行结果来看test与config都定义相同的变量时运行正常,test中变量错误,config的变量正常的情况下运行正常,config变量错误,test中正常,运行报错)
四、test中参数应用举例
1、output、export及extract
2.**版本周output参数被export逐渐取代,其作用是输出值,相当于print()函数的输出功能,另一个作用则是可以定义变量时用,经常与extract关键字一起组合使用,
3、extract可以提取的关键字为:status_code, cookies, elapsed, headers, content, text, json, encoding, ok, reason, url,可以根据测试报告提取关键字,extract支持多种提取方式,01、响应结果为json结果,可采用.运算符的方式,例如 headers.Content-Type;
02、也支持响应结果为text/html 结构,可采用正则表达式的方式
通过正则表达式取响应正文中body的值
通过json取值
4、validate关键字
支持两种格式:
{“comparator_name”:[check_itrm,expect_value]} {'check': check_itrm, 'comparator': comparator_name,'expect':expect_value}
validate关键字用于断言,将预期结果与实际结果对比,其中包含的断言方式有
判断 包含的断言方式为 -contains: [content,响应正文中的值],注意是判断响应正文中是否包含了某字符串
{'check': check_itrm, 'comparator': comparator_name,'expect':expect_value} 断言方式举例
五、接口关联操作
1、test中测试步骤之间的关联
2、测通过配置文件进行关联,需要在根路径新建.env文件,该文件存放设置的全局变量参数及参数值,引用环境配置配置文件的方式为 ${ENV(参数名)}
3、也可以通过在debugtalk.py文件中编写辅助函数,然后进行关联;debugtalk是可选文件,引用该文件中的函数的方法为 ${函数名}
4、用例之间的传参,这种方式比较推荐,把需要的值都给参数化,然后进行相互调用,可以提高代码复用率
拿获取token和查看被创建的标签的接口举例,
首先获取token的接口中先把access_token变量值通过json取值方式以extrac关键字提取出来赋值给token_id,config中输出token_id值,其他用例需要引用的情况下,需要先定义该变量然后再引用,注意:四处的变量名必须保持一致
六、参数化的方式(三种)
方式一、通过testsuite中编写parameter关键字参数,testcases引用的方法:
从2.0.0版本开始,HttpRunner不再支持在测试文件中进行参数化配置,参数化的功能需要在testsuite中实现,实现的方式为paraneters下面写参数;testcases中的yml文件如下,testsuite中执行的时候需要引用testcases中的用例,,参数化后需要在testsuite中运行yml文件,
testsuite传递多个参数的方式
笛卡尔积的运用:比如测试账号有四种["test1", "test2", "test3", "test4"],密码也有四种 ["123456", "123456", "123456", "123456"],用笛卡尔积组合的话,就是4*4=16种组合
方式二、利用csv文件进行参数化
根据经下新建data文件夹--新建info.csv文件,通过P()函数进行引用,文件中的参数用 - 符号分隔,需要csv文件中的参数则通过 - 参数名的方法调用,与csv中的参数排列顺序无关,
此种方式单独在testcases中调用也是失败的,此种方法区别上面的是可以吧预期结果写进文件中用于断言,参数名称必须与csv表头保持一致,这也遵循了约定大于配置的思想
方式三、通过debugtalk实现参数化(相当于jmeter中的函数助手的功能),与parameters\csv一样,debugtalk参数化的数据也是一个列表,以下是随机在某最小值和某最大值的范围内生成多少个整数组成的列表的函数
七、跳过用例的执行,只能在testcases中设置,testsuite中暂时没有找到方法跳过执行
Unitest中可以通过@skip 无条件跳过和@kipif 条件为真时跳过及@skipunless 不满足条件时跳过用例
跳过用例的场景适合开发代码没完成,测试代码已完成、用例脚本没写完、依赖测试场景:A接口完成B接口才完成,A接口失败B接口不执行等等
1、无条件跳过
2、skipIf 条件为真是跳过,返回值为True,遵循python中if语句为真的判断:非空 非0 True
3、skipUnless 条件为假时跳过,与skipIf相反
八、用例重复执行 times 参数,用例中可以设置用例运行的次数;测试套件中设置同理运行次数的方法暂时还没有找到
九、form-data传输格式的请求运行失败时的处理,头部中content-type不写可以执行成功,写了就会失败
十、httprunner录制工具使用(录制成功后yml文件使用的是老版本的写法)
为了简化测试用例的编写工作,HttpRunner实现了测试用例生成的功能,对应的转换为一个独立的项目 har2case
首先,通过抓包工具fiddler随便抓取一些请求,导出会话,导出的格式为 .har格式
转成json格式的httprunner项目 har2case +.har文件绝对路径
转成yml文件 har2case +.har文件绝对路径 -2y 生成yml文件
编译器中打开文件
十一、用例分层
分成思想:Httprunner项目分层为 api接口层,testcases用例层,testsuite测试套件层
api定一层:不用在里面加特殊细节的断言,断言接口能否请求通即可
中间层为testcases用例层:调用api层的接口定义yml文件即可,细节断言可在这里编写,同时也可以调用其他用例或者其他用例的参数执行
最上层为测试套件层testsuite: 最好整合一起执行,目前没有找到方法控制测试套件中用例的执行顺序
1、api接口编写举例,新建api文件夹,下面新建一个yml文件进行接口api的编写
2、接口层写好后编写用例层,用例层直接调用接口中的yml文件执行,
3、测试套件层:测试套件吧测试用例整合起来执行
十二、用例之间的相互调用
用例之间调用的方法可以通过调取用例和调取用例之中的参数进行调用
1、简单的调用
2、用例之间传参的调用,可以实现用例的复用 思路:被调取用例:现有extrac提取被调用的参数值,export输出该参数,调用的用例:variables该参数值后把该参数传入接口请求参数中
十三、脚手架工具使用介绍
一个HttpRunner项目中必须要有的文件:api(定义接口) reports(自动生成的,存储测试报告) testcases (存放测试用例) testsuites(存放测试套件) .env (存放环境配置参数) debugtalk (编写脚本函数),与其自己动手新建这么多文件夹和文件,还不如利用脚手架快速构建项目,只需要一个命令即可: hrun --startproject +项目名称
十四、生成2.4.3版本测试报告的方法
先把HttpRunner版本降级到2.4.3版本 pip install httprunner==2.4.3 --index-url https://pypi.douban.com/simple
新建一个HttpRunner项目,在reports文件夹下新建template文件夹,把2.4.3版本的测试报告放进去命名为extent_report_template2.4.3.html
然后再运行命令: hrun ./testcases/demo_testcase.yml --report-template reports/template/extent_report_template2.4.3.html,生成的测试报告就是2.4.3的版本了