性能测试工具选择上,目前已经几乎都使用 K6,用于目前的性能测试工作也进行的比较顺利。(locust、jMeter 已经被我先丢在一边了)
所以这里也安利大家一波,k6+influxdb+grafana 是相当不错的选择。
这里主要分享一下 k6 的前置后置处理、cookiejar 的使用。这个 K6 的官方帮助文档上都有例子,但两者结合实现 “setup function 中登录,default function 中运行具体 http 接口” 没有具体的例子(因为 cookieJar 不能定义在 init 部分),这里就给出一个例子分享:
import http from 'k6/http';
import {check,sleep} from 'k6'
export const options={
insecureSkipTLSVerify: true,
// stages: [ // 运行场景配置:10s内vu从0增长到20;20个vu持续运行20s;10s内20个vu减少到0
// { duration: '10s', target: 20 },
// { duration: '20s', target: 20 },
// { duration: '10s', target: 0 },
// ],
}
const apiUrl="https://xxx.xxx.com/api/v1/product"
// 具体测试的api的url
// const cookieJar = http.cookieJar() //此处不能定义cookieJar,它不能定义在init部分
export function setup(){
console.log("运行开始")
let res=http.post(
'https://login.xxx.com/login',
{
loginName: 'xxx@xxx.com',
password:'xxxxxx'
},
{
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
redirects:-1
},
) // 提交一个登录请求
if(res.status!==200 || !res.json() || res.json().code!=="1"){
throw new Error("登录失败");
} // 登录结果判断
const cookieJar = http.cookieJar()
return cookieJar.cookiesForURL(apiUrl); // 通过cookieJar中将测试的api需要的cookie取出来
}
export default function (data){ // 具体的测试任务,data的值来自于setup()的返回回调
const cookieJar = http.cookieJar()
for(let ck of Object.entries(data)){ // 将api需要的cookie依次写入cookieJar中
cookieJar.set(apiUrl,ck[0],ck[1][0])
}
let res=http.get(
apiUrl,
)
check(res, {
'状态码(含重定向)是否200': (r) => r.status == 200,
'响应内容是否为json': (r) => !!r.json(),
'接口响应成功': (r)=>r.json().code==='1'
});
}
export function teardown(data){
console.log("运行完成")
}