10步玩转httprunner框架

一、安装说明

python3.6安装:参考安装教程

httprunner安装:

pip install selenium

pip install pyOpenSSL

pip install pymysql

pip install httprunner==2.0.2

运行如下命令,若正常显示版本号,则说明 HttpRunner 安装成功:

参考:

            #卸载httprunner命令:

 pip uninstall httprunner

二、基础概念

1、测试用例(testcase)

HttpRunner 的测试用例描述方式进行如下设计:

测试用例应该是完整且独立的,每条测试用例应该是都可以独立运行的;在 HttpRunner 中,每个 YAML/JSON 文件对应一条测试用例。

测试用例包含 测试脚本 和 测试数据 两部分:

测试用例 = 测试脚本 + 测试数据

测试脚本 重点是描述测试的业务功能逻辑,包括预置条件、测试步骤、预期结果等,并且可以结合辅助函数(debugtalk.py)实现复杂的运算逻辑;可以将 测试脚本 理解为编程语言中的 类(class);

测试数据 重点是对应测试的 业务数据逻辑,可以理解为类的实例化数据;

测试数据 和 测试脚本 分离后,就可以比较方便地实现数据驱动测试,通过对测试脚本传入一组数据,实现同一业务功能在不同数据逻辑下的测试验证。

 测试步骤(teststep)

测试用例是测试步骤的 有序 集合,而对于接口测试来说,每一个测试步骤应该就对应一个 API 的请求描述。

测试用例集(testsuite)

测试用例集 是 测试用例 的 无序 集合,集合中的测试用例应该都是相互独立,不存在先后依赖关系的。

如果确实存在先后依赖关系怎么办,例如登录功能和下单功能。正确的做法应该是,在下单测试用例的前置步骤中执行登录操作。

- config:

    name: order product

- test:

    name: login

    testcase: testcases/login.yml

- test:

    name: add to cart

    api: api/add_cart.yml

- test:

    name: make order

    api: api/make_order.yml

2、文件类型

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

YAML/JSON(必须):测试用例文件,存储接口测试相关信息

debugtalk.py(可选):存储项目中逻辑运算辅助函数

.env(可选):存储项目环境变量,通常用于存储项目敏感信息

.csv(可选):项目数据文件,用于进行数据驱动

reports:默认生成测试报告的存储文件夹

3、测试用例结构



三、快速上手

1、测试用例执行

操作

修改登录账号和密码后执行测试用例

 hrun login1.yml

2、用例断言(关键字validate)

作用        

判断接口返回内容的准确性;

示例

    validate:

        - eq: [content.code, 200]

        - eq: [content.success, true]

        - eq: [content.message, "SUCCESS"]

        - eq: [content.data.char_pieces.29, "3"]

断言关键字

3、作用域

在测试用例内部,HttpRunner 划分了两层变量空间作用域(context)。

config:作为整个测试用例的全局配置项,作用域为整个测试用例;

test:测试步骤的变量空间(context)会继承或覆盖 config 中定义的内容;

各个测试步骤(test)的变量空间相互独立,互不影响;

如需在多个测试步骤(test)中传递参数值,则需要使用 extract 关键字,并且只能从前往后传递

操作

把请求URL地址配置成用例的全局配置项(base_url)

把 hearders的Content-Type 配置成用例的全局配置项

- config:

    name: 登录功能

    base_url: ****************************

    parameters: 

    request:

      headers:

        Content-Type: application/x-www-form-urlencoded


4、变量(关键字variables)

        定义变量

局部变量:测试步骤中定义的变量

 全局变量:congfig中定义的变量

        变量引用($name)

示例

- config:

    name: 登录功能

    variables: 

        name: '15920143494'

        pwd: 'vvic2017'

5、测试步骤编写

通过浏览器工具(F12)或者抓包工具抓取loginUMoreInfo接口信息。

在login1.yml文件中添加获取登录用户信息(loginUMoreInfo接口)的测试步骤。

运行login1.yml文件。

6、参数传递(extract)

测试场景:

B接口需要用到A接口返回的响应内容某个参数时,需要获取到该参数值,并传递给B接口使用。

定义关键字extract的参数名称和参数值,如下所示:

    extract:

        -   recordCount: content.page.recordCount

引用参数

   $recordCount


7、hook(钩子)机制

可以在请求前和请求后调用钩子函数。

hook 机制分为两个层级:

测试用例层面(config中配置)

setup_hooks: 在整个用例开始执行前触发 hook 函数,主要用于准备工作。

teardown_hooks: 在整个用例结束执行后触发 hook 函数,主要用于测试后的清理工作。

    2) 测试步骤层面(teststep中配置)

setup_hooks: 在 HTTP 请求发送前执行 hook 函数,主要用于准备工作;也可以实现对请求的 request 内容进行预处理。

teardown_hooks: 在 HTTP 请求发送后执行 hook 函数,主要用于测试后的清理工作;也可以实现对响应的 response 进行修改,例如进行加解密等处理。

编写 hook 函数

hook 函数的定义放置在项目的 debugtalk.py 中,在 YAML/JSON 中调用 hook 函数仍然是采用 ${func($a, $b)} 的形式。

def hook_print(msg):

    print(msg)

对于单个测试用例层面的 hook 函数,除了可传入自定义参数外,还可以传入与当前测试用例相关的信息,包括请求的 $request 和响应的 $response,用于实现更复杂场景的灵活应用。

操作:

1、在登录接口请求前等待2秒。(函数:setup_hook_sleep_N_sec)

2、在登录接口请求后等待4秒。(函数:teardown_hook_sleep_N_secs)

debugtalk.py中setup_hook_sleep_N_secs函数:

#指定接口请求前的休眠时间

def setup_hook_sleep_N_secs(n_secs):

    time.sleep(n_secs)

teardown_hook_sleep_N_secs函数

#指定接口响应后的休眠时间

def teardown_hook_sleep_N_secs(response, n_secs):

    if response.status_code == 200:

        time.sleep(n_secs)

    else:

        time.sleep(1)

8、环境变量

.env文件配置内容:

debugtalk.py内容

base_url = os.environ["base_url"] #读取环境变量

def get_base_url():

    return base_url

测试用例中调用环境变量

- config:

    name: 档口中心-商品数据-列表

    base_url: ${get_base_url()}

9、文件目录结构管理 && 脚手架工具

推荐的方式汇总如下:

debugtalk.py 放置在项目根目录下,假设为 PRJ_ROOT_DIR

.env 放置在项目根目录下,路径为 PRJ_ROOT_DIR/.env

接口定义(API)放置在 PRJ_ROOT_DIR/api/ 目录下

测试用例(testcase)放置在 PRJ_ROOT_DIR/testcases/ 目录下

测试用例集(testsuite)文件必须放置在 PRJ_ROOT_DIR/testsuites/ 目录下

data 文件夹:存储参数化文件,或者项目依赖的文件,路径为 PRJ_ROOT_DIR/data/

reports 文件夹:存储 HTML 测试报告,生成路径为 PRJ_ROOT_DIR/reports/

10、脚本调试(log)

若需要查看到更详尽的信息,例如请求的参数和响应的详细内容,可以将日志级别设置为DEBUG,即在命令中添加--log-level debug。

hrun --log-level debug testcases/test.yml


如有不懂,请联系我

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

推荐阅读更多精彩内容