之前我们了解了config里的各项参数,今天来了解另一个重要部分——teststeps,在这之前,先看看测试用例的分层模型。

一、测试用例分层模型

一个testcase里(就是一个pytest格式的Python文件)可以有一个或者多个测试步骤,就是teststeps[]列表里的Step。

我的理解每一个Step就可以类比成pytest框架下的def test_xxx()的用例函数,在Step里通常都会要请求API完成测试,也可以调用其他测试用例来完成更多的需求。

可以来看下官方的测试用例逻辑图(2.x版本不同,3.x弃用了2.x的API概念):



可以看到,testsuite包含了testcase,testcase1需要依赖testcase2才可以完成,那么就可以在teststep12对其进行引用;而testcase2又依赖于testcase3,那么也可以在teststep22进行引用。

但是在整个testsuite下,这3个testcase都是相互独立的,可以独自运行。如果需要相互调用,则是在testcase内部去完成处理。

可能看起来有点绕,其实官方想表达的就是测试用例分层的一个思想:

  • 测试用例(testcase)应该是完整且独立的,每条测试用例应该是都可以独立运行的
  • 测试用例是测试步骤(teststep)的有序集合
  • 测试用例集(testsuite)是测试用例的无序集合,集合中的测试用例应该都是相互独立,不存在先后依赖关系的;如果确实存在先后依赖关系,那就需要在测试用例中完成依赖的处理

其实这一点,在我们自己使用pytest框架编写测试用例的时候同样贯彻到了。为了自动化测试的稳定性和可维护性,每个测试用例之间相互独立是非常有必要的。

二、teststeps-RunRequest

先上一段Step的代码,结合下面的点对照着看:

    teststeps = [
Step(
RunRequest("get with params")
.with_variables(
**{"foo1": "bar11", "foo2": "bar21", "sum_v": "${sum_two(1, 2)}"}
)
.get("/get")
.with_params(**{"foo1": "$foo1", "foo2": "$foo2", "sum_v": "$sum_v"})
.with_headers(**{"User-Agent": "HttpRunner/${get_httprunner_version()}"})
.extract()
.with_jmespath("body.args.foo2", "foo3")
.validate()
.assert_equal("status_code", 200)
.assert_equal("body.args.foo1", "bar11")
.assert_equal("body.args.sum_v", "3")
.assert_equal("body.args.foo2", "bar21")
),

从上面的代码可以看出,RunRequest的作用就是在测试步骤中请求API,并且可以对于API的响应结果进行提取、断言。

1.RunRequest(name)

RunRequest的参数名用于指定teststep名称,它将显示在执行日志和测试报告中。

2. .with_variables

用于存放变量,但是这里的是Step步骤里的变量,不同的Step的变量是相互独立的。所以对于多个Step都要使用的变量,我们可以放到config的变量里去。

另外,如果config和Step里有重名的变量,那么当你引用这个变量的时候,Step变量会覆盖config变量。

3. .method(url)

这里就是指定请求API的方法了,常用的get、post等等。如图所示,就是用的get方法,括号里的url就是要请求的地址了。

这里要注意的是,如果在config里设置了基础url,那么步骤里的url就只能设置相对路径了。

4. .with_params

这个就简单了,测接口不都得要传参么,对于params类型的传参,就放这就行了,key-value键值对的形式。对于body形式的传参,看后面。

5. .with_headers

同样,有header要带上的就放这里。

6. .with_cookies

需要带cookie的,可以用.with_cookies方法。

7. .with_data

对于body类型的传参,可以用.with_data。

8. .with_json

如果是json类型的body请求体,可以用.with_json。

9. .extract

这里就是要做提取操作了,使用.with_jmespath(jmes_path: Text, var_name: Text)。

这里是采用了JMESPath语言,JMESPath是JSON的查询语言,可以便捷的提取json中你需要的元素。

第一个参数是你的目标元素的jmespath表达式,第二个元素则是用来存放这个元素的变量,供有需要的引用。

这里不展开,后面单讲。

10. .validate

断言,我们测试最终就是要验证接口返回是否符合预期。

那在httprunner框架中,可以使用assert_XXX(jmes_path: Text, expected_value: Any)来进行提取和验证。

第一个参数还是jmespath表达式,第二个参数则是预期值。

assert_XXX这种方式相信用过自动化测试框架的都不会陌生,所以也非常容易上手。目前httprunner还是封装了非常丰富的断言方法的,相信可以满足绝大多数的需求了。

到这里,一个接口的请求和验证就完成了,我打算用flask快速写几个demo用的接口,可以对必要的方法更进一步的演示。

【HttpRunner v3.x】笔记—6. 测试用例-teststeps-RunRequest的更多相关文章

  1. 【HttpRunner v3.x】笔记 ——3. 录制生成测试用例

    在正式手动编写case之前,我们可以先来熟悉下httprunner的录制生成用例功能. 用postman的童鞋都知道,里面有个功能可以将接口转换成代码,可以直接copy过来使用,提升case编写效率. ...

  2. 【HttpRunner v3.x】笔记—7. 测试用例-teststeps-RunTestCase

    以前我在写接口自动化用例的时候,为了保证用例的独立性,需要在setUp里调用各种满足用例的一些前置条件,其中就不乏调用了其他测试用例中的方法. 而httprunner也是支持了这一项很重要的特性,通过 ...

  3. 【HttpRunner v3.x】笔记 ——5. 测试用例-config

    上一篇中,我们了解到了config,在配置中,我们可以配置测试用例级级别的一些设置,比如基础url.验证.变量.导出. 我们一起来看,官方给出的一个例子: from httprunner import ...

  4. 【HttpRunner v3.x】笔记 ——4. 测试用例-结构解析

    一.官方首推pytest格式 上篇文章我们知道了,httprunner可以支持三种格式的用例,分别是pytest.yaml和json.yaml和json是以前的版本所使用的用例格式,但是在3.x版本上 ...

  5. 【HttpRunner v3.x】笔记—8.运行testcase的几种方式

    在之前的demo过程中,已经运行过testcase了,那这篇就也来汇总一下,运行case相关的知识点. 一.运行testcase的几种场景 1. 运行单个case 通常单个case的话我会在编辑器里用 ...

  6. 【HttpRunner v3.x】笔记—8.用例引用、变量传递

    看到这里,对于httprunner已经有了一个大概的了解,现在想对于一些比较重要或者常用的功能,进行一些实践操作. 毕竟那谁说过,"纸上得来终觉浅,绝知此事要躬行." 上一篇提到了 ...

  7. 【HttpRunner v3.x】笔记 ——2. 用脚手架快速创建项目

    环境装好了,相信很多童鞋已经迫不及待的想run起来了,但是面对一个陌生的框架又无从下手.没关系,我们可以用脚手架来快速生成一个httprunner项目. 一.快速生成项目 我们不妨先输入httprun ...

  8. 【HttpRunner v3.x】笔记 ——1. 环境安装

    一.环境说明 HttpRunner 是一个基于 Python 开发的测试框架,可以运行在 macOS.Linux.Windows 系统平台上.笔者使用的是windows系统,所以后续都是基于windo ...

  9. 【HttpRunner v3.x】笔记 —— 开篇

    最近在社群聊天里,发现了一款适用于http协议的接口框架--HttpRunner.在对其有个大致了解后,我觉得这款框架优点多多,整合了接口测试中所配套用到的多种框架.通过优秀的封装,将case整合到一 ...

随机推荐

  1. python 把多个list合并为dataframe并输出到csv文件

    import pandas as pd a = [1,2,3] b = ['a','b','c'] test = pd.DataFrame({'a_list':a,'b_list':b}) 将两个列表 ...

  2. QString字符串的查找与截取实例

    QString是Qt中封装的字符串类,相对于标准库里的string,使用方法有些不同,个人感觉使用qt习惯后,感觉QString更好用,下面的代码主要是针对QString的字符查找.截取做的测试: # ...

  3. 有哪些开源的 Python 库让你相见恨晚?

    Arrow 我们知道 Python 已经内置了好几个处理时间相关的库,但是对于时间以及时区间的转换并不清晰,操作起来略繁琐,而 Arrow 可以弥补这个问题,它提供了更友好的方法,方便我们对时间,日期 ...

  4. Django中间件之实现Admin后台IP白名单

    Django自带的Admin管理后台很方便,但是实际生产环境真的会有挺多安全问题的,在admin的安全防护这方面,我之前就研究实现了给admin加上登录验证码和限流功能,可以参考这篇文章: 不过就在内 ...

  5. SpringBoot介绍,快速入门小例子,目录结构,不同的启动方式,SpringBoot常用注解

    SpringBoot介绍 引言 为了使用ssm框架去开发,准备ssm框架的模板配置 为了Spring整合第三方框架,单独的去编写xml文件 导致ssm项目后期xml文件特别多,维护xml文件的成本也是 ...

  6. 从零开始,Windows操作系统下的超详细的阿里云发布项目过程

    ==================== 步骤0: 购买阿里云服务器 ==================== 0.1 从来没有搞过外网部署的我,当然是先买服务器了,感谢很多小伙伴的帮忙 0.2 登录 ...

  7. Java学习之反射篇

    Java学习之反射篇 0x00 前言 今天简单来记录一下,反射与注解的一些东西,反射这个机制对于后面的java反序列化漏洞研究和代码审计也是比较重要. 0x01 反射机制概述 Java反射是Java非 ...

  8. python设计模式之适配器模式

    python设计模式之适配器模式 结构型设计模式一个系统中不同实体(比如,类和对象)之间的关系,关注的是提供一种简单的对象组合方式来创造功能. 适配器模式( Adapter pattern)是一种结构 ...

  9. 谈谈BUG严重级别(severity)管理

    在软件工程理论中,BUG严重级别(severity)是用于指示软件质量问题导致的负面影响的程度.但在大部分实际的软件开发组织中,对BUG严重级别(severity)的定义和使用常常充斥着大量的争议和分 ...

  10. python 01 print input int

    学过c语言与c语言的数据结构与算法后再来学习python,感觉编程的核心内容没有变,但每个编程语言都有自己的特点.本次学习的目标是理解python的特点与用法,把学过的bif(内置函数)用法记录下来, ...