接口测试框架Requests
python内置了HTTP库 urllib,可以用于发送http请求。基于Python的第三方库Requests是对urllib的再次封装,相比urllib更加简洁易用。Requests库不仅用于接口测试,还用在Python爬虫、量化交易等。本文介绍Requests库的使用方法。
Requests
HTTP接口测试涉及到以下几个方面:
- 构造请求方法:get、post、put、 delete、head ......
- 构造请求体:form、json、xml、 binary
- 分析响应结果:status code、 response body、 json path、 xpath
下面介绍使用Requests怎么实现这些步骤。
Requests安装
Github地址:Python HTTP Requests for Humans
requests官方文档: https://requests.readthedocs.io/zh_CN/latest/index.html
安装:
pip install requests
http请求响应测试接口:https://httpbin.testing-studio.com/
也可以自己本地搭建,GitHub地址:https://github.com/postmanlabs/httpbin
Requests常见接口请求方法构造
常见接口请求方法:
r = requests.get('https://api.github.com/events') #get请求
r = requests.post('http://httpbin.org/post', data = {'key':'value'}) #post请求
r = requests.put('http://httpbin.org/put', data = {'key':'value'})
r = requests.delete('http://httpbin.org/delete')
r = requests.head('http://httpbin.org/get')
r = requests.options('http://httpbin.org/get')
请求目标构造
请求URL
import requests
r = requests.get('https://api.github.com/events') #get请求
print(r.status_code)
输出:
200
header构造
普通的 header
url = 'https://api.github.com/some/endpoint'
headers ={user-agent': 'my-app/0.0.1'}
r= requests.get(url, headers=headers)
cookie
url = 'http://httpbin.org/cookies'
cookies = dict(cookies_are='working')
r = requests.get(url, cookies=cookies)
构造请求体
请求体通过键值对的形式编码,有多种形式的请求体,比如query参数、form请求、binary请求(上传文件)以及结构化请求:json、xml、 json rpc等。
Get Query请求
payload= {'key':'valuel','key2':'value2'}
r = requests.get('https://httpbin.org/get', params=payload)
Form请求参数
payload = {'key':'valuel','key2':'value2'}
r = requests.post("https://httpbin.org/post", data=payload)
JSON请求体构造
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
r = requests.post(url, json=payload)
xml请求
import requests
xml ="""<?xml version='1.0' encoding='utf-8'?><a>6</a>"""
headers={'Content-type':'application/xml'}
r = requests.post('http://httpbin.org/post', data=xml, headers=headers).text
binary请求
上传文件
url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
接口测试断言
接口测试中需要通过检查响应是否符合预期来测试接口有效性,也就是对接口响应进行断言。
响应
- r.url:
- r.status_code
- r.headers
- r.cookies
- r.encoding
- r.content
- r.text
- r.json()
import requests
class TestRequest():
def test_get(self):
r = requests.get('https://api.github.com/events') #get请求
assert r.status_code == 200
结构化响应断言
下面是请求Github项目仓库API,GitHub API可参考:https://docs.github.com/cn/rest/overview。
import requests
import json
r = requests.get('https://api.github.com/repos/hiyongz/DjangoDemo')
json_data = r.json()
print(json.dumps(json_data, indent=4))
响应的部分json数据如下:
{
"id": 272401302,
"node_id": "MDEwOlJlcG9zaXRvcnkyNzI0MDEzMDI=",
"name": "DjangoDemo",
"full_name": "hiyongz/DjangoDemo",
"private": false,
"owner": {
"login": "hiyongz",
"id": 20513021,
"node_id": "MDQ6VXNlcjIwNTEzMDIx",
"avatar_url": "https://avatars0.githubusercontent.com/u/20513021?v=4",
"gravatar_id": "",
...................
}
接下来介绍不同方法对这个json响应进行断言。
json断言
json断言
import requests
def test_json(self):
r = requests.get('https://api.github.com/repos/hiyongz/DjangoDemo')
assert r.json()['owner']['login'] == "hiyongz"
JSONPath断言
JSONPath文档:https://goessner.net/articles/JsonPath/
JSONPath表达式与XPath类似,是XPath在json中的应用,全称XPath for JSON,用于从JSON文档中提取数据。JSONPath表达式和XPath语法对比如下:
XPath | JSONPath | Description |
---|---|---|
/ | $ | 跟节点 |
. | @ | 当前节点 |
/ | . or [] | 儿子节点 |
.. | N/A | 父节点 |
// | .. | 子孙节点 |
* | * | 匹配所有节点 |
@ | N/A | 属性 |
[] | [] | 下标操作符 |
| | [,] | 多选 |
N/A | [start : end : step] | 切片 |
[] | ?() | 过滤表达式 |
N/A | () | script 表达式 |
() | N/A | 分组 |
Python中有个jsonpath库可用于处理json数据:https://pypi.org/project/jsonpath/
安装:
pip install jsonpath
和前面一样,断言登录名:
import requests
from jsonpath import jsonpath
def test_json(self):
r = requests.get('https://api.github.com/repos/hiyongz/DjangoDemo')
assert jsonpath(r.json(), '$..login')[0] == "hiyongz"
schema断言
JSON Schema可以用来注释和验证 JSON 文档,官网:http://json-schema.org/。
JSON Schema可用来添加自定义规则,可以自定义数据类型:
schema = {
"type" : "object",
"properties" : {
"price" : {"type" : "number"},
"name" : {"type" : "string"},
},
}
可以看到,除了字段值断言外,可以使用JSON Schema来断言接口返回值的类型。
把json格式转成schema,在线生成schema网址:https://jsonschema.net/
jsonschema是使用JSON Schema的Python库,通过 pip install jsonschema
命令安装。
import requests
from jsonschema import validate
def test_get_login_jsonschema(self):
url = "https://api.github.com/repos/hiyongz/DjangoDemo"
r = requests.get(url)
data = r.json()
schema = {
"name" : "DjangoDemo",
"owner" : {
"login" : "hiyongz",
},
}
validate(data, schema=schema)
JSON Schema可以用来进行自动校验:在接口测试中,每次运行的时候自动保存当前的 schema,下次运行对比上次的 schema,如果发现变更就报错
xml解析断言
xml文件解析可以使用requests_xml,参考:https://github.com/erinxocon/requests-xml
也可以使用Python xml.etree.ElementTree模块解析xml数据,可以使用Xpath定位,使用方法参考Web自动化测试:xpath & CSS Selector定位
xml.etree.ElementTree模块xml解析举例:
import xml.etree.ElementTree as ET
root = ET.fromstring(countrydata)
root.findall(".")
root.findall("./country/neighbor")
root.findall(".//year/..[@name='Singapore']")
root.findall(".//*[@name='Singapore']/year")
root.findall(".//neighbor[2]")
和JSON Schema一样,也有一个XML Schema,用于解析xml文档,文档参考:https://www.w3.org/2001/XMLSchema
Python库安装: pip install xmlschema
hamcrest断言
除了常用的Assert断言以外,有一个功能更加强大的断言方法叫Hamcrest 断言,具有丰富的断言匹配器,支持多种语言,官网地址:http://hamcrest.org/
下面简单介绍一下Python中的hamcrest断言使用方法
PyHamcrest GitHub仓库地址:https://github.com/hamcrest/PyHamcrest
文档:https://pyhamcrest.readthedocs.io/en/v2.0.2/tutorial/
安装PyHamcrest:
pip install PyHamcrest
断言登录名:
import requests
from hamcrest import *
def test_hamcrest(self):
r = requests.get('https://api.github.com/repos/hiyongz/DjangoDemo')
data = r.json()
assert_that(data['owner']['login'], equal_to("hiyongz"))
--THE END--
文章标题:接口测试框架Requests
本文作者:hiyo
本文链接:https://www.cnblogs.com/hiyong/p/14288463.html
欢迎关注公众号:「测试开发小记」及时接收最新技术文章!
接口测试框架Requests的更多相关文章
- requests库写接口测试框架初学习
学习网址: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-dscpm/ff75b907-415d-4220-89 ...
- 接口测试框架实战(一) | Requests 与接口请求构造
1080×388 33.4 KB Requests 是一个优雅而简单的 Python HTTP 库,其实 Python 内置了用于访问网络的资源模块,比如urllib,但是它远不如 Requests ...
- 【转】基于Python的接口测试框架实例
下面小编就为大家带来一篇基于Python的接口测试框架实例.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 背景 最近公司在做消息推送,那么自然就会产生很多接口,测试 ...
- 基于python的接口测试框架设计(三)接口测试的框架
基于python的接口测试框架设计(三)接口测试的框架 其实我这里用到的是unittest单元测试框架,,这个框架好就好在比较清楚,,setup terdown都可以处理一些初始化及完成后的工作 主要 ...
- Python接口测试实战4(上) - 接口测试框架实战
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- 基于Python的接口测试框架实例
文章来源:http://www.jb51.net/article/96481.htm 下面小编就为大家带来一篇基于Python的接口测试框架实例.小编觉得挺不错的,现在就分享给大家,也给大家做个参考. ...
- http接口测试框架-python
简单分解一下 接口测试框架设计: 主入口 -> 遍历接口/用例 -> 发送请求+接收响应 ->结果的对比 -> 生成报告 ->发送email 分成几大类:主入口的py文件 ...
- 基于HttpRunner,解析swagger数据,快速生成接口测试框架
使用HttpRunner默认生成的项目是这样的 命令:httprunner --startproject 项目名称 so,根据这个项目的目录结构,使用python解析swagger接口参数,可以快速 ...
- yamlpy接口测试框架
1.思路: yamlpy即为yaml文件+pytest单元测试框架的缩写, 可以看作是一个脚手架工具, 可以快速生成项目的各个目录与文件, 只需维护一份或者多份yaml文件即可, 不需要大量写代码. ...
随机推荐
- python--or 和 and 表达式
or表达式: 两边为一真一假,返回真: 两边都为假,返回右边: 两边都为真,返回左边: and表达式: 两边为一真一假,返回假: 两边都为假,返回左边: 两边都为真,返回右边:
- CF76A Gift
题目描述 有一个国家有N个城市和M条道路,这些道路可能连接相同的城市,也有可能两个城市之间有多条道路. 有一天,有一伙强盗占领了这个国家的所有的道路.他们要求国王献给他们礼物,进而根据礼物的多少而放弃 ...
- 网络编程-I/O复用
I/O模型 Unix下可用的I/O模型有五种: 阻塞式I/O 非阻塞式I/O I/O复用(select和poll.epoll) 信号驱动式I/O(SIGIO) 异步I/O(POSIX的aio_系列函数 ...
- (15)-Python3之--configparser模块
1.模块简介 configparser模块是python用来读取配置文件的模块,置文件的格式跟windows下的ini或conf配置文件相似,可以包含一个或多个节(section), 每个节可以有多个 ...
- IE双击打不开解决办法
方法1 [百度电脑专家]一键修复 建议下载并安装[百度电脑专家],官网:http://zhuanjia.baidu.com .打开[百度电脑专家],在搜索框内输入"IE修复",在搜 ...
- jQuery 多选与清除
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 新编日语1234册/重排本/全册 pdf
网上找的资源链接大部分都失效了,无奈之下只好淘宝购买.顺便分享一下吧. 链接: https://pan.baidu.com/s/1v5-osHKrIPzlgpd8yNIP5Q 提取码: kexn
- 【进阶】ZooKeeper 相关概念总结
1. 开卷有益 学习是一种习惯,只有把这种习惯保持下来,每天不学习一点就感觉浑身不自在,达到这样的境界,那么你成为大佬也就不远了买,正如我们标题所写的"开卷有益".人生匆匆,要想过 ...
- 玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定
前言 你好,我是A哥(YourBatman). 如何给Module模块单独增加依赖? 如何知道哪些Module模块用了Spring框架,哪些是web工程? IDEA如何打Jar包?打War包? 熟练的 ...
- 简述vue-cli 2.x和vue-cli 3+在项目构建、运行、编译执行时的区别
码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14363272.html 关于VUE的项目,有个问题一直不是特别清楚 ,不同公司的项目 ...