k6-cucumber-steps
Version:
Cucumber step definitions for running k6 performance tests.
80 lines (70 loc) • 2.45 kB
JavaScript
module.exports = function buildK6Script(config) {
const { method, endpoints, endpoint, body, headers, options } = config;
if (!endpoints?.length && !endpoint) {
throw new Error(
'Either "endpoints" or "endpoint" must be defined in the configuration.'
);
}
const BASE_URL = process.env.API_BASE_URL || process.env.BASE_URL;
if (!BASE_URL) {
throw new Error(
"Neither API_BASE_URL nor BASE_URL is defined in the environment variables."
);
}
const resolveEndpoint = (url) => {
return url.startsWith("/") ? `${BASE_URL}${url}` : url;
};
const stringifiedHeaders = JSON.stringify(headers, null, 2);
const stringifiedBody = JSON.stringify(body, null, 2);
return `
import http from 'k6/http';
import { check } from 'k6';
import { htmlReport } from "https://raw.githubusercontent.com/benc-uk/k6-reporter/main/dist/bundle.js";
import { textSummary } from "https://jslib.k6.io/k6-summary/0.0.1/index.js";
export const options = ${JSON.stringify(options, null, 2)};
export default function () {
const headers = ${stringifiedHeaders};
const body = ${stringifiedBody};
${
endpoints?.length
? endpoints
.map(
(url, i) => `
const resolvedUrl${i} = "${resolveEndpoint(url)}";
const res${i} = http.request("${method}", resolvedUrl${i}, ${
method === "GET" || method === "DELETE"
? "null"
: "JSON.stringify(body)"
}, { headers });
console.log(\`Response Body for \${resolvedUrl${i}}: \${res${i}.body}\`);
check(res${i}, {
"status is 2xx": (r) => r.status >= 200 && r.status < 300
});
`
)
.join("\n")
: `
const resolvedUrl = "${resolveEndpoint(endpoint)}";
const res = http.request("${method}", resolvedUrl, ${
method === "GET" || method === "DELETE"
? "null"
: "JSON.stringify(body)"
}, { headers });
console.log(\`Response Body for \${resolvedUrl}: \${res.body}\`);
check(res, {
"status is 2xx": (r) => r.status >= 200 && r.status < 300
});
`
}
}
export function handleSummary(data) {
const outputDir = __ENV.REPORT_OUTPUT_DIR || "reports";
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
const filename = \`\${outputDir}/k6-report-\${timestamp}.html\`;
return {
[filename]: htmlReport(data),
stdout: textSummary(data, { indent: " ", enableColors: true }),
};
}
`;
};