【学习笔记】HttpRunner自动化测试框架入门
HttpRunner自动化测试框架入门
文章目录
- 设计思想和理念
- 一、Httprunner环境搭建
- 可以用相关命令**直接生成对应的项目文件夹**
- 二、Httprunner五个命令
- 三、一分钟生成用例
- 四、运行case:
- 五、生成报告
- 生成html报告
- 生成allure报告
- 六、**设置接口关联**
- 七、**debugtalk.py的 应用**
- 八、**hook应用:**
- 九、断言:
- 1、validate关键字:拿实际结果和期望结果去比较。支持两种格式:
- 2、*contains*关键字:判断**包含**的断言
- 3、断言中使用正则表达式
- 十、参数化
- 十一、跳过执行:只能在testcases中设置
- 十二、重复执行:`times` 参数,用例中可以*设置用例运行的次数*
- 十三、用例分层:
- 十四、case之间的相互调用:
- 参数说明
- **config参数说明**
- **test参数说明**
- **extract关键词**(也可以用output代替):
- 学习源
设计思想和理念
Httprunner:面向http协议的测试框架。只需维护一份yaml/json文件。 结合locust可做性能测试,线上性能监控,持续集成等。
Httprunner接口自动化框架之只造车不造轮子
主流框架均可集成、junit、testNG、unittest、pytest、request、Devops
约定大于配置(提升测试脚本的可维护性)
配置文件组织测试用例(yaml/json)
一次投入多次使用
高度可扩展性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O32n71he-1671346922278)(null)]
一、Httprunner环境搭建
# 直接安装
pip install httprunner
pip install har2case# 验证环境
hrun -V
har2case -V
可以用相关命令直接生成对应的项目文件夹
用 httprunner startproject HttpRunnerDemo 来创建项目
文件目录结构说明:
. YAML/JSON:(必须)测试用例文件,一个文件对应一条测试用例。
. debugtalk:(可选)脚本函数,存储项目中逻辑运算函数,该文件存在时,将作为项目定位标记,其所在目录被视为项目工程的根路径,该文件不存在时,运行测试的路径将被视为当前工作目录,测试用例文件中的相对路径,如.csv均需基于当前工作目录,运行测试后,测试报告文件夹reports会生成在当前工作目录
. env:(可选)存储项目环境变量
. reports、logs:(自动生成)运行后自动生成,无需创建
二、Httprunner五个命令
httprunner 主命令
hrun httpruner的别名,用于运行yaml\json\pytest测试用例
hmake httprunner make的别名,将yaml\json文件转换成pytest文件
har2case httprunner har2case的别名,用于将har文件转化成yaml\json文件
locust 用于性能测试
三、一分钟生成用例
使用抓包工具fiddler生成har文件
选中需要导出的接口–>菜单栏File–>Export Sessions–>Select Export Format–>HTTPArchive v1.1-Next
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lonNbxov-1671346922165)(null)]
将har文件转换成yaml文件
将导出的har文件导入至项目中,使用pycharm打开选中需要转换的har文件
底部terminal 下运行
har2case har文件名.har #生成py文件的测试用例
har2case har文件名.har -2y #生成yaml文件的测试用例
har2case har文件名.har -2j #生成json文件的测试用例
注意:生成的yaml文件
HttpRunner划分了两层变量空间作用域(context):
1.config:作为整个测试用例的全局配置项;
2.test:测试步骤的变量空间(context)会继承或覆盖config中定义的内容
注意:若某变量在config中定义了,在某test中没有定义,则该test会继承该变量;若某变量在config和test中都定义了,则该test使用config中定义的变量值,各个测试步骤的变量空间相互堵路,互不影响,如需在多个测试步骤中传递参数值,则需要使用extract关键字,并且只能从前往后传递
注:config中引入的变量:很多接口的公共部分,可以抽离出来放入debugtalk.py
(参数说明见文末)
四、运行case:
hrun HttpRunnerDemo\testcases\demo_testcase_ref.yml
还会在logs下生成测试日志: HttpRunnerDemo\logs\77343183-2374-4d6a-a499-6580fbb89b45.run.log
,可以打开log查看详情,可以清晰的看到接口返回和断言结果。
五、生成报告
生成html报告
hrun HttpRunnerDemo\testcases\demo_testcase_ref.yml --html=report。html
生成allure报告
hrun ERP_Project_test.py --alluredir=allure # 生成allure 数据
allure generate ./allure/ -o ./reports --clean # 生成allure报告到reports文件夹里
六、设置接口关联
在实际的接口测试中,后一个接口经常需要用到前一个接口返回的结果,从而让后一个接口能正常执行,这个过程的实现称为关联。
提取的方式有两种:
1、响应结果为 JSON 结构,可采用.运算符的方式,例如headers.Content-Type、content.success;
2、响应结果为 text/html 结构,可采用正则表达式的方式,例如name=“csrf_token” value=“(.+?)”/>
引用变量的方式采用$ + 变量名称的方式;
例:
- config: name: "访问xxx"base_url: ${ENV(URL)}export: - token # 2. 控制台输出变量token的值- test: name: "获取access_token"request: url: /phpuwk/method: GETparams: xxx: xxxextract:- token: content.access_token # 1. extract提取access_token的值,并赋值给变量tokenvalidate:...- test: name: 查看已经被创建的标签request: url: /okhll/method: GETheaders: content-type: alication/jsonparams: access_token: "$token" # 3. 引用token值validate:...
**环境变量:**项目中新建.env文件,填写内容:URL=xxxx,测试用例中引用环境变量 ${ENV(URL)}
七、debugtalk.py的 应用
可在这个文件中编写辅助函数,然后进行关联。引用该文件中的函数的方法为:${函数名}
编写debugtalk.py文件,内容如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N4lQJu9M-1671346922253)(null)]
测试用例文件中调用如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Vh1otqH-1671346922307)(null)]
## debugtalk.py
#! /usr/bin/env_python
# encoding: utf-8
import requests
def get_token():get_data={"grant_type":"xxx","appid":"xxx","secret":"xxxxxxx"}respone = requests.get(url='https://api.weixin.qq.com/cgi-bin/token', params=get_data)return respone.json()['access_token']## xxx.yml
...
- test:name: "引用debugtalk.py文件函数传递参数"request: url: /cgi-bin/tags/getmethod: GETheaders: content-type: alication/jsonparams: access_token: ${get_token()} ## 引用debugtalk.py文件函数传递参数validate:...
八、hook应用:
hook钩子函数,在特定的地方进行特定的调用。
debugtalk.py文件中编写代码如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w5UOP6Lr-1671346922359)(null)]
测试用例代码如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LNDQrWuF-1671346922199)(null)]
九、断言:
1、validate关键字:拿实际结果和期望结果去比较。支持两种格式:
(1). {“comparator_name”: [check_itrm, expect_value]}
(2). {‘check’: check_itrm, ‘comparator’: comparator_name, ‘expect’: expect_value}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-us4D1Inh-1671346922415)(null)]
2、contains关键字:判断包含的断言
- contains: [content, 响应正文中的值]
,判断响应正文中是否包含了某字符串
- config: name: "get请求,带参数"base_url: http://www.baidu.com- test: name: "get access_token"request:url: /cgi_bin/tokenmethod: GETparams: grant_type: 'clcoxxxxxxxxxsla'appid: 'wk9jh92m83'secret: 'a5d68699c76d986b766e282367378c7627c6c7'extract: - access_token: content.access_tokenvalidate: - contains: [content, access_token]
3、断言中使用正则表达式
httprunner断言中支持正则表达式,也支持定义变量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hDfbvS0U-1671346922332)(null)]
十、参数化
1、通过testsuite中编写parameter关键字参数化
从2.0.0版本开始,HttpRunner不再支持在测试文件中进行参数化配置,参数化的功能需要在testsuite中实现,实现的方式为parameters下面写参数,testsuite中执行的时候需要引用testcases中的用例,参数化后需要在testsuite中运行yml文件
### testsuit.yml 文件
config:name: 参数化测试套件
testcases:- name: 这里引用testcases中的测试用例testcase: testcases/test01.yml # ----------> 测试用例的绝对路径parameters: # ---------------------------> 设置参数serch_word: [baidu, 777, python] # ------> 参数名:参数列表### test01.yml 文件
- config:name: 测试用例,被上面测试套件引用base_url: https://www.baidu.comexport: - title
- test:name: 百度搜索request: url: /smethod: GETparams: wd: $serch_word # ---------------------> 对testsuit中parameters设置的参数的引用header: Accept: xxxAccept-Encoding: xxxAccept-Language: xxxUser-Agent: xxxextract: - title: <title>(.+?)</title>validate: -eq: ["status_code", 200]
- (1). testsuite传递多个参数:以-隔开参数,以列表的方式处理【一个list:是一组参数,传递给多个变量;一个-:case执行一次,所谓参数化】
### testsuit.yml 文件
config:name: 参数化测试套件
#testcases:
# - name: 这里引用testcases中的测试用例
# testcase: testcases/test01.yml # ----------> 测试用例的绝对路径
# parameters: # ---------------------------> 设置参数
# serch_word: [baidu, 777, python] # ------> 参数名:参数列表
testcases:- name: 这里引用testcases中的测试用例times: 5skipIf: [1, 2]testcase: testcases/test02.yml # ----------> 测试用例的绝对路径parameters: # ---------------------------> 设置参数serch_word-result: # --------------> 以-隔开参数,以列表的方式处理:参数1:serch_word,参数2:result- [python, python_百度搜索] # ----------> 第一组参数:[参数1,参数2]- [chrome, chrome_百度搜索] # ----------> 第二组参数- [google, google_百度搜索] # ----------> 第三组参数### test02.yml 文件
- config:name: 测试用例,被上面测试套件引用base_url: https://www.baidu.comexport: - title
- test:name: 百度搜索extract: - title: <title>(.+?)</title>request: url: /smethod: GETparams: wd: $serch_word # ---------------------> 引用第一个参数:即-的前半部分,serch_wordheader: Accept: xxxAccept-Encoding: xxxAccept-Language: xxxUser-Agent: xxxvalidate: -eq: [$title, $result] # -----------------> 引用第二个参数:即-的后半部分,result
- (2). 笛卡尔积的运用:比如测试账号有四种[“test1”, “test2”, “test3”, “test4”],密码也有四种 [“123456”, “123456”, “123456”, “123456”],用笛卡尔积组合的话,就是44=16种组合*
### testsuit.yml 文件
config:name: 参数化测试套件
testcases:- name: 这里引用testcases中的测试用例times: 5skipIf: [1, 2]testcase: testcases/test02.yml # ----------> 测试用例的绝对路径parameters: # ---------------------------> 设置参数user: ["test1", "test2", "test3", "test4"] # passwd: ["123456", "123456", "123456", "123456"] # case中传入$user和$passwd,case会执行16种组合的次数
2、利用csv文件进行参数化:根路径下新建data文件夹–新建info.csv文件,文件中的参数用" , "符号分隔,testsuit中通过P()函数进行引用,case里面需要csv文件中的参数时,则通过 $ 参数名的方法调用,与csv中的参数排列顺序无关,注意参数名称必须与csv表头保持一致
### E:\Code_local\HttpRunnerDemo\data\info.csv
search_word,result # 搜索参数,预期结果
taobao,taobao_百度搜索
python,python_百度搜索
123456,123456_百度搜索
charme,charme_百度搜索
google,google_百度搜索### testsuit.yml
config:name: 参数化测试套件
testcases:- name: 这里引用testcases中的测试用例testcase: testcases/test02.ymlparameters: search_word-result: ${P(data/info.csv)} # 引用csv文件,csv参数的个数通过-隔开### test01.yml
- config:name: 测试用例,被上面测试套件引用base_url: https://www.baidu.comexport: - title
- test:name: 百度搜索request: url: /smethod: GETparams: wd: $serch_word # ------------> 引用第一个参数:即-的前半部分,serch_wordheader: Accept: xxxAccept-Encoding: xxxAccept-Language: xxxUser-Agent: xxxextract: - title: <title>(.+?)</title>validate: -eq: [$title, $result]
3、通过debugtalk实现参数化:(相当于jmeter中的函数助手的功能),与parameters下引用csv一样,debugtalk参数化的数据也是一个列表,使用${函数}引用debugtalk中的函数
### debugtalk.py
# "随机在某最小值和某最大值的范围内生成多少个整数组成的列表"
def get_randomint(min, max, count=None):randomint_list = []for i in range(count):randomint_list.append(random.randint(min, max))return randomint_listdef setup_case(case_name):print("测试用例 s% 开始执行" % case_name)
def teardown_case(case_name):print("测试用例 s% 执行结束" % case_name)
def setup_step(case_step):print("测试步骤 s% 开始执行" % case_step)
def teardown_step(case_step):print("测试步骤 s% 执行结束" % case_step)if __name__ == "__main__":print(get_randomint(1, 20, 10))### testsuit.yml
config:name: 参数化测试套件
testcases:- name: 这里引用testcases中的测试用例testcase: testcases/test01.ymlparameters: search_word: ${get_randomint(1, 20, 5)} # 引用debugtalk中的函数### test01.yml
- config:name: 测试用例,被上面测试套件引用base_url: https://www.baidu.com
- test:name: 百度搜索request: url: /smethod: GETparams: wd: $serch_word header: ...
十一、跳过执行:只能在testcases中设置
无条件跳过:skip
条件为真跳过:skipIf
条件为假跳过:skipUnless
### test01.yml
- config:name: 测试用例,被测试套件引用base_url: https://www.baidu.com
- test:skip: 无条件跳过 # ----------> a. 无条件跳过:skipname: 百度搜索request: ...validate: -eq: ["status_code", 200] - test:skipIf: 百度搜索2 # ---------> a. 条件为真跳过:skipIf,非空、非0、True时跳过执行name: 百度搜索2request: ...validate: -eq: ["status_code", 200] - test:skipUnless: # ----------> a. 条件为假跳过:skipUnless,空、0、False时跳过执行name: 百度搜索3request: ...validate: -eq: ["status_code", 200]
十二、重复执行:times
参数,用例中可以设置用例运行的次数
### test01.yml
- config:name: 测试用例,被测试套件引用base_url: https://www.baidu.com
- test:skipUnless: 1times: 5 # -----------> times设置case运行次数name: 百度搜索request: ...validate: -eq: ["status_code", 200]
十三、用例分层:
Httprunner项目分层为 api接口层,testcases用例层,testsuite测试套件层
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fhUatuS9-1671346922386)(null)]
1、api接口层:不用在里面加特殊细节的断言,断言接口能否请求通即可。新建api文件夹,下面新建一个yml文件进行接口api的编写。
例:
### E:\Code_local\HttpRunnerDemo\api\test.yml
name: "获取access_token"
base_url: ${ENV(url)}request: url: /cgi-bin/tokenmethod: GETparams: grant_type: ${ENV(grant_type)}appid: ${ENV(appid)}secret: ${ENV(secret)}
validate:- eq: [status_code, 200]
2、testcases用例层:直接调用接口层中的yml文件执行,细节断言可在这里编写,同时也可以调用其他用例或者其他用例的参数执行。
### test01.yml
- config:name: case中调用api文件中的yml文件执行
- test: name: step01:执行获取token的接口api: api/test.yml # ------------------> 只需要写被调用的api目录下的yml绝对路径即可validate: - contains: [content, access_token]
3、estsuite测试套件层:新建testsuites目录存放测试套件,将测试用例整合起来执行
### testsuit01.yml
config: name: 测试套件整合测试用例进行执行testcases:- name: 调用testcases中的用例执行testcase: testcases/test01.yml # ----> 被调用case的绝对路径
十四、case之间的相互调用:
可以通过调取用例和调取用例之中的参数进行调用
1、用例之间的简单调用:testcase关键字,直接给被调用用例的绝对路径
### test01.yml
- config:name: 测试用例,被测试套件引用base_url: https://www.baidu.com- test: name: 调用其他用例testcase: testcases/test02.yml # -------> 被调用用例的绝对路径- test:...
2、用例之间传参的调用
用例之间传参:把需要的值都给参数化,然后进行相互调用,可以提高代码复用率
举例:【注意:这几个过程中,变量名必须保持一致】
(1). 先在test中用extrac关键字提取出token赋值给token_id;
(2). 然后config中用export关键字输出token_id值;
(3). 其他test需要引用的情况下,需要先使用variables关键字定义该变量然后再引用
## test1.yaml
- config: name: "访问xxx"base_url: www.xxx.comexport: - token_id # 2. 控制台输出token_id- test: name: "获取access_token"request: url: /phpuwk/method: GETparams: xxx: xxxextract:- token_id: content.access_token # 1. 提取并赋值access_token给token_idvalidate:...## test2.yaml
- config: name: "get请求,带参数"base_url: ${ENV(url)}- test:name: "调用获取access_token的接口,引用其中的access_token参数"testcase: testcases/test1.yaml # 执行test1.yaml,方便引用其中的access_token参- test: variables:token_id: $token_id # 3. 定义变量name: 查看已经被创建的标签request: url: /okhll/method: GETheaders: content-type: alication/jsonparams: access_token: $token_id # 4. 引用变量validate: - {'check': status_code, 'comparator': eq, 'expect': 200}
参数说明
config参数说明
关键词 | 是否必须 | 数据类型 | 描述 |
---|---|---|---|
name | 是 | string | 测试用例名称,在测试报告中将作为标题 |
base_url | 否 | string | 接口访问地址的公共部分 |
variables | 否 | list of dict | 定义全局变量,作用域为整个用例 |
verify | 否 | boolean | 是否验证服务器的TLS证书 |
export | 否 | list | 整个用例输出的参数列表,可输出的参数包括公共的 variable 和 extract 的参数;在 log-level 为 debug 模 式下,会在 terminal 中打印出参数内容 |
setup_hooks | 否 | list | 在整个用例开始执行前触发hook函数,主要用于准备工作 |
teardown_hooks | 否 | list | 在整个用例开始执行后触发hook函数,主要用于测试后的清理工作 |
test参数说明
关键词 | 是否必须 | 数据类型 | 描述 |
---|---|---|---|
name | 是 | string | |
request | 否 | dict | http请求的详细内容 |
variables | 否 | list of dict | 测试步骤中定义的变量,作用域为当前测试步骤 |
extract | 否 | list | 从当前 HTTP 请求的响应结果中提取参数,并保存到参数变量中(例如 token),后续测试用例可通过$token的形式进行引用 |
validate | 否 | list of dict | 测试用例中定义的结果校验项,作用域为当前测试用例,用于实现对当前测试用例运行结果的校验 |
setup_hooks | 否 | list | 在 HTTP 请求发送前执行 hook 函数,主要用于准备工作 |
teardown_hooks | 否 | list | 在 HTTP 请求发送后执行 hook 函数,主要用于测试后的清理工作 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UIzdYZ6x-1671346922225)(null)]
extract关键词(也可以用output代替):
其作用是输出值,相当于print()函数的输出功能,另一个作用则是可以定义变量时用,经常与extract关键字一起组合使用
可以提取的:
status_code, cookies, elapsed, headers, content, text, json, encoding, ok, reason, url.
支持多种提取方式:
响应结果为 JSON 结构,可采用.运算符的方式,例如headers.Content-Type、 content.success;
响应结果为 text/html 结构,可采用正则表达式的方式,例如(.+?)
学习源
httprunner_你们的好朋友大强的博客-CSDN博客_httprunner
【学习笔记】HttpRunner自动化测试框架入门相关推荐
- 前端学习笔记:Bootstrap框架入门
前端学习笔记:Bootstrap框架入门 一.Bootstrap概述 1.基本信息 Bootstrap,来自 Twitter,是目前很受欢迎的前端框架.Bootstrap 是基于 HTML.CSS. ...
- java mvc框架代码_JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码)
原标题:JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码) JavaEE体系结构包括四层,从上到下分别是应用层.Web层.业务层.持久层.Struts和SpringMVC是Web层的 ...
- Python学习笔记--10.Django框架快速入门之后台管理admin(书籍管理系统)
Python学习笔记--10.Django框架快速入门之后台管理 一.Django框架介绍 二.创建第一个Django项目 三.应用的创建和使用 四.项目的数据库模型 ORM对象关系映射 sqlite ...
- Bootstrap学习笔记01【快速入门、栅格布局】
Java后端 学习路线 笔记汇总表[黑马程序员] Bootstrap学习笔记01[快速入门.栅格布局][day01] Bootstrap学习笔记02[全局CSS样式.组件和插件.案例_黑马旅游网][d ...
- Flowable学习笔记(一、入门)
转载自 Flowable学习笔记(一.入门) 一.Flowable简介 1.Flowable是什么 Flowable是一个使用Java编写的轻量级业务流程引擎.Flowable流程引擎可用于部署BP ...
- Hadoop学习笔记—15.HBase框架学习(基础知识篇)
Hadoop学习笔记-15.HBase框架学习(基础知识篇) HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase ...
- 学习笔记之Qt从入门到精通(三)
整理日期: 2010年4月9日 本文是学习笔记之Qt从入门到精通(二)的接续 Part 3: 进阶学习 Qt4 学习笔记 Qt 可以运行在不同的平台,像是Unix/X11.Windows.Mac OS ...
- Vue 新手学习笔记:vue-element-admin 之入门开发教程(v4.0.0 之前)
说实话都是逼出来的,对于前端没干过ES6都不会的人,vue视频也就看了基础的一些 但没办法,接下来做微服务架构,前端就用 vue,这块你负责....说多了都是泪,脚手架框架布了都没看过 干就完事,不过 ...
- 安卓学习笔记(一)入门篇
总结<第一行代码>Android学习笔记(一)入门篇 1.入门 Android的四层架构和四大组件 运行第一个Android程序 日志工具Log AndroidStudio快捷键 GIT的 ...
最新文章
- Ngrok实现远程控制和操作树莓派(Raspbian系统)
- STM32 HAL库 .c/.h 文件介绍
- 3-5:常见任务和主要工具之归档和备份
- python情感分析预测模型_python snownlp情感分析简易demo
- 【nginx】nginx 反向代理 指令说明
- 数据挖掘:模型选择——SVM
- python 包的使用 (三)——turtle:使用海龟图形(turtle graphics)绘制图像
- 设计模式演练——工厂方法模式
- 推荐一个学习内核的博客
- LM5117 学习板-BUCK 大功率降压稳压模块 8~52V输入 5~28 V 8A 输出
- MarkDown学习手册
- wordpress如何快速配置SSL安全证书
- s3cmd常用命令和使用技巧
- ios微信支付失败 php,iOS微信支付的那些坑
- 2021.12月电脑浏览器推荐-cent浏览器内存占用只有Google谷歌Chrome的68%
- “地理-语言”大模型文心ERNIE-GeoL及应用
- opengl——绘制一个点
- 实现一个简单的Java类:长方形与梯形的面积计算
- aspx 微型_如何使用微型可编程机器人向孩子介绍编码
- Linux入门推荐书籍