做接口测试时,token是经常会用到的参数,(例如,我们想要加入购物车,为什么点加入购物车按钮,商品会添加进我的购物车,而不是别人的购物车呢,其实就是用token或cookie来区分每个人的,所以token或cookie就是代表个人身份的数据了)我在这里只讲token,以后有合适的项目再给大家讲cookie。
需求:个人信息查询
接口:
取token,编写一个登录接口,存成一个文件,名称为:public.py:
import requests
import json
def login(): #登录
url = 'http://*****/api/login'
param = {
'loginName' : 'admin', #用户名
'loginPwd' : '123456' #密码
}
res = requests.post(url,params=param)
r = res.headers
#token = r['api-token'] #先把这个注释掉,我们先把返回值的headers取出来看一看
return (r)
print (login())
我做的这个项目取token的字段名称就叫api-token,具体的名称要根据不同的项目决定,不知道叫什么的话可以问开发。接下来就取消注释,直接return (token),如下
import requests
import json
def login(): #前台登录取token
url = 'http://*****/api/login'
param = {
'loginName' : 'admin',
'loginPwd' : '123456'
}
res = requests.post(url,params=param)
r = res.headers
token = r['api-token'] #这个api-token是因为返回值里叫这个名字,所以这里就取这个字段值
return (token) #这里返回的是token
#print (login())
以上就是取token的全过程,我们这个项目的token是在返回值的header里,也有在body里边的,如果在body里边就需要把代码中的 r = res.headers 改成 r = res.json(),然后再取字段值就可以了。
最后再调用个人信息查询接口,在这个接口里边把token传进去
编写一个用例文件test_case.py,内容如下:
import requests
import unittest
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')
sys.path.append('../') #这句是为了调用其他包添加的环境变量,如果调用的包在默认环境变量下就不需要写了
from public import * #引包,因为我把登录写在public里边了,想要用的话,需要引过来(可以理解为文件包含)
class Test_api(unittest.TestCase):
def setUp(self): #setUp里边是测试之前的准备工作
self.token = login() #调用public里边的登录,并接收返回的token,把这个调用程序放在setUp里边,是为了让这句话每次运行用例的时候都生效
def test_info(self):
'''个人信息查询'''
self.url = 'http://*****/api/wuser/info'
self.header = {
'api-token' : self.token #传token
}
self.res = requests.get(self.url,headers=self.header)
self.r = self.res.json()
self.assertEqual(200,self.r.get('code')) #断言
print (self.r)
def tearDown(self):
pass
if __name__=='__main__':
unittest.main()
能够有返回值说明token生效了。
备注:这里需要注意的一点是__init__.py 这个文件是引包必须要有的,也就是说,如果我想引用public.py,那就得保证public.py是个包才能被其他文件引用,只要在public.py所在的文件夹里边创建个__init__.py文件,就说明这是个包,可以被引用。另外init左右两边是两个下划线