httprunner学习9-完整的用例结构(yaml&json)
前言
前面几篇零散的学了一些httprunner的知识点,那么一个完整的 YAML/JSON 用例文件包含哪些关键字呢?
测试用例结构
在 HttpRunner 中,测试用例组织主要基于三个概念:
- 测试用例集(testsuite):对应一个文件夹,包含单个或多个测试用例(YAML/JSON)文件
 - 测试用例(testcase):对应一个 YAML/JSON 文件,包含单个或多个测试步骤
 - 测试步骤(teststep):对应 YAML/JSON 文件中的一个 test,描述单次接口测试的全部内容,包括发起接口请求、解析响应结果、校验结果等
 
对于单个 YAML/JSON 文件来说,数据存储结构为 list of dict 的形式,其中可能包含一个全局配置项(config)和若干个测试步骤(test)。
- config:作为整个测试用例的全局配置项
 - test:对应单个测试步骤(teststep),测试用例存在顺序关系,运行时将从前往后依次运行各个测试步骤
 
对应的 JSON 格式如下所示:
[
  {
    "config": {...}
  },
  {
    "test": {...}
  },
  {
    "test": {...}
  }
]
对应的 YAML 格式如下所示
- config:
    name: xxx
- test:
    name: login case1
    request:
        url: http://127.0.0.1:8000/api/v1/login/
    ...
- test:
    name: login case2
    request:
        url: http://127.0.0.1:8000/api/v1/login/
    ...
变量空间(context)作用域
在测试用例内部,HttpRunner 划分了两层变量空间作用域(context)。
- config:作为整个测试用例的全局配置项,作用域为整个测试用例;
 - test:测试步骤的变量空间(context)会继承或覆盖 config 中定义的内容;
- 若某变量在 config 中定义了,在某 test 中没有定义,则该 test 会继承该变量
 - 若某变量在 config 和某 test 中都定义了,则该 test 中使用自己定义的变量值
 
 - 各个测试步骤(test)的变量空间相互独立,互不影响;
 - 如需在多个测试步骤(test)中传递参数值,则需要使用 extract 关键字,并且只能从前往后传递
 
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 的公共参数,作用域为整个用例 | 
| output | No | list | 整个用例输出的参数列表,可输出的参数包括公共的 variable 和 extract 的参数; 在 log-level 为 debug 模式下,会在 terminal 中打印出参数内容 | 
config配置 JSON 格式示例
"config": {
    "name": "testcase description",
    "parameters": [
        {"user_agent": ["iOS/10.1", "iOS/10.2", "iOS/10.3"]},
        {"app_version": "${P(app_version.csv)}"},
        {"os_platform": "${get_os_platform()}"}
    ],
    "variables": [
        {"user_agent": "iOS/10.3"},
        {"device_sn": "${gen_random_string(15)}"},
        {"os_platform": "ios"}
    ],
    "request": {
        "base_url": "http://127.0.0.1:5000",
        "headers": {
            "Content-Type": "application/json",
            "device_sn": "$device_sn"
        }
    },
    "output": [
        "token"
    ]
}
config配置 YAML 格式示例
- config:
    name: xxx
    parameters:
        - user_agent: ["iOS/10.1", "iOS/10.2", "iOS/10.3"]
        - app_version: ${P(app_version.csv)}
        - os_platform: ${get_os_platform()}
    variables:
        - user_agent: iOS/10.3
        - device_sn: ${gen_random_string(15)}
        - os_platform: ios
    request:
        base_url: http://127.0.0.1:5000
        headers:
            Content-Type: application/json
            device_sn: $device_sn
    output:
        - token
test相关参数
| 关键字 | 是否必须 | 格式类型 | 描述 | 
|---|---|---|---|
| namel | Yes | string | 测试步骤的名称,在测试报告中将作为测试步骤的名称 | 
| request | Yes | dict | HTTP 请求的详细内容;可用参数详见 python-requests 官方文档 | 
| variables | No | list of dict | 测试步骤中定义的变量,作用域为当前测试步骤 | 
| extract | No | list | 从当前 HTTP 请求的响应结果中提取参数,并保存到参数变量中(例如token),后续测试用例可通过$token的形式进行引用 | 
| validate | No | list | 测试用例中定义的结果校验项,作用域为当前测试用例,用于实现对当前测试用例运行结果的校验 | 
| setup_hooks | No | list | 在 HTTP 请求发送前执行 hook 函数,主要用于准备工作 | 
| teardown_hooks | No | list | 在 HTTP 请求发送后执行 hook 函数,主要用户测试后的清理工作 | 
test用例 JSON 格式示例
"test": {
    "name": "get token with $user_agent, $os_platform, $app_version",
    "request": {
        "url": "/api/get-token",
        "method": "POST",
        "headers": {
            "app_version": "$app_version",
            "os_platform": "$os_platform",
            "user_agent": "$user_agent"
        },
        "json": {
            "sign": "${get_sign($user_agent, $device_sn, $os_platform, $app_version)}"
        },
        "extract": [
            {"token": "content.token"}
        ],
        "validate": [
            {"eq": ["status_code", 200]},
            {"eq": ["headers.Content-Type", "application/json"]},
            {"eq": ["content.success", true]}
        ],
        "setup_hooks": [],
        "teardown_hooks": []
    }
}
test用例 YAML 格式示例
- test:
    name: get token with $user_agent, $os_platform, $app_version
    request:
        url: /api/get-token
        method: POST
        headers:
            app_version: $app_version
            os_platform: $os_platform
            user_agent: $user_agent
        json:
            sign: ${get_sign($user_agent, $device_sn, $os_platform, $app_version)}
        extract:
            - token: content.token
        validate:
            - eq: [status_code, 200]
            - eq: [headers.Content-Type, application/json]
            - eq: [content.success, true]
        setup_hooks: []
        teardown_hooks: []
hooks
setup_hooks 函数放置于 debugtalk.py 中,并且必须包含三个参数:
- method: 请求方法,e.g. GET, POST, PUT
 - url: 请求 URL
 - kwargs: request 的参数字典
 
teardown_hooks 函数放置于 debugtalk.py 中,并且必须包含一个参数:
- resp_obj: requests.Response 实例
 
httprunner学习9-完整的用例结构(yaml&json)的更多相关文章
- httprunner学习19-重复执行用例
		
前言 使用httprunner做接口测试过程中,在工作中会遇到这种场景,发现某个接口不稳定,想重复运行100次用例,甚至1000次,看成功率. yml脚本 - config: name: httpbi ...
 - HttpRunner学习2--用例格式和简单使用
		
前言 HttpRunner中,测试用例支持两种文件格式:YAML 和 JSON.两种格式的用例是完全等价的,对于相同的信息内容,使用 YAML /JSON 得到的测试结果和报告也是一致的. 本人环境: ...
 - httprunner学习15-运行用例命令行参数详解
		
前言 HttpRunner 在命令行中启动测试时,通过指定参数,可实现丰富的测试特性控制. 命令行参数CLI 使用 -h 查看相关命令行参数 hrun -h 参数名称 参数值 参数说明 -h, --h ...
 - HttpRunner学习8--使用debugtalk.py辅助函数
		
前言 在HttpRunner中,我们的测试用例都是写在 YAML/JSON 文件中,有时候我们想借助代码来实现某些较复杂的功能,但在 YAML/JSON 中是无法直接写代码来处理的,这个时候,我们可以 ...
 - HttpRunner学习7--引用CSV文件数据
		
前言 在之前的文章中,我们已经学习了 parameters 参数化,是在测试脚本中直接指定参数列表.这种方法简单易用,但如果我们的参数列表数据比较多,这种方法可能就不太适合了. 当数据量比较大的时候, ...
 - HttpRunner学习5--使用variables声明变量
		
前言 在HttpRunner中,如果需要声明变量,可以通过关键字 variables 来完成,要引用声明的变量,则是通过 $+变量名 (如 $token )来实现.variables 可以在 conf ...
 - HttpRunner学习4--使用正则表达式提取数据
		
前言 在HttpRunner中,我们可通过extract提取数据,当响应结果为 JSON 结构,可使用 content 结合 . 运算符的方式,如 content.code,用起来十分方便,但如果响应 ...
 - 【HttpRunner v3.x】笔记 ——4. 测试用例-结构解析
		
一.官方首推pytest格式 上篇文章我们知道了,httprunner可以支持三种格式的用例,分别是pytest.yaml和json.yaml和json是以前的版本所使用的用例格式,但是在3.x版本上 ...
 - Httprunner学习
		
一.简介 HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份YAML/JSON脚本,即可实现自动化测试.性能测试.线上监控.持续集成等多种测试需求. 核心特性: 继 ...
 
随机推荐
- Go:为何带来泛型
			
中文版 English version 介绍 [这是在Gophercon 2019上发表的演讲版本.视频链接可供使用.] 这篇文章是关于向Go添加泛型的意义,以及为什么我认为我们应该这样做.我还将介绍 ...
 - Python爬虫爬取BT之家找电影资源
			
一.写在前面 最近看新闻说圣城家园(SCG)倒了,之前BT天堂倒了,暴风影音也不行了,可以说看个电影越来越费力,国内大厂如企鹅和爱奇艺最近也出现一些幺蛾子,虽然目前版权意识虽然越来越强,但是很多资源在 ...
 - win10 .net framework 3.5  离线安装 不需要外网
			
win 10如果安装系统时没有安装.net 3.5 那么在以后安装时就必须联网. win10 .net framework 3.5 离线安装工具: 链接: https://pan.baidu.com/ ...
 - 如何申请腾讯地图用户Key
			
打开网页https://lbs.qq.com/,进入腾讯位置服务. 单击[登录],登录腾讯账号(本文以QQ登录为例),如果首次登陆腾讯位置服务,则提示注册开发者账号. 选择箭头处[注册新账号].填写手 ...
 - DELPHI网页开发神器UNIGUI的安装与演示
			
UNIGUI安装和演示 uniGUI v1.0.0.1397(带注册机).rar在delphi10.2安装 提示:安装包可以自行在网上搜索下载,或者联系我获取都可以 这里讲下怎样安装的方法: 1)执行 ...
 - kubeadm初始化集群
			
通过kubeadm创建集群本地测试非常方便,以下就简单记录下初始化需要的基本命令,环境准备这里不做说明 简单记录kubeadm初始化集群的基本命令 # 初始化集群 kubeadm init --kub ...
 - 【模板】LCT
			
核心思想: 动态维护一个森林.支持删边,加边,查询链信息等很多操作. 由若干棵$Splay$组成,每棵$Splay$维护一条链,以深度作为关键字. 也就是说$Splay$的中序遍历相当于从上到下遍历这 ...
 - golang  ---rune与byte
			
golang内置类型有rune类型和byte类型. rune类型的底层类型是int32类型,而byte类型的底层类型是int8类型,这决定了rune能比byte表达更多的数. 在unicode中,一个 ...
 - SAP销售订单需求类型的确定优秀级
			
需求类型的确定优秀级:1.策略组里的需求类型:2.MRP组里的:3.SO行项目类别+MRP类型4.SO行项目类别 部分截图:
 - 防止用iframe调用网页dom元素
			
<system.webServer> <httpProtocol> <customHeaders> <add name="X-Frame-Optio ...