接口测试--mock基础+requests请求+unittest封装--实战操作

        这里事清安,接口测试前面已经讲过一些,本篇主要以实战为准,让你也了解了解mock,因为本章所见的接口数据就是mock出来的。后续会详细的介绍mock。

        本篇的mock是博主写的py文件,所以,想实战的朋友可以添加博主微:qing_an_an,博主也有个交流群,可以备注进群哦,每天带你了解不同的知识点。

目录

前言

发送请求

提取token

session

auth鉴权

接口封装


前言

        主要以py中的mock数据为主要内容,所以学习前可以找博主拿去文件,文件免费提供!

        我们模拟写接口就会用到flask框架,我们直接上例题看一遍,后面的篇章会做详细的讲解:

from flask import Flask, request

# 初始化FLASK框架
# 不同的函数返回不同的数据,可以通过路由定位
app = Flask(__name__)

@app.route("/app/query", methods=['GET'])
def queryInfo():
    return "hello world"

if __name__ == '__main__':
    app.run(port=8080)

        运行后,直接访问http://127.0.0.1:8080/app/query就能在网页中看到hello world字样。而/app/query可以称为路由。访问方法我们指定GET方法。而route称之为路由函数,分为静态路径跟动态路径。各位可以自己在这里访问一下看看效果,端口号port是可以自改变的7777,8888都是可以的。

        先来个开胃菜,模拟一下请求,同时也感谢群友支持

import requests

url = 'http://127.0.0.1:5000/api/qingan/demo'
res = requests.get(url)
print(res.text)

         文件中我写了一些接口数据,所以学习之前可以联系博主拿到源文件运行之后学习。

发送请求

        我们先来用工具请求这个接口看看,这里我用的国产货之光ApiPost:

         上述如果设置的是data,那么你就需要在header中把下面的head内容加进去。我们可以看到这里是可以请求成功的。我们再来看看代码怎么写:

import requests

url = 'http://127.0.0.1:5000/api/qingan/login'
data = {
    "username": "admin",
    "password": "123456",
}
head = {"Content-Type": 'application/json'}
res = requests.post(url, json=data, headers=head)
print(res.json())

         这里因为我们转换了json格式,所以,头部信息这里可以不加也能请求成功。请求成功后我们可以看到返回信息中带了token,我们可以直接进行下一步的操作。

提取token

        上述的例子,我们直接来拿token,提取token肯定是要在请求后且还要是请求成功后才行才会有哦。

        token用于标识接口调用者的身份,凭证。简单来说,带了token你就可以免登录

        token一般放在请求头headers或者body参数中

        token一般由签名+时间戳组成,所以token可以是一次性的,也可以是一定时间范围内有效的

session

        提取token我们有其他的办法,使用session。通俗的讲,你使用session成功的登录了某个网站,那么session对象就会保存要携带的信息,如cookieheader等,如果再次使用该session对象对网站的其他网页访问(查看订单信息)时都会默认带上这些参数。        

        先来看看上述的例子怎么操作的:

import requests

url = 'http://127.0.0.1:5000/api/qingan/login'
data = {
    "username": "admin",
    "password": "123456",
}
head = {"Content-Type": 'application/json'}
se = requests.session()
res = se.post(url, json=data, headers=head)
print(res.json())

get_token = res.json()['token']
# 通过seesion会话获取token,不写入下面会访问失败
se.headers.update({'token': get_token})
print(se.headers)
url2 = 'http://127.0.0.1:5000/api/qingan/userList'
# 通过session可以不加头部,会自动添加头部信息
rres = se.get(url2)
print(rres.text)

        我们用requests库中的session对象来进行请求,session对象中也是可以发送post,get等请求的。下面我们还会介绍session对象的auth属性,接着看。

        在代码中我们提取了token并更新了头部信息,为了更加清晰的看出来,所以我加了一个打印,拿到代码的朋友请求之后就会看到头部信息中添加了token信息了。由此,这样我们发送下面的用户查询接口就能查询到了。

        如果不用session对象,普通的操作呢:

import requests

url = 'http://127.0.0.1:5000/api/qingan/login'
data = {
    "username": "admin",
    "password": "123456",
}
head = {"Content-Type": 'application/json'}
res = requests.post(url, json=data, headers=head)
print(res.json())

get_token = res.json()['token']
head['token'] = get_token
url2 = 'http://127.0.0.1:5000/api/qingan/userList'
rres = requests.get(url2,headers=head)
print(rres.json())

         二者呢,从代码上看下面的例子似乎是要少几行代码呢,嘿嘿,看个人需求自行选择吧。

        cookie就不用多说了吧,直接上示例吧,先给到你们示例网页,仅限于学习用,登录账号密码上面都有,禁止恶意刷哟。另注:项目如有侵权请联系博主删除登录-开源商城 | B2C商城 | B2B2C商城 | 三级分销 | 免费商城 | 多用户商城 | tpshop|thinkphp shop|TPshop 免费开源系统 | 微商城

import requests

url = 'http://www.testingedu.com.cn:8000/index.php?m=Home&c=User&a=do_login'
data = {
    "username":"13800138006",
    "password":"123456",
    "verify_code":"1111"
}
head = {"Content-Type": 'application/x-www-form-urlencoded'}
se = requests.session()
res = se.post(url,data=data,headers=head)
print(res.json())

url2 = 'http://www.testingedu.com.cn:8000/Home/Order/order_list.html'
rres = se.get(url2)
print(rres.text)

        一般我们想跳过cookie直接登录是需要获取cookie的,但是我们通过session对象直接登录,至于不用session对象跳过登录获取内容博主是写过一篇文章的:教你使用cookie登录_清欢无别事-CSDN博客各位可以做一个参考,相对而言session比较的简便一些。

        这里跟上述例子一样,session对象会自动携带这些信息,只要你用的是同一个变量去发起请求也可以称为session请求,成功响应后,再次用这个变量用于下一个接口请求,会自动添加进去。

auth鉴权

        auth鉴权,文件中也有写示例,auth鉴权跟加密有一定的关系,所以这里就将加密一起讲了。加密有很多种方式,如果你自己再网页种遇到这种了,如果你时间够,你很强倒也无所谓,不然就放弃吧,解密太繁琐了。

        先来看看这个网址,还是同样得话,仅限于学习:新榜

         这里可以看到密码是加密的,应该很多的网址都有设置加密,但是你不知道通过什么加密的。但是这也不影响我们访问它,注册了访问成功后,这里都会显示,所以,我们直接复制url:

         进入到postman,点击import导入:

         导入进去就能访问了,这里我是没有注册的,这里也是告诉各位一个访问的方法而已:

        那么看看我们自己的接口吧。我们先用postman来看看auth鉴权:

         请求后是可以看到请求成功的,如果你把password改了就会请求不到了。接着看下面的代码:

        先来看看加密部分:这里举例的是base64

import base64

username = 'admin'
password = 'qingan123456'
res = base64.b64encode(bytes(username,encoding='utf-8')).decode('ascii')
res1 = base64.b64encode(bytes(password,encoding='utf-8')).decode('ascii')
print(res,res1)
# 结果   YWRtaW4= cWluZ2FuMTIzNDU2

        那么这样子是不能够请求成功的,那么我们就需要改改:

import requests
import base64

username = 'admin'
password = 'qingan123456'
res2 = base64.b64encode(bytes(username,encoding='utf-8')+b":"+bytes(password,encoding='utf-8')).decode('ascii')

print(res2)
# YWRtaW46cWluZ2FuMTIzNDU2

        那么我们用加密的来用代码发起请求看看:

# -->>>清安<<<---
import requests

url = "http://127.0.0.1:5000/api/qingan/auth"

payload={}
headers = {
  'Authorization': 'Basic YWRtaW46cWluZ2FuMTIzNDU2'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)

# {
#   "code": 10200, 
#   "message": "Authorization success!"
# }

        如果你想时时加密,大可以将上面的加密过程改成input输入加密的方式。

        那么既然时auth鉴权,那么我们是不是可以通过requests库的session对象快速解决呢,简便这其中的过程:

url = "http://127.0.0.1:5000/api/qingan/auth"
sess = requests.session()
sess.auth = ('admin','qingan123456')
res = sess.request("POST",url)
print(res.json())

        结果就不贴出来了,跟上述的结果是一致的,答案是可以通过session对象来简便这其中的过程的。

上传文件

        项目地址:http://www.testingedu.com.cn:8000/index.php/home/Uploadify/imageUp/savepath/head_pic/pictitle/ban ner/dir/images.html

        直接看一波代码,上传文件接口倒也还算简单:

import requests

url = 'http://www.testingedu.com.cn:8000/index.php/home/Uploadify/imageUp/savepath/head_pic/pictitle/ban ner/dir/images.html'
files = {
    'file':(
        'qing.jpg', # 文件名称
        open(r'F:\qing.jpg','rb'), # 文件路径
        'image/jpg' # 文件类型
    )
}
data = {
    "name":"qing.jpg"
}
res = requests.post(url, data=data,files=files)
print(res.json())

        响应信息一般都以json格式查看,但是也有其他的情况用text的,这取决于文档。不然就看自己经验来了。

接口封装

        封装也是以mock的数据来进行的,所以,各位尽量拿到文档了再查阅本文哦。

        直接贴代码一点点解析:

# -->>>清安<<<---
import requests

class HttpClientRequest():
    def __init__(self):
        # 创建会话
        self.session = requests.session()
        self.url_pre = 'http://127.0.0.1:5000/api/qingan/'

    def init_headers(self, head=None):
        self.head = {"Content-Type": 'application/json'}
        if head:
            self.session.headers.update(head)

    def SendRequest(self, method, url, **kwargs):
        self.url = self.url_pre + url
        # print(kwargs)  #{'json': {'username': 'admin', 'password': '123456'}}
        self.data = None
        if 'json' in kwargs:
            self.data = kwargs['json']  # {'username': 'admin', 'password': '123456'}
        self.res = self.session.request(method=method, url=self.url, json=self.data)
        self.response = self.res.json()

        # 提取响应结果中的值  --token:
        if 't_token' in kwargs:  # {'json': {'username': 'admin', 'password': '123456'}, 't_token': 'token'}
            self.val = kwargs['t_token']  # 'token'
            self.get_token = self.response[self.val]

            # token追加到请求头中去
            # self.session.headers.update({self.val:self.get_token})
            self.init_headers({self.val: self.get_token})

        return self.response

        这里写的是一个方法类,__init__用了session对象,也默认了一个url地址前缀,因为写的mock数据基本都是以这个为前缀的,所以直接写在初始化中了。这里不影响。

        init_headers默认值为none空值,如果有值需要更新时就更新进去,这里距离就是需要调取的token值。如果有的话就更新进去便于后续调用。

        SendRequest发送请求,先进行url的拼接,给定data为一个空值,判断是否为json格式,如果是,就将值提取出来,随后发起请求。

        而后续我们为了后面的接口顺利的接着前面的接口发起请求,所以我们需要提取token,提取完token我们需要将它更新到头部参数中去,**kwargs可以接收多个值,所以我们需要判断t_token是否传过来了,如果传过来了就用变量接收token,self.get_token也是我们的一个变量,用于接收提取出来的token对应的值。随后,就有了后续我们的self. init_headers此用处就不用多说了吧,加入到头部参数用于后面的请求。

# -->>>清安<<<---
import unittest
from httpapi import HttpClientRequest

class HuaceTestCase(unittest.TestCase):
    @classmethod
    def setUpClass(self) -> None:
        self.request = HttpClientRequest()

    def test01(self):
        '''成功登录接口'''
        data = {
            "username": "admin",
            "password": "123456"
        }
        self.res = self.request.SendRequest(method='post', url='login', json=data, t_token='token')
        print(self.res)

    def test02(self):
        '''用户信息查询接口'''
        self.res = self.request.SendRequest(method='get', url='userList')
        print(self.res)

if __name__ == '__main__':
    unittest.main()

         用例文件我用的是unittest写的。用的是实例化的方法,这里其实没啥好说的了,就是传数据,然后另一边接收这边传过的数据,做出一系列的判断,调用方法,提取值。最后发起请求。得到我们理想的结果。

        主要是前面的方法篇,而不是这里,这里是需要划分主次关系的。

  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清安无别事

慢慢的积累一杯奶茶吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值