diff --git a/packages/server/connect-test-report.json b/packages/server/connect-test-report.json new file mode 100644 index 0000000..2968c68 --- /dev/null +++ b/packages/server/connect-test-report.json @@ -0,0 +1,277 @@ +{ + "aggregate": { + "counters": { + "vusers.created_by_name.Test Messages with 32 Participants": 320, + "vusers.created": 320, + "socketio.emit": 3520, + "vusers.failed": 0, + "vusers.completed": 320 + }, + "rates": { + "socketio.emit_rate": 160 + }, + "firstCounterAt": 1737478986615, + "firstHistogramAt": 1737478986629, + "lastCounterAt": 1737479006761, + "lastHistogramAt": 1737479006761, + "firstMetricAt": 1737478986615, + "lastMetricAt": 1737479006761, + "period": 1737479000000, + "summaries": { + "socketio.response_time": { + "min": 0, + "max": 10.7, + "count": 3520, + "mean": 0.2, + "p50": 0.1, + "median": 0.1, + "p75": 0.2, + "p90": 0.3, + "p95": 0.4, + "p99": 0.7, + "p999": 3 + }, + "vusers.session_length": { + "min": 10002.9, + "max": 10057, + "count": 320, + "mean": 10012, + "p50": 9999.2, + "median": 9999.2, + "p75": 9999.2, + "p90": 9999.2, + "p95": 9999.2, + "p99": 9999.2, + "p999": 9999.2 + } + }, + "histograms": { + "socketio.response_time": { + "min": 0, + "max": 10.7, + "count": 3520, + "mean": 0.2, + "p50": 0.1, + "median": 0.1, + "p75": 0.2, + "p90": 0.3, + "p95": 0.4, + "p99": 0.7, + "p999": 3 + }, + "vusers.session_length": { + "min": 10002.9, + "max": 10057, + "count": 320, + "mean": 10012, + "p50": 9999.2, + "median": 9999.2, + "p75": 9999.2, + "p90": 9999.2, + "p95": 9999.2, + "p99": 9999.2, + "p999": 9999.2 + } + } + }, + "intermediate": [ + { + "counters": { + "vusers.created_by_name.Test Messages with 32 Participants": 107, + "vusers.created": 107, + "socketio.emit": 343 + }, + "rates": { + "socketio.emit_rate": 110 + }, + "socketio.emit_rate": null, + "firstCounterAt": 1737478986615, + "firstHistogramAt": 1737478986629, + "lastCounterAt": 1737478989991, + "lastHistogramAt": 1737478989991, + "firstMetricAt": 1737478986615, + "lastMetricAt": 1737478989991, + "period": "1737478980000", + "summaries": { + "socketio.response_time": { + "min": 0, + "max": 0.8, + "count": 343, + "mean": 0.1, + "p50": 0.1, + "median": 0.1, + "p75": 0.2, + "p90": 0.2, + "p95": 0.3, + "p99": 0.7, + "p999": 0.8 + } + }, + "histograms": { + "socketio.response_time": { + "min": 0, + "max": 0.8, + "count": 343, + "mean": 0.1, + "p50": 0.1, + "median": 0.1, + "p75": 0.2, + "p90": 0.2, + "p95": 0.3, + "p99": 0.7, + "p999": 0.8 + } + } + }, + { + "counters": { + "vusers.created_by_name.Test Messages with 32 Participants": 213, + "vusers.created": 213, + "socketio.emit": 2571, + "vusers.failed": 0, + "vusers.completed": 107 + }, + "rates": { + "socketio.emit_rate": 263 + }, + "socketio.emit_rate": null, + "firstCounterAt": 1737478990015, + "firstHistogramAt": 1737478990018, + "lastCounterAt": 1737478999996, + "lastHistogramAt": 1737478999996, + "firstMetricAt": 1737478990015, + "lastMetricAt": 1737478999996, + "period": "1737478990000", + "summaries": { + "socketio.response_time": { + "min": 0, + "max": 10.7, + "count": 2571, + "mean": 0.2, + "p50": 0.1, + "median": 0.1, + "p75": 0.2, + "p90": 0.3, + "p95": 0.3, + "p99": 0.7, + "p999": 3.3 + }, + "vusers.session_length": { + "min": 10002.9, + "max": 10027.1, + "count": 107, + "mean": 10009.5, + "p50": 9999.2, + "median": 9999.2, + "p75": 9999.2, + "p90": 9999.2, + "p95": 9999.2, + "p99": 9999.2, + "p999": 9999.2 + } + }, + "histograms": { + "socketio.response_time": { + "min": 0, + "max": 10.7, + "count": 2571, + "mean": 0.2, + "p50": 0.1, + "median": 0.1, + "p75": 0.2, + "p90": 0.3, + "p95": 0.3, + "p99": 0.7, + "p999": 3.3 + }, + "vusers.session_length": { + "min": 10002.9, + "max": 10027.1, + "count": 107, + "mean": 10009.5, + "p50": 9999.2, + "median": 9999.2, + "p75": 9999.2, + "p90": 9999.2, + "p95": 9999.2, + "p99": 9999.2, + "p999": 9999.2 + } + } + }, + { + "counters": { + "socketio.emit": 606, + "vusers.failed": 0, + "vusers.completed": 213 + }, + "rates": { + "socketio.emit_rate": 110 + }, + "socketio.emit_rate": null, + "firstCounterAt": 1737479000022, + "firstHistogramAt": 1737479000022, + "lastCounterAt": 1737479006761, + "lastHistogramAt": 1737479006761, + "firstMetricAt": 1737479000022, + "lastMetricAt": 1737479006761, + "period": "1737479000000", + "summaries": { + "socketio.response_time": { + "min": 0, + "max": 1, + "count": 606, + "mean": 0.2, + "p50": 0.2, + "median": 0.2, + "p75": 0.3, + "p90": 0.4, + "p95": 0.5, + "p99": 0.7, + "p999": 0.9 + }, + "vusers.session_length": { + "min": 10004.6, + "max": 10057, + "count": 213, + "mean": 10013.3, + "p50": 9999.2, + "median": 9999.2, + "p75": 9999.2, + "p90": 9999.2, + "p95": 9999.2, + "p99": 9999.2, + "p999": 9999.2 + } + }, + "histograms": { + "socketio.response_time": { + "min": 0, + "max": 1, + "count": 606, + "mean": 0.2, + "p50": 0.2, + "median": 0.2, + "p75": 0.3, + "p90": 0.4, + "p95": 0.5, + "p99": 0.7, + "p999": 0.9 + }, + "vusers.session_length": { + "min": 10004.6, + "max": 10057, + "count": 213, + "mean": 10013.3, + "p50": 9999.2, + "median": 9999.2, + "p75": 9999.2, + "p90": 9999.2, + "p95": 9999.2, + "p99": 9999.2, + "p999": 9999.2 + } + } + } + ] +} diff --git a/packages/server/connect-test.yml b/packages/server/connect-test.yml new file mode 100644 index 0000000..a69e629 --- /dev/null +++ b/packages/server/connect-test.yml @@ -0,0 +1,28 @@ +config: + target: 'ws://localhost:3000/game' + phases: + - duration: 10 + arrivalRate: 32 # 32명의 참여자 + socketio: + transports: ['websocket'] + +scenarios: + - name: 'Test Messages with 32 Participants' + engine: 'socketio' + flow: + # 1. 각 클라이언트가 'session' 이벤트를 통해 핀코드에 참여 + - emit: + channel: 'session' + data: + pinCode: 'a378ad' # 고정된 pinCode + nickname: 'TestUser_{{ $loopIndex }}' + # 2. 참여자가 1초 간격으로 'message' 이벤트 발생 + - loop: + - emit: + channel: 'message' + data: + pinCode: 'a378ad' + message: 'Message from User {{ $loopIndex }}' + position: { { $loopIndex } } + - think: 1 # 1초 간격으로 메시지 발생 + count: 10 # 각 참여자가 10번 메시지 전송 diff --git a/packages/server/message-test.yml b/packages/server/message-test.yml new file mode 100644 index 0000000..88ea6eb --- /dev/null +++ b/packages/server/message-test.yml @@ -0,0 +1,30 @@ +config: + target: 'ws://localhost:3000/game' + phases: + - duration: 30 # 총 30초 동안 테스트 진행 + arrivalCount: 32 # 32명의 유저를 한 번에 생성 + socketio: + transports: ['websocket'] + +scenarios: + - name: 'Test 32 Participants with Periodic Messages' + engine: 'socketio' + flow: + # 1. 각 클라이언트가 'session' 이벤트를 통해 핀코드에 참여 + - emit: + channel: 'session' + data: + pinCode: '032233' # 고정된 pinCode + nickname: 'TestUser_{{ $loopIndex }}' + - think: 1 # 세션 등록 후 1초 대기 + + # 2. 각 참여자가 주기적으로 메시지를 보냄 + - loop: + - emit: + channel: 'message' + data: + pinCode: '032233' + message: 'Message from User {{ $loopIndex }}' + position: { { $loopIndex } } + - think: 2 # 2초 간격으로 메시지 발생 + count: 15 # 각 참여자가 15번 메시지 전송 diff --git a/packages/server/package.json b/packages/server/package.json index df15fe9..3fd887f 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -4,6 +4,7 @@ "scripts": { "start": "ts-node -r tsconfig-paths/register src/main.ts", "start:dev": "nodemon --watch src --exec 'ts-node -r tsconfig-paths/register' src/main.ts", + "test:artillery": "artillery run message-test.yml -o message-test-report.json", "build": "tsc && tsc-alias", "test": "jest", "test:e2e": "jest --config ./test/jest-e2e.json"