python接口测试之tokensession的处理

news2024/12/22 18:37:43

使用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就可以了,见修改后执行的代码:

图片

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 通过关键字查找文件

按文件名查找 find 路径 -name “文件名” 查找当前目录下的所有mk文件 find . -name "*.mk"按关键字查找 find 路径 -name “文件名” | xargs grep -n “关键字” 参数: xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具 -n…

macOS Ventura 13如何设置定时重启(命令行)

文章目录 macOS Ventura 13如何设置定时重启(命令行)前言具体设置步骤及命令解释其他 macOS Ventura 13如何设置定时重启(命令行) 前言 由于升级 macOS 13 Ventura 之后,之前在节能里面通过鼠标点击设置开机关机的方法不能用了,现在只能用命令设置开机…

视频下载器 - 网页视频自动嗅探2.2.4

【应用名称】:视频下载器 - 网页视频自动嗅探 【适用平台】:#Android 【软件标签】:#Video #Downloader 【应用版本】:2.2.4 【应用大小】:33MB 【软件说明】:软件升级更新。支持多种格式的看片神器&am…

一.使用MySQL Workbench连接mysql数据库

一.使用MySQL Workbench连接数据库 MySQL Workbench这是MySQL官方主推的数据库可视化工具。 它提供了管理MySQL数据库,设计模型,进行SQL开发和管理的功能。主要功能包括: 数据库设计:可以通过直观的GUI创建EER模型,生成数据库结构。 SQL开发:提供代码编辑器,可以方便编写和执行…

番外篇 | 一文读懂卷积神经网络(CNN)的基础概念及原理

前言:Hello大家好,我是小哥谈。卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,主要用于图像识别和计算机视觉任务。本文旨在对卷积神经网络进行详细的讲解,从基本原理到实际应用,帮助读者全面了解CNN的工作原理、优势和基本组成等,以及其在现实生…

绝地求生:29.2商城更新内容预览:挣脱尘网通行证,经典皮肤返场,空投活动

就在今天历经9小时维护,29.2版本终于上线,柠檬茶带大家一起看看,这次游戏里都更新了哪些内容吧。 挣脱尘网通行证 豪华版:$14.99 普通版:$4.99 豪华版比普通版多10级升级券和2套生存者宝箱 分支一 分支二 分支三 额外…

java入门1.1.2

前言: 第一:一坨垃圾的迭代,还是垃圾 第二:本内容为对类,对象,构造函数的最新抽象理解 正片 先将类,对象,还要构造函数翻译成英文 class,object,construc…

【氮化镓】高电容密度的p-GaN栅电容在高频功率集成中的应用

这篇文章是香港科技大学Kevin J. Chen等人与台积电M.-H. Kwan等人关于高电容密度的p-GaN栅电容在高频功率集成中的应用研究。 文章详细介绍了p-GaN栅电容的设计、特性和在高频功率集成中的应用。通过实验数据和理论分析,文章展示了p-GaN栅电容在实现高电容密度、低…

ChatGpt生成网页应用,实现上传文件到服务器并保存上传记录的功能

使用 HTML 和 JavaScript 实现文件上传功能 1. 简介 在现代 web 开发中,实现文件上传功能是一个常见的需求。本文将介绍如何使用 HTML、CSS 和 JavaScript 创建一个支持 .obj 和 .jpg 文件上传的网页应用,并且展示上传进度以及上传完成后的文件信息。用…

AMD W7900本地大型语言模型的微调

GenAI-contest/01-LLM_Fine-tuning at main amd/GenAI-contest (github.com) 大型语言模型(LLMs)在大量的文本数据上进行训练。因此,它们能够生成连贯且流畅的文本。Transformer架构是所有LLMs的基础构建块,它作为底层架构&…

EasyCVR智慧校园建设中的关键技术:视频汇聚智能管理系统应用

一、引言 随着信息技术的迅猛发展,智慧校园作为教育信息化建设的重要组成部分,对于提升校园安全、教学效率和管理水平具有重要意义。本文旨在介绍智慧校园视频管理系统的架构设计,为构建高效、智能的校园视频监控系统提供参考。 二、系统整…

Spring-Cloud 微服务

1. 微服务架构 1.1 单体应用架构---内部项目【OA WMS等】 将项目所有模块(功能)打成jar或者war,然后部署一个进程 优点: 1:部署简单:由于是完整的结构体,可以直接部署在一个服务器上即可。 2:技术单一:项目不需要复杂的技术栈,往往一套熟悉的…

某能源集团电力公司搭建数据报表中心,实现采集填报分析一体化

​在当今这个信息爆炸的时代,数据已成为企业最宝贵的财富,越来越多的企业开始重视数据的积累和归集。在企业日常生产和工作过程中,会产生绵延不断的数据,但这些数据往往没有统一的记录、归纳和整理,或者录入了系统却分…

linux中远程服务器上传输文件的10个sftp命令示例

目录 1. 如何连接到 SFTP 2. 帮助 3.检查当前工作目录 4. 使用 sftp 列出文件 远程 本地 5. 使用 sftp 上传文件 6. 使用 sftp 上传多个文件 7. 使用 sftp 下载文件 8. 在 sftp 中切换目录 远程 本地 9. 使用 sftp 创建目录 10. 使用 sftp 删除目录 11. 退出 sf…

【UE Niagara】在UI上生成粒子

效果 步骤 1. 在虚幻商城中将“Niagara UI Render”插件安装到引擎 2. 打开虚幻编辑器,勾选插件“Niagara UI Renderer”,然后重启编辑器 3. 先创建一个控件蓝图,该控件蓝图只包含一个按钮 这里设置尺寸框尺寸为200*50 4. 显示该控件 5. 新…

代数拓扑学

啊,哈喽,小伙伴们大家好。我是#张亿,今天呐,学的是代数拓扑学 代数拓扑学是拓扑学中主要依赖 [1]代数工具来解决问题的一个分支。同调与同伦的理论是代数拓扑学的两大支柱(见同调论,同伦论)。 …

复杂json解析(其中有一个key的value是json格式的字符串)

app上报的参数如下: {"clientId": "8517895440514039afcf6d3e5d7832ae","dua": "SNDOCKCJPH90_GA&VN900042418&BN0&VCXiaomi&MOM2012K11AC&RL1080_2239&CHIDunknown_unknown&LCID&RV&OSAndroid13&…

LeetCode题练习与总结:交错字符串--97

一、题目描述 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串: 示例 1: 输入:s1 "aa…

SketchUp Pro 2024 mac草图大师 激活版 专业的3D建模软件

对于追求专业、高效的设计师们来说,SketchUp Pro 2024 for Mac无疑是最佳的选择。它提供了线条、形状、曲线、文本和图像等多种建模元素,让您能够根据需求自由创作。同时,软件还支持智能标注和尺寸功能,让建模过程更加精确、高效。…