Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,10 @@ docker-stack.yml
.gradle/
gradle-app.setting
!gradle-wrapper.jar
!gradle-wrapper.properties
!gradle-wrapper.properties

# 테스트 파일 제외
/Performance-Test/load-test/README.md
/Performance-Test/endurance-test/README.md
/Performance-Test/stress-test/README.md
/Performance-Test/spike-test/README.md
76 changes: 76 additions & 0 deletions Performance-Test/endurance-test/health-check.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import http from 'k6/http';
import { check, sleep } from 'k6';

const baseUrl = __ENV.K6_TEST_URL;
const targetUrl = `${baseUrl.replace(/\/$/, '')}/health-check`;

// 지속성 테스트 설정
const TARGET_VUS = Number(__ENV.K6_TARGET_VUS || 1000);
const TEST_DURATION = __ENV.K6_TEST_DURATION || '1h'; // 기본 1시간
const RAMP_UP_TIME = __ENV.K6_RAMP_UP_TIME || '300s';
const TARGET_P95 = Number(__ENV.K6_TARGET_P95 || 500);
const MAX_ERROR_RATE = Number(__ENV.K6_MAX_ERROR_RATE || 0.01);

export const options = {
scenarios: {
'Endurance-Test': {
executor: 'ramping-vus',
startVUs: 0,
stages: [
{ duration: RAMP_UP_TIME, target: TARGET_VUS }, // 300초에 걸쳐 TARGET_VUS VU까지 증가
{ duration: TEST_DURATION, target: TARGET_VUS }, // 1시간 동안 TARGET_VUS VU 유지
{ duration: '30s', target: 0 }, // 30초에 걸쳐 0으로 감소
],
},
},
thresholds: {
'http_req_duration': [`p(95)<${TARGET_P95}`],
'http_req_failed': [`rate<${MAX_ERROR_RATE}`],
'http_req_duration{status:200}': [`p(99)<${TARGET_P95 * 2}`], // 99퍼센타일도 모니터링
'http_reqs': [`rate>${TARGET_VUS * 0.9}`], // RPS가 목표의 90% 이상 유지되어야 함
},
};

export function setup() {
console.log(`[지속성 테스트 시작]`);
console.log(`[목표] ${TARGET_VUS} VUs (각 VU가 1초에 1회 요청) = ${TARGET_VUS} RPS`);
console.log(`[목표 성능] p95 < ${TARGET_P95}ms, 에러율 < ${MAX_ERROR_RATE * 100}%`);
console.log(`[타겟] ${targetUrl}`);
console.log(`[테스트 구성]`);
console.log(` - Ramp Up: ${RAMP_UP_TIME} (0 → ${TARGET_VUS} VUs)`);
console.log(` - 유지: ${TEST_DURATION} (${TARGET_VUS} VUs)`);
console.log(` - Ramp Down: 30s (${TARGET_VUS} → 0 VUs)`);
console.log(` - 각 VU: 1초에 1회 요청`);
console.log(` - 총 테스트 시간: ${RAMP_UP_TIME} + ${TEST_DURATION} + 30s`);
return { startTime: new Date() };
}

export default function () {
const res = http.get(targetUrl, {
timeout: '10s',
headers: {
'Connection': 'keep-alive',
'Accept': 'application/json',
'User-Agent': 'k6-endurance-test',
},
});

check(res, {
'status is 200': (r) => r.status === 200,
'response time < 500ms': (r) => r.timings.duration < 500,
'response time < 1s': (r) => r.timings.duration < 1000,
});

// 각 VU가 1초에 한 번씩 요청하도록 1초 대기
sleep(1);
}

export function teardown(data) {
const endTime = new Date();
const duration = (endTime - data.startTime) / 1000; // 초 단위

console.log(`[지속성 테스트 완료]`);
console.log(`[총 테스트 시간] ${duration}초`);
console.log(`[시작 시간] ${data.startTime.toISOString()}`);
console.log(`[종료 시간] ${endTime.toISOString()}`);
}
62 changes: 62 additions & 0 deletions Performance-Test/load-test/health-check.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import http from 'k6/http';
import { check, sleep } from 'k6';

const baseUrl = __ENV.K6_TEST_URL;
const targetUrl = `${baseUrl.replace(/\/$/, '')}/health-check`;

// VU 기반 테스트 설정
const TARGET_VUS = Number(__ENV.K6_TARGET_VUS || 1000);
const TEST_DURATION = __ENV.K6_TEST_DURATION || '30s';
const RAMP_UP_TIME = __ENV.K6_RAMP_UP_TIME || '10s';
const TARGET_P95 = Number(__ENV.K6_TARGET_P95 || 200);
const MAX_ERROR_RATE = Number(__ENV.K6_MAX_ERROR_RATE || 0.01);

export const options = {
scenarios: {
'VU-Test': {
executor: 'ramping-vus',
startVUs: 0,
stages: [
{ duration: RAMP_UP_TIME, target: TARGET_VUS }, // RAMP_UP_TIME 걸쳐 TARGET_VUS VU까지 증가
{ duration: TEST_DURATION, target: TARGET_VUS }, // TEST_DURATION동안 TARGET_VUS VU 유지
{ duration: '10s', target: 0 }, // 10초에 걸쳐 0으로 감소
],
},
},
thresholds: {
'http_req_duration': [`p(95)<${TARGET_P95}`],
'http_req_failed': [`rate<${MAX_ERROR_RATE}`],
},
};

export function setup() {
console.log(`[부하 테스트 시작]`);
console.log(`[목표] ${TARGET_VUS} VUs (각 VU가 1초에 1회 요청) = ${TARGET_VUS} RPS`);
console.log(`[목표 성능] p95 < ${TARGET_P95}ms, 에러율 < ${MAX_ERROR_RATE * 100}%`);
console.log(`[타겟] ${targetUrl}`);
console.log(`[테스트 구성]`);
console.log(` - Ramp Up: ${RAMP_UP_TIME} (0 → ${TARGET_VUS} VUs)`);
console.log(` - 유지: ${TEST_DURATION} (${TARGET_VUS} VUs)`);
console.log(` - Ramp Down: 10s (${TARGET_VUS} → 0 VUs)`);
console.log(` - 각 VU: 1초에 1회 요청`);
return { startTime: new Date() };
}

export default function () {
const res = http.get(targetUrl, {
timeout: '10s',
headers: {
'Connection': 'keep-alive',
'Accept': 'application/json',
'User-Agent': 'k6-load-test',
},
});

check(res, {
'status is 200': (r) => r.status === 200,
'response time < 500ms': (r) => r.timings.duration < 500,
});

// 각 VU가 1초에 한 번씩 요청하도록 1초 대기
sleep(1);
}
46 changes: 46 additions & 0 deletions Performance-Test/spike-test/health-check.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import http from 'k6/http';
import { check, sleep } from 'k6';

const baseUrl = __ENV.K6_TEST_URL;
const targetUrl = `${baseUrl.replace(/\/$/, '')}/health-check`;

// Spike Test Configuration
const SPIKE_VUS = Number(__ENV.K6_SPIKE_VUS || 10000);
const RAMP_UP = __ENV.K6_RAMP_UP || '10s';
const HOLD = __ENV.K6_HOLD || '30s';
const RAMP_DOWN = __ENV.K6_RAMP_DOWN || '20s';

console.log(`[Spike Test] 시작 - Spike VUs: ${SPIKE_VUS}, Ramp Up: ${RAMP_UP}, Hold: ${HOLD}, Ramp Down: ${RAMP_DOWN}, Target: ${targetUrl}`);

export const options = {
scenarios: {
spike: {
executor: 'ramping-vus',
stages: [
{ duration: RAMP_UP, target: SPIKE_VUS }, // Sudden spike up
{ duration: HOLD, target: SPIKE_VUS }, // Hold at peak
{ duration: RAMP_DOWN, target: 0 }, // Rapid decline
],
},
},
thresholds: {
http_req_duration: ['p(95)<1000'],
http_req_failed: ['rate<0.05'],
},
};

export default function () {
const res = http.get(targetUrl, {
tags: {
endpoint: 'health',
test_type: 'spike'
}
});

check(res, {
'status is 200': (r) => r.status === 200,
'response time < 1s': (r) => r.timings.duration < 1000,
});

sleep(1);
}
Loading