热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

接口测试requests

引言:你是如何做接口自动化的,用的工具于技术有哪些?2个维度:工具:postman、jmeter代码:requests一、Requests概述Requests在官方的文档中,有这么

引言:你是如何做接口自动化的,用的工具于技术有哪些?

2个维度:

工具:postman、jmeter

代码:requests

一、Requests概述

Requests在官方的文档中,有这么介绍的⼀句话,具体为:HTTP For Humans,翻译过来就是:“让HTTP服务人类”。Requests是非常优秀的⼀个Python的第三方库,它在HTTP的应用层的协议中,客户端与服务端的交互请求, 非常的轻量级,交互非常的友好。

安装:pip install requests

二、Requests的源码结构

在如上的流程图中,我们可以看出,我们常用的请求方法GET,POST,PUT,DELETE的方法,在Requests里都能够很好的得到支持和处理。

三、Requests请求方法的参数

在⼀个请求方法中,我们关心的是它到底需要带哪些参数,主要可以总结为:

简单的我们可以把它总结为:请求地址,请求方法,请求参数(不是必填),和其他的非必填的信息

四、get方法实战

具体展示如下,以百度为例:

 结果如下:

 

其中r.text和r.content区别:

用了request.get方法后,返回一个response对象,这个对象里面存的是服务器返回的所有信息,包括响应头,响应状态码等。

其中返回的网页部分会存在.content和.text两个对象中。如果需要获得这些网页原始数据,我们可以通过r.text 或 r.content来获取数据。



  • .text 存的是.content 编码后的字符串

  • .content中间存的是字节码

一般来说 ,text直接用比较方便,返回的是字符串,但是,有时候会解析不正常,导致返回的是一堆乱码。这时需要用.content.decode('utf-8'),使其正常显示。

总的来说,text是现成的字符串,.content还要编码,但是.text不是所有时候显示都正常(需要用.content.decode()进行手动编码)

想要提取文本就用text,但是如果你想要提取图片、文件,就要用到content。

五、post方法实战

在post的请求方法中,它的形式参数存在两种,⼀种是json形式,还有⼀个是data形式。

json使用场景:请求数据格式是application/json

import requests
def login():
r
=requests.post(
url
="http://47.95.142.233:8000/login/auth/",
headers
={'Content-Type':'application/json'},
json
={"username":"13484545195","password":"asd888"})
return r.json()["token"]
print(login())

data使用场景:请求数据格式是表单

当为json类型时,如果使用data=,需要序列化处理该如何处理?

import requests
def login():
r
=requests.post(
url
="http://47.95.142.233:8000/login/auth/",
headers
={'Content-Type':'application/json'},
data
=json.dumps({"username":"13484545195","password":"asd888"}))
return r.json()["token"]
print(login())

六、参数传递

一般情况,想要实现参数传递的方法:

1、函数返回值
2、把动态参数写到一个文件里面,使用到的时候再读取(使用的较多)

a、函数返回值的方式:

import requests
import json

def login():
r=requests.post(
url="http://47.95.142.233:8000/login/auth/",
headers={'Content-Type':'application/json'},
data=json.dumps({"username":"13484545195","password":"asd888"}))
return r.json()["token"]
def index():
r=requests.get(
url="http://47.95.142.233:8000/interface/index",
headers={"Authorization":"JWT {token}".format(token=login())})
print(r.status_code)
print(r.json())
index()

b、读取的方式:

import requests
import json

def write(content):
with open(
"token", "w") as f:
f.write(content)
def read():
with open(
"token", "r") as f:
return f.read()
def login():
r
=requests.post(
url
="http://47.95.142.233:8000/login/auth/",
headers
={'Content-Type':'application/json'},
data
=json.dumps({"username":"13484545195","password":"asd888"}))
write(content
=r.json()["token"])
def index():
r
=requests.get(
url
="http://47.95.142.233:8000/interface/index",
headers
={"Authorization":"JWT {token}".format(token=login())})
print(r.status_code)
print(r.json())
login()
index()

 七、实战-风暴平台

import unittest
import requests
import json
# 将文件写入到filename里
def write(filename,content):
with open(filename,
"w") as f:
f.write(content)
# 读取文件filename的内容
def read(filename):
with open(filename,
"r") as f:
return f.read()
# 登录接口,将获取到的token,通过变量r,写入filename里
def login():
r
=requests.post(
url
="http://47.95.142.233:8000/login/auth/",
headers
={'Content-Type':'application/json'},
json
={"username":"13484545195","password":"asd888"})
return r
# 由于每次访问都会在头里调用token,那么将其分离出来,并且将文件名命名为:token
def headers():
return {"Authorization": "JWT {token}".format(token=read(filename="token"))}
# 添加产品的方法
def addProduct():
r
=requests.post(
url
="http://47.95.142.233:8000/interface/product/",
headers
=headers(),
json
={"name":"无涯课堂","product_type":"WEB","version":"1.0.0","master":"无涯","description":"this is a test data"})
# 从添加产品的接口里,获取了产品的id,把id写入到名为:productid的文件里
# 如果是int类型的要强制转换为str
write(filename
="productid",cOntent=str(r.json()["id"]))
return r
# 查询产品名称
def findProduct(findname):
r
=requests.get(
url
="http://47.95.142.233:8000/interface/products?name=findname".format(findname=findname),
headers
=headers()
)
return r
# 修改产品
def modifyProduct():
r
=requests.put(
url
="http://47.95.142.233:8000/interface/product/{productid}/".format(
productid
=read(filename="productid")),
headers
=headers(),
json
={"name":"接口产品","product_type":"WEB","version":"V1.0.1","master":"Rose","description":"this is an API product."}
)
return r
# 删除产品的方法,删除产品是没有参数的
def delProduct():
# 产品id的调用
r
=requests.delete(
url
="http://47.95.142.233:8000/interface/product/{productid}/".format(
productid
=read(filename="productid")),headers=headers(),
)
return r
class ApiTest(unittest.TestCase):
# 初始化动作,并且把登录接口获取到的token写到文件中去
def setUp(self)
-> None:
r
=login()
write(filename
="token",cOntent=r.json()["token"])
# 清理动作,什么都不做
def tearDown(self)
-> None:
pass
def test_index(self):
'''验证查看首页'''
r
=requests.get(
url
="http://47.95.142.233:8000/interface/index",
headers
=headers())
self.assertEqual(r.status_code,
200)
self.assertEqual(r.json()[
"count"]["api"],0)
def test_add_product(self):
'''测试产品的添加'''
r
=addProduct()
delProduct()
self.assertEqual(r.status_code,
201)
self.assertEqual(r.json()[
"name"],"无涯课堂")
def test_find_productMoren(self):
'''默认查询产品名称'''
addProduct()
r
=findProduct(findname="")
self.assertEqual(r.status_code,
200)
def test_find_productMohu(self):
'''模糊查询产品名称'''
addProduct()
r
=findProduct(findname="")
self.assertEqual(r.status_code,
200)
def test_find_productJingque(self):
'''精确查询产品名称'''
addProduct()
r
=findProduct(findname="无涯课堂")
self.assertEqual(r.status_code,
200)
def test_modify_productName(self):
'''修改产品的名称'''
addProduct()
r
=modifyProduct()
delProduct()
self.assertEqual(r.json()[
"name"],"接口产品")
def test_modify_productType(self):
'''修改产品的类型'''
addProduct()
r
=modifyProduct()
delProduct()
self.assertEqual(r.json()[
"product_type"],"WEB")
def test_modify_productVersion(self):
'''修改产品的版本'''
addProduct()
r
=modifyProduct()
delProduct()
self.assertEqual(r.json()[
"version"],"V1.0.1")
def test_modify_productMaster(self):
'''修改产品的负责人'''
addProduct()
r
=modifyProduct()
delProduct()
self.assertEqual(r.json()[
"master"],"Rose")
def test_modify_productDescription(self):
'''修改产品的描述'''
addProduct()
r
=modifyProduct()
delProduct()
self.assertEqual(r.json()[
"description"],"this is an API product.")
def test_del_product(self):
'''删除产品'''
addProduct()
r
=delProduct()
self.assertEqual(r.status_code,
204)
if __name__ == '__main__':
unittest.main()


推荐阅读
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • SAP接口编程PyRFC 调用 BAPI_FIXEDASSET_CREATE1创建固定资产
    本篇演示通过PyRFC调用BAPI_FIXEDASSET_CREATE1在SAP系统中创建固定资产,再一次体验一下Python与其它语言相比的简洁性。首先简单说明B ... [详细]
  • 使用Postman调试API遇到“400 Bad Request”问题
    问题今日使用Postman调试一个临时接手的API,参照调用程序代码填充好请求头、请求体参数(post),Postman客 ... [详细]
  • 背景后端使用Nginx并更改本地host文件,起本地服务。将aaa.bbbb.com代理至本地IP地址(10.26.36.156)。使用$.ajax调用后端restful接口,要求 ... [详细]
  • postmain报400_Postman测试@RequestBody发送请求时报400错误
    postman测试requestbody时碰到400错误图1原因:传参数如果不使用RequestBody,在使用Postman进行Post请求时,通常做 ... [详细]
  • 第一步:通过浏览器获取到接口url的请求参数,如下图的RequestPayload将此处的json请求粘贴出来;第二步,可 ... [详细]
  • postman参数配置
    一、postman概述1.1定义1、postman:一款功能强大的网页调试与发送网页HTTP请求的工具。2、测试集合collection:collection可以看作是reques ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • php实现用户注册登录界面的方法:1、创建log.php登录主界面;2、设置register.php注册主界面;3、通过mysqli_connect连接数据库并进行相应的数据操作即可。 ... [详细]
  • 那么多优秀的自动化测试工具,而你只知道Selenium?
    如今,作为一名软件测试工程师,几乎所有人都需要具备自动化测试相关的知识,并且懂得如何去利用工具,来为企业减少时间成本和错误成 ... [详细]
  • 测试工程师个人年终总结
    又到了年底的时候,对于中国的大部分企业而言,这是真正要踏入年关的时期了。对于IT人员来说,年末也是相对繁忙的一段时期,各个项目要在年前或上线,或收尾;还有一项重要的事项很多人需要去做,那就是 ... [详细]
  • 一、介绍:在测试和开发中,有一款API测试工具一直占据着武林盟主的地位,那就是声名远播的Google公司的Postman。Postman原先是Chrome浏览器的一个插件,后面发展 ... [详细]
  • Postman 调试 WebService
    Postman调试WebServiceWebServicePostman设置Headers请求头参数Body请求体传参返回结果WebService天气预报Web服务http:ww ... [详细]
  • PostmanforMac是一款老牌的API开发协作平台。帮助您简化构建API的每个步骤并简化协作,以便您可以更快地创建更好的API。Postman下载https: ... [详细]
author-avatar
mobiledu2502853587
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有