python接口测试之token&session的处理(十四)

下面我们就来使用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://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()

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

如此,总结了使用postman,jmeter,python语言来处理token和session的问题,在这里一次性的进行总结

原文地址:https://www.cnblogs.com/jason89/p/9033889.html

时间: 2024-08-01 22:44:21

python接口测试之token&session的处理(十四)的相关文章

Python接口测试之moco

在现在的软件开发过程中,特别是app的部分,需要的很多数据以及内容,都是来自server端的API,但是不能保证 在客户端开发的时候,api在server端已经开发完成,专门等着前端来调用,理想的情况是前端在开发的时候,已经有人写 好了接口,直接调用就可以了,但是这仅仅是理想的情况,很多时候,现实总是比理想多一层思考和磨难,如果在前端开发 的时候,提供api的同学没有提供,那么怎么办?等待还是自己先开发,等待肯定是愚蠢的做法,那么自己开发怎么来解决 api提供数据的这个问题,那么使用mock就可

python接口测试之urllib2的应用(十五)

作者 无涯 在接口测试中或者说在网络爬虫中,urllib2库是必须要掌握的一个库,当然还有优秀的requests库,今天重点来说urllib2库在接口测试中的应用. urllib2定义了很多的函数和类,这些函数和类能够帮助我们在复杂情况下获取URLS的内容.这些情况包含了对headers的添加,cookie的处理,代理, 超时,鉴权等的处理.如果想详细的了解urllib2库,建议到官方查看,官方地址:https://docs.python.org/2/library/urllib2.html.查

python接口测试之401错误的分析和解决(十六)

作者 无涯 在接口的测试中,经常会遇到客户端向服务端发送一个请求,服务端返回401的错误,那么今天本文章就来说明在接口测试中如何分析以及解决该问题. 我们知道在HTTP返回的状态码中,401错误表示的是被请求的页面需要用户名和密码.401的错误详细的可以描述为:客户端发送请求抖到服务端, 页面需要验证服务端会返回401的错误,见如下的错误信息: 401 UNAUTHORIZED Headers Content-Type: application/jsonWWW-Authenticate: Bas

python接口自动化-token参数关联登录(登录拉勾网)

前言 登录网站的时候,经常会遇到传token参数,token关联并不难,难的是找出服务器第一次返回token的值所在的位置,取出来后就可以动态关联了 登录拉勾网 1.先找到登录首页https://passport.lagou.com/login/login.html,输入账号和密码登录,抓包看详情 找到token生成的位置 1.打开登录首页https://passport.lagou.com/login/login.html,直接按F5刷新(只做刷新动作,不输入账号和密码),然后从返回的页面找到

Python接口测试之对MySQL/unittest框架/Requests 的操作

单元测试支持测试自动化. 共享的安装程序和关闭代码测试. 聚合成集合,测试和报告框架从测试的独立性.单元测试模块提供可以很容易地支持这些素质的一组测试的类.关于unittest 测试框架建议可以到官方查看详细的说明以及演示的实例.unittest各个模块的关系为: #!/usr/bin/env python #coding:utf-8 import unittest class TestDiv(unittest.TestCase): def setUp(self): pass def tearD

python接口测试之序列化与反序列化(四)

作者 无涯 在python中,序列化可以理解为:把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式字符串解码为python数据对象. 在python的标准库中,专门提供了json库与pickle库来处理这部分. 先来学习json的库,导入json库很简单,直接import json,下面通过具体的实例来说明json库对序列化与反序列化的使用.json库的主要方法为: #!/usr/bin/env python#coding:utf-8import  jsonp

python接口测试之json模块的使用

json.dumps() json.loads() json.dump json.load 一.json.dumps() 将python字典类型转换成json对象 import json # Python 字典类型转换为 JSON 对象 data = { 'no' : 1, 'name' : 'Runoob', 'url' : 'http://www.runoob.com' } json_str = json.dumps(data) print ("Python 原始数据:", rep

python接口测试之日志功能

之前在简书中看了一篇关于日志功能的文档,供大家参考:https://www.jianshu.com/p/62f7b49b41e7 Python通过logging模块提供日志功能,所以直接导入即可 import logging 1.定义日志收集器,指定收集器的名称,返回logging对象 case_logger = logging.getLogger('case') 2.指定日志收集器的日志等级,NOTEST(0) DEBUG(10) INFO(20) WARNING(30) ERROR(40)

python接口测试之requests库(一)

一.requests库的安装 requests库作为第三方库,需要安装 cmd模式下,运行pip install requests 二.在学习如何发送请求之前,我们先来了解一下requests库,查看一下他有什么方法 print dir(requests) 三.模拟发送get请求 1.发送不带参数的get请求 r = requests.get('https://api.github.com/events') 返回的是一个response对象,该对象中包含的内容,通过dir(r) 2.发送带参数的