httprunner

 

官网链接:https://cn.httprunner.org/prepare/testcase-structure/

一、安装框架介绍

HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。

1、安装以及依赖软件

  • 可运行平台:windows、Linux、macOS,推荐系统:Linux/macOS
  • 安装方式: pip install httprunner
  • 依赖的Python版本:Python 3.4及以上版本

 

2、项目文件结构

  • YAML/JSON(必须):测试用例文件,一个文件对应一条测试用例
  • debugtalk.py(可选):脚本函数(存储项目中逻辑运算函数)
  • 该文件将作为项目根目录定位标记,其所在目录即被视为项目工程的根目录
  • api : 存放base接口
  • testcase:组合api中的接口,场景自动化case组装。(又先后顺序)
  • testsuite:用例集合(无序)
  • .env(可选):存储项目环境变量
  • reports(自动生成): 运行后自动生成,无需创建

 

3、常用命令

  • hrun 核心命令
  • har2case 格式转换命令,将har格式转换成json/yaml格式

 

二、编写运行

1、测试用例组织

测试用例组织中三个基础概念:测试套件、测试用例、测试步骤

测试用例集(testsuite):对应一个文件夹,包含单个或多个测试用例(YAML/JSON)文件,应该是完整且独立的,每条测试用例应该是都可以独立运行的

测试用例(testcase):对应一个 YAML/JSON 文件,包含单个或多个测试步骤。是测试步骤的 有序 集合,每一个测试步骤对应一个 API 的请求描述

测试步骤(teststep):对应 YAML/JSON 文件中的一个 teststep,描述单次接口测试的全部内容,包括发起接口请求、解析响应结果、校验结果等。 无序 集合,集合中的测试用例应该都是相互独立,不存在先后依赖关系的;如果确实存在先后依赖关系,那就需要在测试用例中完成依赖的处理

 

①变量引用

接口用例中,取值时可以通过自定义,也可以引用其他已定义好的变量或参数,格式为$var

②函数引用

接口用例中,取值时除了自定义、引用其他变量外,还可以引用debugtalk.py定义的函数来获取到函数返回值,格式为${get_value()}

③编写用例注意事项

(1)extract响应结果的字段有 : status_code, cookies, elapsed, headers, content, text, json, encoding, ok, reason, url。如果响应结果中有多层嵌套,可通过content.xxx.0.id格式获取id,其中content是指响应内容,xxx是响应内容中的某个字段,0表示获取xxx数组中第一个内容。

 

(2)所有json/yaml和.env文件中格式错误都会导致执行失败。

.env编辑时需注意:从第一行开始编辑,结尾不要有空行,采用key=value,value不需用“”括起来,否则会变成value的一部分

 

(3)支持的检验器有eq(=)、lt(<)、le(<=)、gt(>)、ge(>=)、ne(!=)、str_eq、len_eq、len_gt、len_ge、len_lt、len_le、contains、contained_by、type_match、regex_match、startswith、endswith。

 

  • API目录下保存单个接口
# 测试名称(必须的),String
name: 查询实例
# 无条件跳过测试(可选的),String,跳过测试的说明
skip:
# 条件为 true 时跳过测试(可选的)
skipIf:
# 条件为 false 时跳过测试(可选的)
skipUnless:

# 变量(可选的), List,被上级(testcases,testsuite)覆盖
variables:
   # 设置变量,实例id
   instance_id: 'i-xxxxxx'
# 默认域名(可选的).String
base_url: http://test
# 请求参数(必须的), dict, 与request中的参数相同
request:
   method: GET
   url: /v3/instance
   params:
       # 通过 $+参数名称 的形式,应用变量
       instance_id: $instance_id
# 提取器(可选的), dict,提取返回参数 (content是responses,body内容)
extract:
   code: content.code

# 验证(可选的), list
validate:
   - eq: [$code , 200]
   - eq: [content.msg, "成功!"]

# 前置处理(可选的),list (可以修改request内容)
setup_hooks:

# 后置处理(可选的),list
teardown_hooks:

注:

  • 可以通过查看源码runner.py->Runner->_run_test方法查看具体信息
  • httprunnertimeout的默认值为120

 

api/DescribeInstances.yml

name: 安全组查询
base_url: ${ENV(url)} 
variables:
    InstanceId: "i-XXXXXXX"
    InstanceName: ""
    PageNumber: ""
    PageSize: ""
#skipIf: true
request:
    url: ""
    verify: false
    params:
        AccessKeyId: ${ENV(ak)}
        Version: '2017-11-10'
        Action: 'DescribeInstances'
        InstanceId: "$InstanceId"
        InstanceName: "$InstanceName"
        PageNumber: "$PageNumber"
        PageSize: "$PageSize"
    method: GET
    headers:
        host: ${ENV(host)}
setup_hooks:
    -  ${setup_request($request)}
validate:
    -  eq: ["status_code", 200]
exteact:
    - content

 

 

2、testcase中的优先级

  • base_url
  • testcase test > testcase config > testsuite test > testsuite config > api
  • variables
  • testcase config > testcase test > testcase_def config > testcase_def test > api
  • verify
  • testcase teststep (api) > testcase config > testsuite config

 

 

3、testsuites

参数化数据驱动

Httprunner2.0中支持testsuits中进行参数化和数据驱动,假如测试用例中定义了多个参数,那么测试用例在运行时会对参数进行笛卡尔积组合,覆盖所有参数组合情况。

1、参数情况分2种

(1)独立参数

(2)具有关联性的多个参数

2、指定数据源方式分3种

(1)在 YAML/JSON 中直接指定参数列表

 

 

 

 

 

(2)通过内置的P函数引用 CSV 文件

 

 

(3)调用 debugtalk.py 中自定义的函数生成参数列表

 

 

 

 

注:

# 使用默认的 report_template.html
hrun testcases/instance.yaml
# 使用自定义的模板,可以指定相对路径或绝对路径
hrun testcases/instance.yaml --report-template=templates/ens_test.html
# 控制台打印日志类型为debug(输出详细的请求),默认为INFO
hrun testcases/instance.yaml --log-level=debug
# 将login.yaml对应的logs输出:x.loaded.json, x.parsed.json, x.summary.json
hrun testcases/instance.yaml --save-tests

三、httprunner附录


hrun 命令行相关命令行参数
参数名称
 
参数值
 
参数说明
 
-h, --help
 
不带参数
 
查看帮助信息
 
-V, --version
 
不带参数
 
查看版本号
 
--no-html-report
 
不带参数
 
不生成测试报告
 
--html-report-name
 
HTML_REPORT_NAM
 
重命名html报告名称
 
--html-report-template
 
HTML_REPORT_TEMPLATE
 
自定义html报告模板,参数带上html模板的信息路径
 
--log-level
 
LOG_LEVEL
 
日志等级,如:debug
 
--log-file
 
LOG_FILE
 
指定日志文本保存路径
 
--dot-env-path
 
DOT_ENV_PATH
 
指定环境变量.env的详细路径
 
--failfast
 
不带参数
 
运到失败后停止测试
 
--startproject
 
STARTPROJECT
 
指定项目的根目录
 
--validate
 
[VALIDATE [VALIDATE ...]]
 
校验json格式
 
--prettify
 
[PRETTIFY [PRETTIFY ...]]
 
各式化json文件
 


Validator详细
No.
 
Comparator
 
Description
 
A(check), B(expect)
 
1
 
eq
 
value is equal
 
A == B
 
2
 
lt
 
less than
 
A < B
 
3
 
le
 
less than or equals
 
A <=B
 
4
 
gt
 
greater than
 
A >B
 
5
 
ge
 
greater than or equals
 
A >=B
 
6
 
ne
 
not equals
 
A != B
 
7
 
str_eq
 
string equals
 
str(A) == str(B)
 
8
 
len_eq, count_eq
 
length or count equals
 
len(A) == B
 
9
 
len_gt,count_gt
 
length greater than
 
len(A) > B
 
10
 
len_ge,count_ge
 
length greater than or equals
 
len(A) >= B
 
11
 
len_lt, count_lt
 
length less than
 
len(A) < B
 
12
 
len_le, count_le
 
length less than or equals
 
len(A) <= B
 
13
 
contains
 
contains
 
[1,2] contains 1
 
14
 
contained_by
 
contained by
 
A in B
 
15
 
type_match
 
A is instance of B
 
isinstance(A, B)
 
16
 
regex_match
 
regex matches
 
re.match(B, A)
 
17
 
startswith
 
start with
 
A startwith(B) is True
('abc' startwith 'ab')
 
18
 
endswith
 
ends with
 
A endswith(B) is True
('abc' endswith 'bc')
 
 
config参数
参数
 
是否必须
 
格式
 
详情
 
name
 
YES
 
string
 
测试用例的名称,在测试报告中将作为标题
 
variables
 
NO
 
list of dict
 
定义的全局变量,作用域为整个用例
 
parameters
 
NO
 
list of dict
 
全局参数,用于实现数据化驱动,作用域为整个用例
 
request
 
NO
 
dict
 
request 的公共参数,作用域为整个用例;常用参数包括 base_url 和 headers
 

request参数
参数  
 
是否必须
 
格式
 
详情
 
base_url
 
NO
 
String
 
测试用例请求 URL 的公共 host,指定该参数后,test 中的 url 可以只描述 path 部分
 
headers
 
NO
 
dict
 
request 中 headers 的公共参数,作用域为整个用例
 

teststeps参数详情
参数 
 
是否必须
 
格式
 
详情
 
name
 
YES
 
String
 
测试步骤的名称,在测试报告中将作为测试步骤的名称
 
request
 
YES
 
dict
 
HTTP 请求的详细内容;可用参数详见 python-requests 官方文档
 
variables
 
NO
 
list of dict
 
测试步骤中定义的变量,作用域为当前测试步骤
 
extract
 
NO
 
list
 
从当前 HTTP 请求的响应结果中提取参数,并保存到参数变量中(例如token),后续测试用例可通过$token的形式进行引用
 
validate
 
NO
 
list
 
测试用例中定义的结果校验项,作用域为当前测试用例,用于实现对当前测试用例运行结果的校验
 
validate_script
 
NO
 
String
 
列表,每个元素对应一行 Python 代码。
例如:
validate_script:
        - "assert status_code == 201"
        - "a = response_json.get('args').get('a')"
        - "assert a == '1'"
 
times
 
NO
 
int
 
重复执行测试用例的次数
 
setup_hooks
 
NO
 
list
 
在 HTTP 请求发送前执行 hook 函数,主要用于准备工作
 
teardown_hooks
 
NO
 
list
 
在 HTTP 请求发送后执行 hook 函数,主要用户测试后的清理工作
 
posted @ 2021-06-02 21:02  Shadow.Yin  Views(716)  Comments(0Edit  收藏  举报