k6 性能测试中的令牌生成

问题描述 投票:0回答:1

我正在使用 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 }),
  }
}



javascript performance performance-testing k6
1个回答
0
投票

如果一切顺利,您确实应该拥有一处带有

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;
© www.soinside.com 2019 - 2024. All rights reserved.