From a857a86617327512a6d1c46946990093f599ea5c Mon Sep 17 00:00:00 2001 From: Yoonhojoon Date: Sun, 24 Aug 2025 19:36:28 +0900 Subject: [PATCH] =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=20=EB=B0=8F=20=EC=88=98=EA=B0=95=20=EC=8B=A0=EC=B2=AD?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=8A=A4=ED=81=AC=EB=A6=BD?= =?UTF-8?q?=ED=8A=B8=20=EC=88=98=EC=A0=95:=20=EC=95=BD=EA=B4=80=20ID=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8,=20=EB=B6=80=ED=95=98=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=84=A4=EC=A0=95=20=EC=A1=B0?= =?UTF-8?q?=EC=A0=95,=20=EA=B3=A0=EC=A0=95=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9=20=EB=B0=A9=EC=8B=9D=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD,=20409=20=EC=83=81=ED=83=9C=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=B2=98=EB=A6=AC=20=EA=B0=9C=EC=84=A0,=20MClass?= =?UTF-8?q?=20ID=20=ED=86=B5=EC=9D=BC.=20=EC=BD=94=EB=93=9C=20=ED=8F=AC?= =?UTF-8?q?=EB=A7=B7=ED=8C=85=20=EA=B0=9C=EC=84=A0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- artillery/generate-users-with-real-tokens.cjs | 2 +- k6/enrollment-only-test.js | 26 +++++++++++++------ scripts/check-enrollments.mjs | 2 +- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/artillery/generate-users-with-real-tokens.cjs b/artillery/generate-users-with-real-tokens.cjs index 21a53ed..6654731 100644 --- a/artillery/generate-users-with-real-tokens.cjs +++ b/artillery/generate-users-with-real-tokens.cjs @@ -105,7 +105,7 @@ async function completeUserRegistration(email, password, name) { }; const completeData = { - termIds: ["044990e1-361e-4148-819c-b8f12de675ab"] // 약관 ID + termIds: ["57d7b9cd-21d2-40dc-b64f-991c11852955"] // 약관 ID }; const completeResponse = await makeRequest(completeOptions, completeData); diff --git a/k6/enrollment-only-test.js b/k6/enrollment-only-test.js index cf47a52..26a9a3b 100644 --- a/k6/enrollment-only-test.js +++ b/k6/enrollment-only-test.js @@ -29,14 +29,14 @@ const users = new SharedArray('users', function () { // 테스트 설정 export const options = { stages: [ - { duration: '5s', target: 10 }, // 빠른 워밍업 - { duration: '20s', target: 50 }, // 높은 부하 - { duration: '30s', target: 50 }, // 지속 부하 + { duration: '5s', target: 50 }, // 빠른 워밍업 + { duration: '30s', target: 200 }, // 높은 부하 (동시 신청) + { duration: '20s', target: 200 }, // 지속 부하 { duration: '10s', target: 0 }, // 빠른 감소 ], thresholds: { http_req_duration: ['p(95)<2000'], // 95% 요청이 2초 이내 완료 - http_req_failed: ['rate<0.15'], // 에러율 15% 미만 (409 포함) + http_req_failed: ['rate<0.15'], // 에러율 15% 미만 (409 제외) 'enrollment_success': ['rate>0.70'], // 수강 신청 성공율 70% 이상 'enrollment_response_time': ['p(95)<1500'], 'form_response_time': ['p(95)<500'], @@ -45,8 +45,8 @@ export const options = { }; // 테스트 변수 -const BASE_URL = __ENV.BASE_URL || 'http://localhost:3000'; -const MCLASS_ID = '11468f1b-c4ef-4fd2-9493-c7a48706c708'; +const BASE_URL = __ENV.BASE_URL || 'http://mclass-alb-616483239.ap-northeast-2.elb.amazonaws.com'; +const MCLASS_ID = '0ad687e8-57c4-4f27-b189-c730790b32de'; // 유틸리티 함수 function generateUUID() { @@ -98,7 +98,10 @@ function generateAnswers(questions) { // 메인 테스트 함수 export default function () { - const user = users[Math.floor(Math.random() * users.length)]; + // 각 VU(가상 사용자)가 고정된 사용자를 사용하도록 수정 + const userIndex = __VU % users.length; + const user = users[userIndex]; + const headers = { 'Content-Type': 'application/json', 'Authorization': `Bearer ${user.accessToken}`, @@ -131,7 +134,7 @@ export default function () { additionalProp3: `테스트 답변 3 - ${Math.floor(Math.random() * 1000)}` }, // 고유한 멱등성 키 생성 (사용자별로 고유) - idempotencyKey: `${user.email}-${MCLASS_ID}-${__VU}-${__ITER}` + idempotencyKey: `${user.email}-${MCLASS_ID}-${__VU}` }; const enrollmentResponse = http.post( @@ -145,6 +148,13 @@ export default function () { '신청 응답 시간 < 1500ms': (r) => r.timings.duration < 1500, }); + // 409 상태는 정상적인 비즈니스 로직이므로 에러로 카운트하지 않음 + if (enrollmentResponse.status !== 409) { + check(enrollmentResponse, { + 'HTTP 요청 성공': (r) => r.status < 400, + }); + } + if (enrollmentResponse.status === 201) { enrollmentSuccessRate.add(1); console.log(`✅ 수강 신청 성공: ${user.email} -> ${MCLASS_ID}`); diff --git a/scripts/check-enrollments.mjs b/scripts/check-enrollments.mjs index 43af0ed..e0491c2 100644 --- a/scripts/check-enrollments.mjs +++ b/scripts/check-enrollments.mjs @@ -9,7 +9,7 @@ const prisma = new PrismaClient({ }); async function checkEnrollments() { - const mclassId = "b21c86a0-383a-4d46-9376-fcf246028d13"; + const mclassId = "0ad687e8-57c4-4f27-b189-c730790b32de"; try { // 클래스 정보 조회