前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >httprunner学习9-完整的用例结构(yaml&json)

httprunner学习9-完整的用例结构(yaml&json)

作者头像
上海-悠悠
发布2019-09-29 14:07:38
1.7K0
发布2019-09-29 14:07:38
举报

前言

前面几篇零散的学了一些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 格式如下所示:

代码语言:javascript
复制
[
  {
    "config": {...}
  },
  {
    "test": {...}
  },
  {
    "test": {...}
  }
]

对应的 YAML 格式如下所示

代码语言:javascript
复制
- 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 格式示例

代码语言:javascript
复制
"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 格式示例

代码语言:javascript
复制
- 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 格式示例

代码语言:javascript
复制
"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 格式示例

代码语言:javascript
复制
- 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 实例

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 变量空间(context)作用域
  • config配置
  • test相关参数
  • hooks
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档