我正在使用 k6 创建一个 perf 脚本。为此,需要生成 oAuth2 令牌。但通过以下实施,我收到了
ERRO[0003] TypeError: Cannot read property 'access_token' of undefined
当我在邮递员中尝试时,其他所有内容(例如 client_id、client_secret)都是正确的。不知道出了什么问题。
如果我生成一次令牌,然后在未来的方法中使用创建的令牌,那就更好了
这是我尝试过的代码。
import http from 'k6/http';
import { htmlReport } from 'https://raw.githubusercontent.com/benc-uk/k6-reporter/2.4.0/dist/bundle.js'
import { textSummary } from 'https://jslib.k6.io/k6-summary/0.0.1/index.js'
import { Trend } from 'k6/metrics';
export const options = {
discardResponseBodies: true,
scenarios: {
getItems: {
executor: 'constant-arrival-rate',
exec: 'getItems',
duration: '1m',
rate: 1,
preAllocatedVUs: 2,
timeUnit: "1s",
},
getItemsExport: {
executor: 'constant-arrival-rate',
exec: 'getItemsExport',
duration: '1m',
rate: 1,
preAllocatedVUs: 2,
timeUnit: "1s",
},
postItemsSummary: {
executor: 'constant-arrival-rate',
exec: 'postItemsSummary',
duration: '1m',
rate: 1,
preAllocatedVUs: 2,
timeUnit: "1s",
},
},
summaryTrendStats: ["min", "max", "avg","med", "p(90)", "p(95)","p(99)", "count"],
};
let requestTrend1 = new Trend('Request1')
let requestTrend2 = new Trend('Request2')
let requestTrend3 = new Trend('Request2')
//token generation
function getAccessToken() {
const clientId = '';
const clientSecret = '';
const tokenUrl = 'https://token_creator.com/oauth2/token';
let body = "grant_type=client_credentials&client_id=" + clientId + "&client_secret=" + clientSecret;
var res = http.post(tokenUrl, body, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } });
var result = JSON.parse(res.body);
var token = result.access_token;
return token;
}
//get Items
export function getItems() {
console.log("Executing getItems ")
const token = getAccessToken();
const apiUrl = 'https://local.com/v1/items?site2';
const headers = {
Authorization: `Bearer ${token}`,
Connection: `keep-alive`
};
const response = http.get(apiUrl, { headers });
// console.log(`Response status: ${response.body}`);
console.log(`Response status: ${response.status}`);
requestTrend1.add(resp.timings.duration)
sleep(1);
}
//get Items export
export function getItemsExport() {
const token = getAccessToken();
const apiUrl = 'https://local.com/v1/items/export?offset=0&limit=200&site=1';
const headers = {
Authorization: `Bearer ${token}`,
Connection: `keep-alive`
};
const response = http.get(apiUrl, { headers });
// console.log(`Response status: ${response.body}`);
console.log(`Response status: ${response.status}`);
requestTrend2.add(resp.timings.duration)
sleep(1);
}
export function postItemsSummary() {
console.log("Executing postItemsSummary ")
const token = getAccessToken();
const apiUrl = 'https://local.com/v1/items/summary';
const payload = JSON.stringify([{
site_id: "056",
supc: "4212791"
}])
const headers = {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
};
const response = http.post(apiUrl,payload, { headers });
console.log(`Response status: ${response.status}`);
requestTrend3.add(resp.timings.duration)
sleep(1);
}
export function handleSummary(data) {
return {
'k6summary.html': htmlReport(data, { debug: false }),
stdout: textSummary(data, { indent: ' ', enableColors: true }),
}
}
如果一切顺利,您确实应该拥有一处带有
access_token
的房产。但这仅当您的响应正文包含“访问令牌”时才有效。您可以通过打印响应正文来验证脚本的输出吗?即 console.log(res.body);
因为我的猜测是您没有收到令牌。
let body = "grant_type=client_credentials&client_id=" + clientId + "&client_secret=" + clientSecret;
var res = http.post(tokenUrl, body, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } });
// print response to verify access_token is retrieved
console.log(res.body);
// print response to verify access_token is retrieved
var result = JSON.parse(res.body);
var token = result.access_token;
return token;