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.

支持多种提取方式:

  1. 响应结果为 JSON 结构,可采用.运算符的方式,例如headers.Content-Type、 content.success;

  2. 响应结果为 text/html 结构,可采用正则表达式的方式,例如(.+?)

学习源

httprunner_你们的好朋友大强的博客-CSDN博客_httprunner

【学习笔记】HttpRunner自动化测试框架入门相关推荐

  1. 前端学习笔记:Bootstrap框架入门

    前端学习笔记:Bootstrap框架入门 一.Bootstrap概述 1.基本信息 ​Bootstrap,来自 Twitter,是目前很受欢迎的前端框架.Bootstrap 是基于 HTML.CSS. ...

  2. java mvc框架代码_JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码)

    原标题:JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码) JavaEE体系结构包括四层,从上到下分别是应用层.Web层.业务层.持久层.Struts和SpringMVC是Web层的 ...

  3. Python学习笔记--10.Django框架快速入门之后台管理admin(书籍管理系统)

    Python学习笔记--10.Django框架快速入门之后台管理 一.Django框架介绍 二.创建第一个Django项目 三.应用的创建和使用 四.项目的数据库模型 ORM对象关系映射 sqlite ...

  4. Bootstrap学习笔记01【快速入门、栅格布局】

    Java后端 学习路线 笔记汇总表[黑马程序员] Bootstrap学习笔记01[快速入门.栅格布局][day01] Bootstrap学习笔记02[全局CSS样式.组件和插件.案例_黑马旅游网][d ...

  5. Flowable学习笔记(一、入门)

    转载自  Flowable学习笔记(一.入门) 一.Flowable简介 1.Flowable是什么 Flowable是一个使用Java编写的轻量级业务流程引擎.Flowable流程引擎可用于部署BP ...

  6. Hadoop学习笔记—15.HBase框架学习(基础知识篇)

    Hadoop学习笔记-15.HBase框架学习(基础知识篇) HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase ...

  7. 学习笔记之Qt从入门到精通(三)

    整理日期: 2010年4月9日 本文是学习笔记之Qt从入门到精通(二)的接续 Part 3: 进阶学习 Qt4 学习笔记 Qt 可以运行在不同的平台,像是Unix/X11.Windows.Mac OS ...

  8. Vue 新手学习笔记:vue-element-admin 之入门开发教程(v4.0.0 之前)

    说实话都是逼出来的,对于前端没干过ES6都不会的人,vue视频也就看了基础的一些 但没办法,接下来做微服务架构,前端就用 vue,这块你负责....说多了都是泪,脚手架框架布了都没看过 干就完事,不过 ...

  9. 安卓学习笔记(一)入门篇

    总结<第一行代码>Android学习笔记(一)入门篇 1.入门 Android的四层架构和四大组件 运行第一个Android程序 日志工具Log AndroidStudio快捷键 GIT的 ...

最新文章

  1. Ngrok实现远程控制和操作树莓派(Raspbian系统)
  2. STM32 HAL库 .c/.h 文件介绍
  3. 3-5:常见任务和主要工具之归档和备份
  4. python情感分析预测模型_python snownlp情感分析简易demo
  5. 【nginx】nginx 反向代理 指令说明
  6. 数据挖掘:模型选择——SVM
  7. python 包的使用 (三)——turtle:使用海龟图形(turtle graphics)绘制图像
  8. 设计模式演练——工厂方法模式
  9. 推荐一个学习内核的博客
  10. LM5117 学习板-BUCK 大功率降压稳压模块 8~52V输入 5~28 V 8A 输出
  11. MarkDown学习手册
  12. wordpress如何快速配置SSL安全证书
  13. s3cmd常用命令和使用技巧
  14. ios微信支付失败 php,iOS微信支付的那些坑
  15. 2021.12月电脑浏览器推荐-cent浏览器内存占用只有Google谷歌Chrome的68%
  16. “地理-语言”大模型文心ERNIE-GeoL及应用
  17. opengl——绘制一个点
  18. 实现一个简单的Java类:长方形与梯形的面积计算
  19. aspx 微型_如何使用微型可编程机器人向孩子介绍编码
  20. Linux入门推荐书籍

热门文章

  1. 傅小兰研究员是学报第一任女主编吗?
  2. 计算机课程和教学计划,计算机教学计划
  3. 可鸡的三大充要条件来了!!
  4. 小程序里显示店铺地址,可在地图上查看,可点击导航到店铺
  5. Fluke 726 高精度多功能过程校准器具体参数
  6. NVIDIA Jetson之PWM风扇自定义控制
  7. DDR SDRAM的内部结构Cell Structure
  8. 人脸检测:经典的VJ人脸检测器(类Harr特征,积分图加速法,级联的Adaboost强分类器)
  9. centos 8.0 安装nginx
  10. poi 使用模板导出数据