python接口测试之tokensession的处理

使用python语言来进行实现,在这里我们使用第三方的库requests,需要单独的安装下,安装的命令是:

 pip  install -U requests

见安装的截图:

图片

安装成功后,如果可以在正常的导入,说明安装OK,见截图:

图片

      安装好requests好后,我们就可以开始了,关于requests有不清楚的,可以看Python接口测试之requests(七),这里我们直接来进行实战,我们再来进行回顾下我们需要做的事情,我们需要做的就是登录成功后,获取token,后面的接口都需要这个参数,所以我们需要把获取的token当作参数来进行传递,在这里我们来思考一个问题,在python的函数中,为什么会有返回值?返回值可以干什么?python中,函数的返回值是为了给另外一个函数传递参数,传递参数可以理解为是通过自动将对象赋值给本地变量名来实现。OK,下面我们就来使用实现这个过程,我们首先使用代码来实现登录的接口并且获取返回的json字符串,见实现的代码:

#!/usr/bin/env python 
#-*-coding:utf-8-*-

import requests

def getToken():
    r=requests.post(
        url='https://api.parkang.com/v20/login',
        json={"username":"apitoapi",
            "password":"8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92",
            "role":2},
        headers={'Content-Type':'application/json;charset=UTF-8',
                    'Parkingwang-Client-Source':'ParkingWangAPIClientWeb'},timeout=5)
    return r.json()

print getToken()

见执行函数getToken后获取的json字符串:

C:\Python27\python.exe D:/git/Python/UnitCI/blog/weke.py
{u'status': 0, u'msg': u'', u'data': 
{u'token': u'ma7uW5KiqKpBYPQ6kBI1514038085951', u'id': 600192, u'name': u'\u81ea\u52a8\u5316\u6d4b\u8bd5'}}

Process finished with exit code 0

我们可以看到,获取的内容是json字符串,经过反序列化后,数据类型是字典(dict),按字典的方式来获取token就很简单的,见获取token的代码:

#!/usr/bin/env python 
#-*-coding:utf-8-*-

import requests

def getToken():
    r=requests.post(
        url='https://ecapi.parkingwang.com/v4/login',
        json={"username":"autoapi","password":"8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92","role":2},
        headers={'Content-Type':'application/json;charset=UTF-8',
                    'Parkingwang-Client-Source':'ParkingWangAPIClientWeb'},timeout=5)
    return r.json()['data']['token']

见执行后,获取的token字符串,见截图:

图片

下面来实现infoGet接口的测试,依据前面的案例我们知道,该接口的参数就是token,而且必须是和登录成功后返回的token是一致,否则就会提示502的错误,token无效,我们来实现infoGet接口测试,见实现代码:

#!/usr/bin/env python 
#-*-coding:utf-8-*-

import requests

def getToken():
    r=requests.post(
        url='https://ecapi.parkingwang.com/v4/login',
        json={"username":"autoapi","password":"8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92","role":2},
        headers={'Content-Type':'application/json;charset=UTF-8','Parkingwang-Client-Source':'ParkingWangAPIClientWeb'},timeout=5)
    return r.json()['data']['token']


def infoGet():
    r=requests.post(
        url='https://ecapi.parkingwang.com/v4/infoGet',
        json={"token":getToken()},
        headers={'Content-Type':'application/json;charset=UTF-8','Parkingwang-Client-Source':'ParkingWangAPIClientWeb'},timeout=5)
    print r.json()


infoGet()

见执行infoGet函数后,返回的json字符串内容:

C:\Python27\python.exe D:/git/Python/UnitCI/blog/weke.py
{u'status': 0, u'msg': u'', u'data': {u'username': u'autoapi', u'online_agreement': 0, u'name': u'\u81ea\u52a8\u5316\u6d4b\u8bd5', u'valid_period': 0, u'id': 600192, u'phone': u'', u'pigeon_id': u'maLdrGaCEMAoS9kYW9t1514038531444', u'address': u'', u'supports': u'0', u'email': u'', u'park_code': 6666666666L}}

我们接着加一个接口,该接口为isSoonExpire,见测试该接口实现的代码:

#!/usr/bin/env python 
#-*-coding:utf-8-*-

import requests

def getToken():
    r=requests.post(
        url='https://ecapi.parkingwang.com/v4/login',
        json={"username":"autoapi","password":"8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92","role":2},
        headers={'Content-Type':'application/json;charset=UTF-8',
                 'Parkingwang-Client-Source':'ParkingWangAPIClientWeb'},timeout=5)
    return r.json()['data']['token']


def infoGet():
    r=requests.post(
        url='https://ecapi.parkingwang.com/v4/infoGet',
        json={"token":getToken()},
        headers={'Content-Type':'application/json;charset=UTF-8',
                 'Parkingwang-Client-Source':'ParkingWangAPIClientWeb'},timeout=5)
    print r.json()


def isSoonExpire():
    r=requests.post(
        url='https://ecapi.parkingwang.com/v4/isSoonExpire',
        json={"token":getToken()},
        headers={'Content-Type':'application/json;charset=UTF-8',
                 'Parkingwang-Client-Source':'ParkingWangAPIClientWeb'},timeout=5)
    print r.json()

下面我们对代码进行重构下,引入unittest,见重构后的代码:

#!/usr/bin/env python 
#-*-coding:utf-8-*-

import requests
import  unittest

class InterfaceTest(unittest.TestCase):
    def setUp(self):
        self.url='https://ecapi.parkingwang.com/v4/'
        self.headers={'Content-Type':'application/json;charset=UTF-8',
                      'Parkingwang-Client-Source':'ParkingWangAPIClientWeb'}
        self.timeout=5

    def tearDown(self):
        pass

    def getToken(self):
        r = requests.post(
            url=self.url+'login',
            json={"username": "autoapi", 
                  "password": "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92",
                  "role": 2},
            headers=self.headers, timeout=self.timeout)
        return r.json()['data']['token']

    def test_infoGet(self):
        '''验证:测试infoGet接口是否正确'''
        r = requests.post(
            url=self.url+'infoGet',json={"token": self.getToken()},
           headers=self.headers, timeout=self.timeout)
        print r.json()

    def test_isSoonExpire(self):
        '''验证:测试isSoonExpire接口是否正确'''
        r = requests.post(
            url='https://ecapi.parkingwang.com/v4/isSoonExpire',
           json={"token":self.getToken()},headers=self.headers, timeout=5)
        print r.json()

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

如上的接口测试用例缺少断言,在这里特别强调,没有断言的自动化测试用例是无效的,是没有任何的价值的。至于具体断言什么,得格局具体的接口测试的业务来进行,我们对如上的接口添加断言,见增加断言后的接口测试代码:

#!/usr/bin/env python 
#-*-coding:utf-8-*-

import requests
import  unittest
import  time as t

class InterfaceTest(unittest.TestCase):
    def setUp(self):
        self.url='https://ecapi.parkingwang.com/v4/'
        self.headers={'Content-Type':'application/json;charset=UTF-8',
                      'Parkingwang-Client-Source':'ParkingWangAPIClientWeb'}
        self.timeout=5

    def tearDown(self):
        t.sleep(1)

    def getToken(self):
        r = requests.post(
            url=self.url+'login',
            json={"username": "autoapi", 
                  "password": "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92",
                  "role": 2},
            headers=self.headers, timeout=self.timeout)
        return r.json()['data']['token']

    def test_infoGet(self):
        '''验证:测试infoGet接口是否正确'''
        r = requests.post(
            url=self.url+'infoGet',json={"token": self.getToken()},
           headers=self.headers, timeout=self.timeout)
        self.assertEqual(r.json()['status'],0)
        self.assertEqual(r.json()['data']['username'],'autoapi')

    def test_isSoonExpire(self):
        '''验证:测试isSoonExpire接口是否正确'''
        r = requests.post(
            url='https://ecapi.parkingwang.com/v4/isSoonExpire',
           json={"token":self.getToken()},headers=self.headers, timeout=5)
        self.assertEqual(r.json()['status'],0)
        self.assertEqual(r.json()['data']['expire'],False)

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

执行上面的测试用例后,我们发现二个测试用例都调用了getToken()方法,而getToken()方法我们知道是登录的接口,登录成功后获取token,言外之意也就是说登录了二次,缺点很明显,如果在N个测试用例,参数都需要token,都会调用getToken(),那么也会出现登录N次,很实现这个方法不是我们想要的,我们要实现的是不管有多少个接口测试用例,登录只能是一次,如果登录多次,会出现token无效502的问题,或者引起其他的问题,在这里我们把登录成功后的token存储在文件中,然后从文件中读取,这样就可以登录一次,见实现的代码:

#!/usr/bin/env python 
#-*-coding:utf-8-*-

import requests
import  unittest
import  time as t
import  os

def getHeaders():
    '''获取headers'''
    return {'Content-Type':'application/json;charset=UTF-8',
            'Parkingwang-Client-Source':'ParkingWangAPIClientWeb'}

def login():
    '''把token写入到文件中'''
    r = requests.post(
        url=self.url + 'login',
        json={"username": "autoapi", 
              "password": "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92",
              "role": 2},
        headers=getHeaders(), timeout=5)
    with open(base_dir(), 'w') as f:
        f.write(r.json()['data']['token'])


def base_dir():
    '''获取当前文件的目录'''
    return os.path.join(os.path.dirname(__file__), 'token.md')

def getToken():
    '''读取存储在文件中的token'''
    with open(base_dir(),'r') as f:
        return f.read()

class InterfaceTest(unittest.TestCase):
    def setUp(self):
        self.url='https://ecapi.parkingwang.com/v4/'

    def tearDown(self):
        t.sleep(1)

    def test_infoGet(self):
        '''验证:测试infoGet接口是否正确'''
        r = requests.post(url=self.url+'infoGet',
                          json={"token": getToken()},headers=getHeaders(), timeout=5)
        self.assertEqual(r.json()['status'],0)
        self.assertEqual(r.json()['data']['username'],'autoapi')

    def test_isSoonExpire(self):
        '''验证:测试isSoonExpire接口是否正确'''
        r = requests.post(url=self.url+'isSoonExpire',
                          json={"token":getToken()},headers=getHeaders(), timeout=5)
        self.assertEqual(r.json()['status'],0)
        self.assertEqual(r.json()['data']['expire'],False)

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

代码经过重构后,不管有多少个测试用例,我们的登录只会进行一次。接下来我们会写关于session这部分,python是如何解决的。

python处理session

     下面我们使用python来处理session的部分,下面我们来看一个例子,登录成功后,并没有返回token,只是返回了请求成功的code,而是存储session中,那么我们应该如何来获取session了,我们编写该登录的接口用例,看返回的json字符串是什么,见实现的代码以及输出的截图:

图片

在截图中我们看到,输出的json字符串只有code是200的,再没有什么,但是后面的请求都需要带上session,我们看下一个接口请求的内容,见截图:

图片

OK,那么就说明我们登录后必须得获取session,见获取session的代码:

图片

通过cookies.get_dict()就可以获取session,见如上截图中获取的session内容,下面的就很简单,我们在下一个接口用例中带上session,见实现的码:

图片

执行如上的代码后,我们发现代码错误,错误的原因是test_access_datas()函数没有带上登录成功后的session,所以导致错误,不带session,一般直接就跳转到了login的页面,让重新登录,那么如何解决了,我们只需要在test_access_datas()函数中,在接口请求中带上session就可以了,见修改后执行的代码:

图片

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/630902.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot实现医药管理系统项目【项目源码+论文说明】

基于springboot实现医药管理系统演示 摘要 计算机网络发展到现在已经好几十年了,在理论上面已经有了很丰富的基础,并且在现实生活中也到处都在使用,可以说,经过几十年的发展,互联网技术已经把地域信息的隔阂给消除了&…

嗨动PDF编辑器怎么对pdf修改?分享修改步骤

嗨动PDF编辑器怎么对pdf修改?PDF(Portable Document Format)格式因其跨平台、不易修改的特性,在日常工作和学习中得到了广泛的应用。然而,当需要对PDF文件进行修改时,许多人可能会感到困扰。此时&#xff0…

紫光展锐先进技术科普 | 工业互联网遇到5G,1+1>2?

随着工厂自动化的加速普及,如今我们可能经常看到这样的场景:在高温、潮湿、粉尘、腐蚀等恶劣环境作业场景,巡检机器人穿梭其中,工人们不必弯腰去搬沉重又危险的器件,而旁边会有一个个机械臂帮手平稳有序地完成好所有搬…

谷歌Google搜索广告开户流程与费用?

谷歌Google作为全球领先的搜索引擎,其广告平台——Google Ads,无疑是企业捕获潜在客户的黄金钥匙。想要在广阔的互联网海洋中精准航行,了解Google搜索广告的开户流程与费用至关重要。通过云衔科技的专业服务,让您的谷歌Google广告…

MPLS小实验

实验图: 实验要求: 要求使用MPLS技术,将实验通,并在实验结束后使用命令:tracert -v -a 看是否基于标签进行转发。 如上:在每台路由器上都有两个环回,一个用于模拟用户网段,一个用于M…

ubuntu CUDA 驱动更新,版本更新,多CUDA版本管理

1 新版本驱动下载 前面介绍过window CUDA驱动更新,但是对于ubuntu 的驱动更新,没有一键操作。 本人笔记本电脑n年前装的CUDA DRIVER仅支持到cuda10.2,实在无法满足这日新月异的科技更新。 左 旧的驱动版本 右 新下载的硬件支持的驱动版本&…

Zynq UltraScale+ MPSoC 配置存储器器件

Zynq UltraScale MPSoC 配置存储器器件 下表所示闪存器件支持通过 Vivado 软件对 Zynq UltraScale MPSoC 器件执行擦除、空白检查、编程和验证等配置操 作。 本附录中的表格所列赛灵思系列非易失性存储器将不断保持更新 , 并支持通过 Vivado 软件对其中所列…

LLM应用-prompt提示:让大模型总结生成思维导图

第一步:大模型生成markdown思维导图格式 例如:kimi 总结pdf文档案例: 生成的markdown格式: # 知识图谱的构建及应用 ## 一、知识图谱的构建 ### 1. 数据采集 - 来源:结构化数据库、半结构化网页、非结构化文本 - 预处…

Cache基本原理--以TC3xx为例(1)

目录 1.为什么要使用Cache 2.Memory与Cache如何映射 2.1 地址映射概设 3.小结 为什么要使用Cache?为什么在多核工程里要谨慎使用DCache?Cache里的数据、指令是如何与Memory映射? 灵魂三连后,软件工程师应该都会有模糊的回答&…

Python 机器学习 基础 之 监督学习 [ 核支持向量机 SVM ] 算法 的简单说明

Python 机器学习 基础 之 监督学习 [ 核支持向量机 SVM ] 算法 的简单说明 目录 Python 机器学习 基础 之 监督学习 [ 核支持向量机 SVM ] 算法 的简单说明 一、简单介绍 二、监督学习 算法 说明前的 数据集 说明 三、监督学习 之 核支持向量机 1、线性模型与非线性特征 …

战网国际服下载教程 暴雪战网客户端一键下载安装教程分享

战网国际服务平台,又名Battle.net环球版,是暴雪娱乐操作的跨国界游戏交流平台,它消除了地域的隔阂,向全球范围内的游戏爱好者提供服务。与仅服务于特定地区的版本不同,国际版赋予了玩家自由穿梭于暴雪众多标志性游戏的…

python怎么安装matplotlib

1、登陆官方网址“https://pypi.org/project/matplotlib/#description”,下载安装包。 2、选择合适的安装包,下载下来。 3、将安装包放置到python交互命令窗口的当前目录下。 4、打开windows的命令行窗口,通过"pip install"这个命令…

一种快速提升文件传输速度的方法

在面对网络条件不理想时,进行文件传输往往会导致传输速率的显著下降。为了克服这一难题,镭速软件特别引入了一系列创新的设置选项,旨在显著提升文件传输速率。通过这些优化措施,用户即使在网络不佳的情况下,也能享受到…

尝试使用官方jailhouse-images仓库运行jailhouse

jailhouse 的官方 demo 演示仓库 Demo and testing images: https://github.com/siemens/jailhouse-images 通过jailhouse 的官方 demo 演示仓库,可以直接编译出带有部署有jailhouse程序的Linux镜像,有多个目标平台的Linux镜像可选,也有在qe…

优秀测试的核心能力!2招高效定位分析BUG!

之所以写这一篇文章,是突然想起来曾经在测试过程中被开发嘲讽过,事情是这样的,当时发现了一个疑似前端的Bug就草草提交到了禅道,结果刚来的女前端看到了就有点生气地问我为啥不查清到底是前后端问题就直接派给她前端了&#xff0c…

IT革新狂潮:引领未来的技术趋势

方向一:技术革新与行业应用 当前现状: 量子计算:量子计算的研究正在加速,尽管目前仍处于初级阶段,但其在药物研发、加密技术和材料科学等领域的应用潜力已被广泛认可。 虚拟现实(VR)与增强现实…

python之pyQt5实例:树莓派+MPU6050采集数据

1、安装必要的软件包: sudo apt-get update sudo apt-get install python3-smbus python3-dev i2c-tools sudo apt-get install python3-smbus 2、确认I2C接口已经启用: 运行 sudo raspi-config 命令打开Raspberry Pi配置工具。 在菜单中选择 "…

EFCore_创建项目

添加依赖 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.Tools(Migration工具) 根据使用的DB添加对应依赖: SQL Server:Microsoft.EntityFrameworkCore.SqlServer 添加该依赖时可不添加Microsoft.EntityFrameworkCore,该依…

一文详细解析Google编码规范工具cpplint的下载安装与使用

目录 一、什么是cpplint 二、cpplint能实现的功能 三、cpplint的下载与使用 1、配置python环境 2、安装cpplint 四、cpplint常用命令讲解 1、常用命令查看 2、常用命令详解 3、命令使用方式 五、 cpplint的实用技巧 1、集成cpplint 1.1、修改调用接口. 1.2、直接把…

基于Spring封装一个websocket工具类使用事件发布进行解耦和管理

最近工作中,需要将原先的Http请求换成WebSocket,故此需要使用到WebSocket与前端交互。故此这边需要研究一下WebSocket到底有何优点和不可替代性: WebSocket优点: WebSocket 协议提供了一种在客户端和服务器之间进行全双工通信的…