HttpRunner+yaml+Python

HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试

录制生成测试用例

为了简化测试用例的编写工作,HttpRunner 实现了测试用例生成的功能。
首先,需要将抓包工具抓取得到的数据包导出为 HAR 格式的文件,假设导出的文件名称为 demo-quickstart.har
然后,在命令行终端中运行如下命令,即可将 demo-quickstart.har 转换为 HttpRunner 的测试用例文件。

$ har2case docs/data/demo-quickstart.har -2y
INFO:root:Start to generate testcase.
INFO:root:dump testcase to YAML format.
INFO:root:Generate YAML testcase successfully: docs/data/demo-quickstart.yml

在项目中是不会通过录制来生成测试用例的,下面就来看看在项目中HttpRunner架构是如何使用的

项目文件组织

在 HttpRunner 自动化测试项目中,主要存在如下几类文件:

  • YAML/JSON:测试用例文件,以及接口定义文件
  • debugtalk.py:存储项目中项目中所需的一些公用方法,并且该文件存在时,将作为项目根目录定位标记,其所在目录即被视为项目工程根目录
    该文件不存在时,运行测试的所在路径(CWD)将被视为项目工程根目录
  • .env:存储项目环境变量
  • .csv:项目数据文件,用于进行数据驱动
  • reports:默认生成测试报告的存储文件夹

测试用例组织

HttpRunner 的测试用例支持两种文件格式:YAML 和 JSON。
JSON 和 YAML 格式的测试用例完全等价,包含的信息内容也完全相同。
我们项目中选择的是YAML格式,以下都以YAML为例


image.png

在 HttpRunner 中,测试用例组织主要基于三个概念:

  • 测试用例集(testsuite):对应一个文件夹,包含单个或多个测试用例(YAML/JSON)文件
  • 测试用例(testcase):对应一个 YAML/JSON 文件,包含单个或多个测试步骤
  • 测试步骤(teststep):对应 YAML/JSON 文件中的一个 test,描述单次接口测试的全部内容,包括发起接口请求、解析响应结果、校验结果等

测试用例如何实现?

HttpRuner采用了测试用例分层模型

概括来说,测试用例分层机制的核心是将接口定义、测试步骤、测试用例、测试场景进行分离,单独进行描述和维护,从而尽可能地减少自动化测试用例的维护成本。


image.png
先定义接口

先定义接口,每个文件对应一个接口描述,接口定义描述的主要内容包括:name、variables、request、base_url、validate 等,形式如下:

name: get headers
base_url: http://httpbin.org
variables:
    expected_status_code: 200
request:
    url: /headers
    method: GET
validate:
    - eq: ["status_code", $expected_status_code]
    - eq: [content.headers.Host, "httpbin.org"]
其次再写testcase

引用接口定义写testcase,有了接口的定义描述后,我们编写测试场景时就可以直接引用接口定义了。

一般testcase 包含如下内容:

- config:
    name: _demo_test
    variables:
        sg_name: sgroup_test
        sg_title: sg_test
    setup_hooks:
        - ${cleanup_sg($sg_name)}
- test:
    name: "demo test case description"
    api: api/demo_api.yml
    variables:
        api_ag_name: $sg_name
        api_ag_title: $sg_title
        api_ag_desc: $sg_desc
        api_ag_owner: $sg_owner
    extract:
        - sg_id_1: json.data.demo_api.id
    validate:
        - "eq": ["status_code", 200]
        - "response_errors": ["json", False]
        - "eq": ["json.data.demo_api.desc", $sg_desc]

环境变量的定义以及引用

通过.env文件设置环境变量,.env文件一般放置在项目的根目录,以key=value的形势存放数据,样例如下:

$ cat .env
UserName=admin
Password=123456
PROJECT_KEY=ABCDEFGH

HttpRuner运行时会自动将.env文件中的内容加载到实时的环境变量中,然后就可以读环境变量了

对环境变量的引用
  • 在Yaml或Json脚本中的引用样例:${ENV(UserName)}
  • 在python脚本中的引用样例如下:
import os
def get_encrypt_password():
    raw_passwd = os.environ["Password"]
    PROJECT_KEY = os.environ["PROJECT_KEY"])
    password = (raw_passwd + PROJECT_KEY).encode('ascii')
    return hmac.new(password, hashlib.sha1).hexdigest()

Yaml写的测试用例如何调用python写的公用方法

HttpRunner架构支持在yaml或json文件中调用pyhon函数,通过${func()}的方式引用,
假设在testcase中调用上面定义的get_encrypt_password()方法:

- test:
    name: login
    request:
        url: http://host/api/login
        method: POST
        headers:
            Content-Type: application/json
        json:
            username: ${ENV(UserName)}
            password: ${get_encrypt_password()}
        validate:
            - eq: [status_code, 200]

case与case之间的参数如何传递

如何从上一个case的响应结果中提取参数并传递给下面的case?可以使用extract关键字,使用extract可以从接口响应结果中提取一个或多个参数
例如某个接口的响应结果为:

{
  "data": {
    "demotag": {
      "id": "123123",
      "name": "test_name",
      "title": "test_title"
    }
  }
}

使用extract提取name和title的值:

 extract:
          - name: json.data.demotag.name
          - title: json.data.demotag.title

接下来使用$title这种形式,就可以在其他case中用这两个值了

检查点的验证

httprunner提供validate关键字验证接口的返回结果,使用方式如下:

      validate:
          - "eq": ["status_code", 200]
          - "response_errors": ["json", False]
          - "eq": ["json.data.demotag.name", $name]
          - "eq": ["json.data.demotag.title", $title]
 

执行测试用例

hrun testcases\demo_test.yml

执行结果

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

推荐阅读更多精彩内容

  • 介绍 HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份YAML/JSON脚本...
    yertao阅读 7,493评论 0 3
  • 一、什么是HttpRunner: HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维...
    小木58阅读 1,856评论 0 1
  • 一、安装说明 python3.6安装:参考安装教程 httprunner安装: pip install selen...
    summer_1a77阅读 1,761评论 0 0
  • 我的家乡本来是一个特别宁静而地广人稀大草原。可是,家乡的音乐节却打破了昔日的安静,显得异常活跃,歌声缭绕,...
    梦康reading47阅读 217评论 0 1
  • 仕女上春图 骄阳似火种 混沌梦里住 醒时还乡路
    大爱无痕阅读 252评论 2 4