YAPI是团队内在做部门的研发效能提升时,找到的一款比较好的开源组件 https://hellosean1025.github.io/yapi/
他支持“接口管理”以及“单接口测试”、“多接口的集成测试”,还有周期性的“自动化测试”,我们团队引入后,对其做了存储通用性,以及SSO方面的扩展,插件位于Npm,大家可搜索"yapi-plugin-pl"找到相关插件 https://www.npmjs.com/search?q=yapi-plugin-pl
关于平台的使用,可以参考官方文档,本篇文章针对使用Yapi做API测试时,期望对每条请求增加特定算法的签名参数(header或者body中),尤其是实时签名,提供了特别好的解决方案。
Yapi是使用NodeJS来开发的,所以只要会基本js的人差不多都能看懂它。当然,下面说的脚本,也都是指用js编辑的,优雅点的话,最好使用es6的写法来写。
Yapi对所有做测试时发出的请求,以及收到的返回结果,都对外暴露了一种用脚本(可以是一大长串代码块执行某种逻辑,最后把值赋给请求或者响应中的参数)来修改它们的方式:
script的暴露是跟随一个project的。所以,这个项目下的所有请求,无论在单独“发送”或是集合测试时候,每一条请求都会执行这里的脚本。
https://hellosean1025.github.io/yapi/documents/project.html#%E9%85%8D%E7%BD%AE%E7%8E%AF%E5%A2%83
官方文档中关于这里的说明可以总结为:
1、yapi的api请求信息在公共变量context里(每一个API都会有自己的context, 所以context指的就是当前执行到的那个API)
context = {
pathname: '/api/user',
query: {
id: 1
},
requestHeader: {
xxx: 'xxx'
},
method: 'POST',
requestBody: {
type:1
},
responseData: {
a:1
},
responseHeader: {
content-type: 'application/json'
...
}
}
2、那么在脚本中拿到他的方式就是:
API请求Path ---context.pathname
API请求Query ---context.query.xxx
API请求Header---context.requestHeader.xxx
API请求Method---context.method
API请求Body ---context.requestBody.xxx
API响应Header---context.responseHeader.xxx
API响应Body ---context.responseData.xxx
https://hellosean1025.github.io/yapi/documents/project.html#%E9%85%8D%E7%BD%AE%E7%8E%AF%E5%A2%83
1、还是官方文档的说明,里面的“工具函数"提供了简单的说明
对比此次举例的腾讯云V3签名的NodeJS版本,发现也是crypto来完成的,
https://cloud.tencent.com/document/api/400/41661#NodeJS
而Yapi暴露的方式里是使用CryptoJS来做的,所以基本上只要掌握了CryptoJS如何使用即可达到目的
2、CryproJS在Yapi里如何引用
Yapi的文档里给了一个这样的用法说明,但很显然对于腾讯云签名这件事来说,肯定不足够。
var ciphertext = context.utils.CryptoJS.****
于是更多的用法在这里 https://github.com/brix/crypto-js/
还有这里https://cryptojs.gitbook.io/docs/
本过程只为表明方法可行性(核心签名算法是否能走通),不包含完整的签名流程,完整流程可参考此处自行补充(其他流程大都是字符串拼接,参数排序,可直接查询js语法编写)。
目标是验证可行性,那么对“签名串生成工具”打印出的过程参数,我们采取写死的方式,作为Yapi脚本签名算法的输入,期望是Yapi得出的签名串和“签名串生成工具”签名值一样。
Yapi→Group→Project→设置→请求配置
将一些值写死到脚本里,其中参数的命名和官方nodejs算法中保持一致致 https://cloud.tencent.com/document/api/400/41661#NodeJS
下面的代码是方便大家copy用的
function sha256(message, secret = '',encoding) {
const hmac = context.utils.CryptoJS.HmacSHA256(message,secret);
if (encoding === 'hex'){
return hmac.toString(context.utils.CryptoJS.enc.Hex);
}
return hmac;
}
function getHashHex(message) {
const hash = context.utils.CryptoJS.SHA256(message);
return hash.toString(context.utils.CryptoJS.enc.Hex);
}
恭喜,你已经掌握了Script的精髓,可以接着自行完善啦!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。