File size: 3,175 Bytes
aef804e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | // Baseline load test: 10 concurrent users
// Purpose: Establish baseline performance metrics under light load
import http from 'k6/http';
import { check, sleep, Trend } from 'k6';
import { login, executeAgent, getAgents, BASE_URL } from './k6_setup.js';
// Test configuration
export const options = {
stages: [
{ duration: '2m', target: 10 }, // Ramp up to 10 users
{ duration: '3m', target: 10 }, // Stay at 10 users
{ duration: '1m', target: 0 }, // Ramp down
],
thresholds: {
http_req_duration: ['p(95)<500', 'p(99)<1000'],
http_req_failed: ['rate<0.05'],
checks: ['rate>0.95'], // 95% of checks should pass
},
};
export default function () {
// Scenario 1: Authentication flow (60% of VUs)
if (Math.random() < 0.6) {
// Login
const token = login();
// Wait to simulate user think time
sleep(1);
// Optional: Execute agent after login
if (token && Math.random() < 0.5) {
executeAgent(token, 'baseline-test-agent');
}
}
// Scenario 2: Agent execution (40% of VUs)
else {
// First login to get token
const token = login();
if (token) {
// Execute agent
executeAgent(token, 'baseline-test-agent');
// Wait to simulate user think time
sleep(2);
// Optional: List agents
getAgents(token);
}
}
// Sleep to simulate realistic think time between requests
sleep(1);
}
// Teardown: Print summary
export function handleSummary(data) {
return {
'stdout': textSummary(data, { indent: ' ', enableColors: true }),
};
}
// Helper function for text summary
function textSummary(data, options = {}) {
const { indent = '', enableColors = false } = options;
let summary = `${indent}Baseline Load Test Summary\n`;
summary += `${indent}========================\n\n`;
// Test metrics
const httpReqs = data.metrics.http_reqs;
const httpFailed = data.metrics.http_req_failed;
const httpDuration = data.metrics.http_req_duration;
const checks = data.metrics.checks;
if (httpReqs && httpReqs.values) {
summary += `${indent}Total Requests: ${httpReqs.values.count || 0}\n`;
}
if (httpFailed && httpFailed.values) {
summary += `${indent}Failed Requests: ${httpFailed.values.fails || 0}\n`;
summary += `${indent}Failure Rate: ${((httpFailed.values.rate || 0) * 100).toFixed(2)}%\n\n`;
}
// Response times
if (httpDuration && httpDuration.values) {
summary += `${indent}Response Times:\n`;
summary += `${indent} P50: ${(httpDuration.values['p(50)'] || 0).toFixed(0)}ms\n`;
summary += `${indent} P95: ${(httpDuration.values['p(95)'] || 0).toFixed(0)}ms\n`;
summary += `${indent} P99: ${(httpDuration.values['p(99)'] || 0).toFixed(0)}ms\n\n`;
}
// Checks
if (checks && checks.values) {
summary += `${indent}Checks:\n`;
summary += `${indent} Passed: ${checks.values.passes || 0}\n`;
summary += `${indent} Failed: ${checks.values.fails || 0}\n`;
const passRate = checks.values.count > 0
? ((checks.values.passes / checks.values.count) * 100).toFixed(2)
: '0.00';
summary += `${indent} Pass Rate: ${passRate}%\n`;
}
return summary;
}
|