《httprunner 2.x》学习2-手册快速入手

生成测试用例

使用 har2case 转换脚本时默认转换为 JSON 格式,加上 -2y 参数后转换为 YAML 格式。
har2case docs/data/demo-quickstart.har -2y
经过转换,在源 demo-quickstart.har 文件的同级目录下生成了相同文件名称的 YAML 格式测试用例文件 demo-quickstart.yml,其内容如下:
1.每个 YAML/JSON 文件对应一个测试用例(testcase)
2.每个测试用例为一个list of dict结构,其中可能包含全局配置项(config)和若干个测试步骤(test)
3.config 为全局配置项,作用域为整个测试用例
4.test 对应单个测试步骤,作用域仅限于本身

  • config:
    name: testcase description
    variables: {}

  • test:
    name: /api/get-token
    request:
    headers:
    Content-Type: application/json
    User-Agent: python-requests/2.18.4
    app_version: 2.8.6
    device_sn: FwgRiO7CNA50DSU
    os_platform: ios
    json:
    sign: 9c0c7e51c91ae963c833a4ccbab8d683c4a90c98
    method: POST
    url: http://127.0.0.1:5000/api/get-token
    validate:
    - eq: [status_code, 200]
    - eq: [headers.Content-Type, application/json]
    - eq: [content.success, true]
    - eq: [content.token, baNLX1zhFYP11Seb]

  • test:
    name: /api/users/1000
    request:
    headers:
    Content-Type: application/json
    User-Agent: python-requests/2.18.4
    device_sn: FwgRiO7CNA50DSU
    token: baNLX1zhFYP11Seb
    json:
    name: user1
    password: '123456'
    method: POST
    url: http://127.0.0.1:5000/api/users/1000
    validate:
    - eq: [status_code, 201]
    - eq: [headers.Content-Type, application/json]
    - eq: [content.success, true]
    - eq: [content.msg, user created successfully.]

调整校验器
例如登录接口的话,每次生成的token不同,因此不要用token做校验项,删除即可。
validate:
- eq: [status_code, 200]
- eq: [headers.Content-Type, application/json]
- eq: [content.success, true]

参数关联
支持参数提取(extract)和参数引用的功能($var)。
先动态获取到第一个测试步骤中的 token,然后在后续测试步骤的请求中使用前面获取到的 token。
extract:
token: content.token

  • test:
    name: /api/users/1000
    request:
    headers:
    Content-Type: application/json
    User-Agent: python-requests/2.18.4
    device_sn: FwgRiO7CNA50DSU
    token: $token

提取base_url
每个测试步骤的 URL 中,都采用的是完整的描述(host+path),但大多数情况下同一个用例中的 host 都是相同的,区别仅在于 path 部分。
因此,我们可以将各个测试步骤(test) URL 的 base_url 抽取出来,放到全局配置模块(config)中,在测试步骤中的 URL 只保留 PATH 部分。

  • config:
    name: testcase description
    base_url: http://127.0.0.1:5000

变量的申明和引用
在 config 和 test 中均可以通过 variables 关键字定义变量,然后在测试步骤中可以通过 $ + 变量名称 的方式引用变量。区别在于,在 config 中定义的变量为全局的,整个测试用例(testcase)的所有地方均可以引用;在 test 中定义的变量作用域仅局限于当前测试步骤(teststep)。

  • test:
    name: /api/get-token
    variables:
    app_version: 2.8.6
    device_sn: FwgRiO7CNA50DSU
    os_platform: ios
    request:
    headers:
    Content-Type: application/json
    User-Agent: python-requests/2.18.4
    app_version: app_version device_sn:device_sn
    os_platform: $os_platform

抽取公共变量
两个测试步骤中都定义了 device_sn。针对这类公共的参数,我们可以将其统一定义在 config 的 variables 中,在测试步骤中就不用再重复定义。

  • config:
    name: testcase description
    base_url: http://127.0.0.1:5000
    variables:
    device_sn: FwgRiO7CNA50DSU

  • test:
    name: /api/get-token
    variables:
    app_version: 2.8.6
    os_platform: ios
    request:
    headers:
    Content-Type: application/json
    User-Agent: python-requests/2.18.4
    app_version: app_version device_sn:device_sn

实现动态运算逻辑
参数 device_sn 代表的是设备的 SN 编码,针对 device_sn 生成一个 15 位长度的随机字符串。与此同时,sign 字段是根据 headers 中的各个字段拼接后生成得到的 MD5 值,因此在 device_sn 变动后,sign 也应该重新进行计算,否则就会再次出现签名校验失败的问题。
支持热加载的插件机制(debugtalk.py),可以在 YAML/JSON 中调用 Python 函数。
引用变量的方式仍然与前面讲的一样,采用+ 变量名称的方式;调用函数的方式为{func($var)}。
func是函数名,参照httprunner手册:

  • config:
    name: testcase description
    base_url: http://127.0.0.1:5000
    variables:
    device_sn: {gen_random_string(15)} ······ json: sign:{get_sign(device_sn,os_platform, $app_version)}

参数化数据驱动
创建一个文件,对测试用例进行引用,并使用 parameters 关键字定义参数并指定数据源取值方式。
创建用户的接口中对 user_id 进行参数化,参数化列表为 1001~1004,并且取值方式为顺序取值,那么最简单的描述方式就是直接指定参数列表。
config:
name: testcase description

testcases:
create user:
testcase: demo-quickstart-6.yml
parameters:
user_id: [1001, 1002, 1003, 1004]

对于具有关联性的多个参数,例如 username 和 password,那么就可以按照如下方式进行配置:
config:
name: "demo"

testcases:
testcase1_name:
testcase: /path/to/testcase1
parameters:
username-password:
- ["user1", "111111"]
- ["user2", "222222"]
- ["user3", "333333"]

独立参数 & 引用 CSV 文件
对于已有参数列表,并且数据量比较大的情况,比较适合的方式是将参数列表值存储在 CSV 数据文件中。
对于 CSV 数据文件,需要遵循如下几项约定的规则:
CSV 文件中的第一行必须为参数名称,从第二行开始为参数值,每个(组)值占一行;
若同一个 CSV 文件中具有多个参数,则参数名称和数值的间隔符需实用英文逗号;
在 YAML/JSON 文件引用 CSV 文件时,文件路径为基于项目根目录(debugtalk.py 所在路径)的相对路径。

参照链接https://v2.httprunner.org/prepare/parameters/

查看测试报告

在每次使用 hrun 命令运行测试用例后,均会生成一份 HTML 格式的测试报告。报告文件位于 reports 目录下,文件名称为测试用例的开始运行时间。

参考链接
https://v2.httprunner.org/quickstart/#_9

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容