From f1b53ad9b3387765ee338d7bb6987bd7600f0810 Mon Sep 17 00:00:00 2001 From: F04C Date: Wed, 13 May 2026 15:11:35 +0800 Subject: [PATCH] load test --- artillery-test.yml | 24 ++++++++++++++++++++++++ processor.js | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 artillery-test.yml create mode 100644 processor.js diff --git a/artillery-test.yml b/artillery-test.yml new file mode 100644 index 0000000..7aab343 --- /dev/null +++ b/artillery-test.yml @@ -0,0 +1,24 @@ +config: + target: "http://localhost:8080" + phases: + - duration: 50 + arrivalRate: 20 + name: "Ramp to ~1000 concurrent users" # 20 * 50 = 1000 users created + - pause: 120 + maxVusers: 1000 + http: + timeout: 30 + +scenarios: + - name: "Fetch University References" + flow: + - loop: + - get: + url: "/v1/references/univ" + headers: + Accept-Encoding: identity + capture: + - json: "$[0].code" + as: "first_univ_code" + - think: 2 + count: 60 diff --git a/processor.js b/processor.js new file mode 100644 index 0000000..cbd9df3 --- /dev/null +++ b/processor.js @@ -0,0 +1,32 @@ +let requestCount = 0; +let startTime = Date.now(); + +module.exports = { + setup: function (context, ee, next) { + console.log("šŸš€ Test started\n"); + + ee.on( + "response", + function (latency, statusCode, requestParams, response, startTime) { + requestCount++; + const elapsedSeconds = (Date.now() - startTime) / 1000; + const reqPerSec = (requestCount / elapsedSeconds).toFixed(2); + + console.log( + `[${new Date().toLocaleTimeString()}] Requests sent: ${requestCount} | Rate: ${reqPerSec} req/s | Status: ${statusCode}`, + ); + }, + ); + + return next(); + }, + + cleanup: function (context, ee, next) { + const totalTime = (Date.now() - startTime) / 1000; + const avgRate = (requestCount / totalTime).toFixed(2); + console.log(`\nāœ… Test completed`); + console.log(`Total requests: ${requestCount}`); + console.log(`Average rate: ${avgRate} req/s`); + return next(); + }, +};