文章目录
- 问题描述
- 解决方案
- 注意事项
- 参考文章
问题描述
接口测试时,每次都需要手动登录获取token,先登录系统,从浏览器中复制token,再到apifox的接口上把token帖上去,然后才能去测试具体的接口;更麻烦的是,切换环境的时候,token也要换,又要把上面的步骤重做一遍。能不能在运行接口用例前自动完成登录获取token?
解决方案
使用Apifox进行接口测试,通过前置操作,创建公共脚本模拟登录,自动获取token并填充到接口请求头中,这样就可以实现每次调用接口自动登录获取最新token了。详细步骤如下:
- 定义环境变量。分别在开发环境和测试环境中设置登录的用户名及密码。
- 在项目设置>>公共脚本中新建脚本>>保存
脚本如下:// 定义用户名变量 var username; // 获取环境里变量:前置URL、用户类型 const baseUrl = pm.environment.get('BASE_URL'); const userType = pm.environment.get('userType'); // 根据用户类型的值取相应的用户名 switch (userType) { case '1': username = pm.environment.get('user01'); break; // 使用break关键字来阻止代码自动地向下一个case运行 case '2': username = pm.environment.get('user02'); break; default: //使用default关键词来规定匹配不存在时做的事情 username = pm.environment.get('user03'); }; // 定义登录url变量,根据前置URL的值取相应的登录地址 var loginUrl if (baseUrl == 'https://app-dev2.com') { loginUrl = 'https://dev.com/login/password'; } else { loginUrl = 'https://uat.com/login/password'; }; // 获取环境变量-密码 const password = pm.environment.get('password'); // 打印登录的用户名及密码 console.log('username/password>>>' + username + '/' + password); // 定义请求参数 var payload = { "username": username, "password": password, "grant_type": "password", "isVerify": "True" }; // 构造一个POST,body为json格式的请求 const loginRequest = { // 请求地址 url: loginUrl, // 请求方法 method: 'POST', // 请求头,写法1: header: [ 'Content-Type:application/json;charset=UTF-8', 'Accept-Language:zh-CN,zh;q=0.9', 'User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36' ], // 写法2: //header: { // "Content-Type":"application/json;charset=UTF-8", // "Accept-Language":"zh-CN,zh;q=0.9", // "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36" //}, // 请求体 body: { mode: 'raw', raw: JSON.stringify(payload) } }; // 发送请求 pm.sendRequest(loginRequest, function (err, res){ if (err) { console.log('err>>>' + err); } else { // 读取接口返回的json数据 var r_json = eval(res.json()); // 从json数据中提取token并打印 var login_token = r_json.datas.access_token; console.log('token>>>' + login_token); // 动态设置请求头token pm.request.headers.add({key: "Authorization", value: "Bearer " + login_token}); } });
- 在接口目录中添加前置操作>>选择公共脚本,添加步骤2创建好的公共脚本 >> 点击【保存】
- 运行目录下的接口用例,运行成功!成功实现全自动登录获取token!
注意事项
- 以 header: { xxx:xxx } 形式定义header会使发送到本地的http请求报错:“ERR_INVALID_HTTP_TOKEN”,同时http请求并不会到达本地。这可能与本地使用的若依框架有关。需要将header的形式改为 header: [ ‘xxx:xxx’ ] 或 header: ‘xxx:xxx’
- header缺少User-Agent会使若依框架在登录生成token时运行异常,需要添加header: [ ‘User-Agent:xxx’ ]
- 即使在脚本中将登录生成的 token 写入环境变量 ACCESS_TOKEN,该次接口调用也无法使用新的 token,使用的依然是上次设置的 ACCESS_TOKEN。需要将本次的 token 直接加入本次请求的请求头中:pm.request.headers.add({key: “Authorization”, value: "Bearer "+login_token}),注意一定要使用 {key: xxx, value: xxx} 的形式。
参考文章
Postman/Apifox接口测试——Pre-request自动登录
登录态(Auth)如何处理