在PC端登录公司的后台管理系统或在手机上登录某个APP时,经常会发现登录成功后,返回参数中会包含token,它的值为一段较长的字符串,而后续去请求的请求头中都需要带上这个token作为参数,否则就提示需要先登录。
这其实就是状态或会话保持的第三种方式token
。
一. 什么是token
token 由服务端产生,是客户端用于请求的身份令牌。第一次登录成功时,服务端会生成一个包含用户信息的加密字符串token,返回给客户端并保存在本地,后续客户端只需要带上token进行请求即可,无需带上用户名密码。
token原理简单概括如下:
-
用户首次登录成功后,服务端会生成一个token值,服务端会将它保存保存在数据库中,同时也会将它返回给客户端;
-
客户端拿到token值后,保存在本地;
-
后续客户端再次发送除登录外的其他请求时,会把保存在本地的token值作为参数一起发送给服务端;
-
服务端收到客户端的请求后,会拿发送过来的token值与保存在数据库中的token值进行比较;
-
如果两个token值相同, 则说明当前用户处于登录状态;
-
如果数据库中没有这个token值或者token值已经生效,则需用户重新登录。
二. token场景处理
公司某管理后台系统,登录后返回token,接着去请求其他接口时请求头中都需要加上这个token,否则提示请先登录。
请求该系统的登录接口如下:
# @author: 给你一页白纸
# 微信公众号:测试上分之路import requests
import jsonheaders = {"Content-Type": "application/json;charset=utf8"}
url = "http://127.0.0.1:5000/login"
_data = {"username": "刘德华","password": "123456"
}
res = requests.post(url=url, headers=headers, json=_data).text
print(res)
结果如下:
{"code": 1000, "msg": "登录成功!", "token": "sh34ljjl08s32730djsh34ljjl08s32730djsh34ljjl08s32730djsh34ljjl08s32730djsh34ljjl08s32730djsh34ljjl08s32730dj"
}
在对扎样的项目做接口自动化测试时,需要先请求登录接口拿到token,再去请求别的接口。每次请求其他接口时先请求一次登录接口,这样做虽然可行,但这样不仅会降低自动化的执行效率,而且每次都请求登录也会对服务器资源造成浪费。
这里介绍如下两种处理思路。
自动化测试相关教程推荐:
2023最新自动化测试自学教程新手小白26天入门最详细教程,目前已有300多人通过学习这套教程入职大厂!!_哔哩哔哩_bilibili
2023最新合集Python自动化测试开发框架【全栈/实战/教程】合集精华,学完年薪40W+_哔哩哔哩_bilibili
测试开发相关教程推荐
2023全网最牛,字节测试开发大佬现场教学,从零开始教你成为年薪百万的测试开发工程师_哔哩哔哩_bilibili
postman/jmeter/fiddler测试工具类教程推荐
讲的最详细JMeter接口测试/接口自动化测试项目实战合集教程,学jmeter接口测试一套教程就够了!!_哔哩哔哩_bilibili
2023自学fiddler抓包,请一定要看完【如何1天学会fiddler抓包】的全网最详细视频教程!!_哔哩哔哩_bilibili
2023全网封神,B站讲的最详细的Postman接口测试实战教学,小白都能学会_哔哩哔哩_bilibili
1. 思路一
在执行用例之前,先请求登录接口,并将返回的token值存储在文件中(如yaml文件),后续请求需要用到token值则从该文件。
python中yaml文件
1,运行接口自动化测试框架,初始化时先请求登录接口,获取token值,并写入指定的yaml文件中。
# @author: 给你一页白纸
# 微信公众号:测试上分之路import requests
import json
import yamldef get_token():'''请求登录接口,获取token:return:'''headers = {"Content-Type": "application/json;charset=utf8"}url = "http://127.0.0.1:5000/login"_data = {"username": "刘德华","password": "123456"}res = requests.post(url=url, headers=headers, json=_data).textres = json.loads(res)token = res["token"]return tokendef write_yaml(token):'''写入yaml文件:return:'''t_data = {"token": token}with open("yaml文件路径", "w", encoding="utf-8") as f:yaml.dump(data=t_data, stream=f, allow_unicode=True)if __name__ == '__main__':token = get_token() # 获取tokenwrite_yaml(token) # 将token值写入yaml文件
2,执行测试用例时先读取yaml文件中token值,并将token加入headers中(也有些是将token放在请求参数中,视被测试项目具体情况而定),再发送请求。
# @author: 给你一页白纸
# 微信公众号:测试上分之路import requests
import yaml
import pytest
import jsondef read_yaml():'''读yaml文件:return:'''with open('yaml文件路径', 'r', encoding='utf-8') as f:result = yaml.load(f.read(), Loader=yaml.FullLoader)token = result["token"]return tokendef test_check_user():'''查询个人信息(需要先登录系统):return:'''# 先从yaml文件中读取tokentoken = read_yaml()# 再将token添加到请求头中headers = {"Content-Type": "application/json;charset=utf8","token": token}url = "http://127.0.0.1:5000/users/3"res = requests.get(url=url, headers=headers).text# 返回结果为json格式,转换为字典res = json.loads(res)# 断言code是否为1000assert res["code"] == 1000if __name__ == '__main__':pytest.main()
这里仅仅只是举例说明,而在实际的框架中,我们需要把这些诸如yaml文件的读写这样的函数单独封装在某个模块中,供其他模块调用,这样会代码会更加清晰简洁。
2. 思路二
利用pytest中的Fixture函数,作用域设置为session,并返回token值,后续测试方法/函数调用该Fixture函数。
pytest中Fixture的使用请参考我之前的文章pytest(6)-Fixture(固件)。
1,首先,在conftest中定义一个作用域为session的Fixture函数,用于请求登录接口返回token。
# @author: 给你一页白纸
# 微信公众号:测试上分之路import pytest
import requests
import json@pytest.fixture(scope="session")
def get_token_fixture():'''作用域为session的fixture函数,返回token:return:'''headers = {"Content-Type": "application/json;charset=utf8"}url = "http://127.0.0.1:5000/login"_data = {"username": "刘德华","password": "123456"}res = requests.post(url=url, headers=headers, json=_data).textres = json.loads(res)token = res["token"]return token
2,接着,测试用例调用该Fixture。
def test_check_user(get_token_fixture):'''查询个人信息(需要先登录系统):return:'''# 通过Fixture函数g获取et_token_fixture值,即token,再将token添加到请求头中headers = {"Content-Type": "application/json;charset=utf8","token": get_token_fixture}url = "http://127.0.0.1:5000/users/3"res = requests.get(url=url, headers=headers).textres = json.loads(res)print(res)print(headers)assert res["code"] == 1000if __name__ == '__main__':pytest.main()
执行测试用例结果如下:
说明思路二也是可行的,当然这里只执行了一条测试用例,如果执行很多的用例,效果会是怎样还没去验证,大家可以试试看。
三. 总结
- 相对于Session/Cookies来说,请求量较大或者涉及第三方接口的系统,使用token更适合。
- 有些项目token是放在请求头中发送的,而有一些项目则是放在请求参数里发送的,做接口自动化时要明确是哪种方式。
- 接口自动化处理token时这两种思路可任选一种,如果使用pytest框架的话建议尝试思路二。
-
总结:
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。
如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步
在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。
我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,
测试开发视频教程、学习笔记领取传送门!!