* Generates a summary report of all test results
(allResults)
| 616 | * Generates a summary report of all test results |
| 617 | */ |
| 618 | function generateSummaryReport (allResults) { |
| 619 | console.log("\n📊 Load Test Summary Report"); |
| 620 | console.log("=".repeat(70)); |
| 621 | |
| 622 | let totalTests = 0; |
| 623 | let totalRequests = 0; |
| 624 | let totalErrors = 0; |
| 625 | let bestRps = 0; |
| 626 | let worstRps = Infinity; |
| 627 | let bestLatency = Infinity; |
| 628 | let worstLatency = 0; |
| 629 | |
| 630 | console.log("| Test Category | Avg RPS | Avg Latency | P99 Latency | Error Rate |"); |
| 631 | console.log("|" + "-".repeat(68) + "|"); |
| 632 | |
| 633 | for (const category of allResults) { |
| 634 | const categoryName = category.name; |
| 635 | const results = category.results; |
| 636 | |
| 637 | const avgRps = results.reduce((sum, r) => sum + r.result.requests.average, 0) / results.length; |
| 638 | const avgLatency = results.reduce((sum, r) => sum + r.result.latency.average, 0) / results.length; |
| 639 | const avgP99 = results.reduce((sum, r) => sum + r.result.latency.p99, 0) / results.length; |
| 640 | const avgErrorRate = results.reduce((sum, r) => sum + r.result.errors / r.result.requests.total * 100, 0) / results.length; |
| 641 | |
| 642 | console.log(`| ${categoryName.padEnd(13)} | ${avgRps.toFixed(1).padStart(7)} | ${avgLatency.toFixed(1).padStart(11)} | ${avgP99.toFixed(1).padStart(11)} | ${avgErrorRate.toFixed(2).padStart(9)}% |`); |
| 643 | |
| 644 | // Track overall stats |
| 645 | totalTests += results.length; |
| 646 | results.forEach(r => { // eslint-disable-line no-loop-func |
| 647 | totalRequests += r.result.requests.total; |
| 648 | totalErrors += r.result.errors; |
| 649 | bestRps = Math.max(bestRps, r.result.requests.average); |
| 650 | worstRps = Math.min(worstRps, r.result.requests.average); |
| 651 | bestLatency = Math.min(bestLatency, r.result.latency.average); |
| 652 | worstLatency = Math.max(worstLatency, r.result.latency.average); |
| 653 | }); |
| 654 | } |
| 655 | |
| 656 | console.log("|" + "-".repeat(68) + "|"); |
| 657 | |
| 658 | console.log("\n🎯 Key Metrics:"); |
| 659 | console.log(` Total tests run: ${totalTests}`); |
| 660 | console.log(` Total requests: ${totalRequests.toLocaleString()}`); |
| 661 | console.log(` Total errors: ${totalErrors}`); |
| 662 | console.log(` Overall error rate: ${(totalErrors / totalRequests * 100).toFixed(2)}%`); |
| 663 | console.log(` Best RPS: ${bestRps.toFixed(1)}`); |
| 664 | console.log(` Worst RPS: ${worstRps.toFixed(1)}`); |
| 665 | console.log(` Best latency: ${bestLatency.toFixed(1)}ms`); |
| 666 | console.log(` Worst latency: ${worstLatency.toFixed(1)}ms`); |
| 667 | |
| 668 | console.log("\n💡 Performance Insights:"); |
| 669 | if (bestRps > 1000) { |
| 670 | console.log(` ✅ Excellent peak performance (${bestRps.toFixed(0)} RPS)`); |
| 671 | } else if (bestRps > 500) { |
| 672 | console.log(` ✅ Good peak performance (${bestRps.toFixed(0)} RPS)`); |
| 673 | } else { |
| 674 | console.log(` ⚠️ Consider optimization (peak: ${bestRps.toFixed(0)} RPS)`); |
| 675 | } |