1. Test
애플리케이션 테스트란 소프트웨어가 주어진 요구사항을 충족하고, 정상적으로 동작하며, 성능과 안정성, 품질을 확보하고 있는지 검증하는 과정이다.
1.1. 테스트의 목적
- 기능이 정상적으로 동작하는지 확인
- 버그나 예외 상황을 조기에 발견
- 성능, 보안, 안정성 측면에서 결함 점검
- 사용자 경험을 저해할 요소 제거
- 릴리즈 전 리스크 최소화
1.2.테스트의 분류
| 분류 | 설명 | 예시 |
| 기능 테스트 | 요구한 기능이 정확히 동작하는지 확인 | 로그인, 게시글 CRUD 테스트 |
| 비기능 테스트 | 성능, 보안 등 기능 외적 요소 검증 | 응답 시간, 보안 취약점 점검 |
| 단위 테스트 (Unit Test) | 코드의 최소 단위(메서드, 클래스) 테스트 | 서비스 로직에 대한 JUnit |
| 통합 테스트 (Integration Test) | 여러 모듈 간 상호작용 확인 | DB 연동, 외부 API 연결 검증 |
| 시스템 테스트 | 전체 시스템 관점에서 기능 검증 | QA 환경에서 실제 운영 시나리오 테스트 |
| 인수 테스트 (Acceptance Test) | 사용자 관점에서 기능 검증 | 고객 요구사항 기반 시나리오 테스트 |
| 회귀 테스트 (Regression Test) | 변경된 코드가 기존 기능에 영향 주지 않는지 확인 | 기능 수정 후 기존 테스트 재실행 |
| 성능/부하/스트레스 테스트 | 처리 속도, 최대 처리량, 시스템 한계 검증 | JMeter, k6, Gatling 활용 |
| 보안 테스트 | 보안 취약점 탐지 | SQL Injection, XSS 점검 등 |
1.3. 테스트의 일반 흐름
- 요구사항 분석 및 테스트 시나리오 도출
- 테스트 케이스 작성 및 자동화 여부 결정
- 테스트 환경 구성 (로컬, QA, 스테이징 등)
- 테스트 실행 (자동/수동)
- 결과 수집 및 분석 (성공, 실패, 로깅)
- 버그 수정 및 재테스트 (회귀 테스트 포함)
- 릴리즈 승인
1.4. 테스트 종류(성능 / 부하 / 스트레스 테스트)
1.4.1. 성능 테스트 (Performance Test)
시스템이 일반적인 조건에서 얼마나 잘 동작하는지를 평가하기 위한 테스트다. 특정 API의 응답 속도, 처리량, CPU/메모리 사용률 등 지표를 통해 현재 성능 수준을 수치화하고 기준치를 만족하는지 검증한다.
- 일반적인 사용 시나리오를 기반으로 테스트
- 예: 로그인 API 응답 시간이 1초 이내인지 확인
1.4.2. 부하 테스트 (Load Test)
정상적인 최대 부하 수준까지 사용자 수나 요청량을 증가시키며 시스템의 반응을 측정한다. 시스템이 어디까지 안정적으로 처리할 수 있는지를 파악하는 데에 중점을 둔다.
- 예: 1000명 동시 로그인 처리 가능 여부
1.4.3. 스트레스 테스트 (Stress Test)
정상 부하를 넘는 극한 조건을 인위적으로 부여해 시스템이 얼마나 버티는지, 장애 발생 시 어떻게 복구하는지를 측정한다. 예기치 않은 장애나 피크 상황 대응력을 평가하는 데 적합하다.
- 예: 1만 명 이상 동시 접속 시 서버가 어떻게 반응하는지 확인
✅ 정리
| 항목 | 성능 테스트 | 부하 테스트 | 스트레스 테스트 |
| 목적 | 전반적인 성능 측정 | 최대 처리 가능 부하 확인 | 한계점 도달 시 동작 확인 |
| 부하 수준 | 정상 수준에서 측정 | 정상 최대까지 증가 | 한계치 초과 |
| 측정 지표 | 응답 시간, 처리량 등 | 병목 지점 탐색 | 장애 발생 조건, 복구 여부 |
| 활용 예 | API 응답 시간 체크 | 1000명 동시 요청 | 10000명 초과 요청 |
2. k6 (성능 테스트 도구)
k6는 Go 언어로 개발된 오픈소스 부하/성능 테스트 도구이며, JavaScript를 기반으로 테스트 시나리오를 작성할 수 있다. CLI 환경에 최적화되어 있으며, JSON, Grafana, InfluxDB 등 다양한 포맷으로 결과를 출력하고 시각화할 수 있다.
2.1. 주요 특징
- JavaScript(ES6) 기반 테스트 시나리오
- CLI 환경에서 실행
- Docker, Kubernetes, CI/CD 파이프라인과 쉽게 통합
- 다양한 지표와 시각화 지원
2.2. 주요 지표
| 지표 설명 | 활용 | 목적 |
| vus | 가상 사용자 수 | 부하 수준 정의 |
| iteration | 각 사용자 요청 횟수 | 처리량 측정 |
| req/s | 초당 요청 수 | 서버 처리 능력 |
| http_req_duration | 요청-응답 시간 | 지연 여부 확인 |
| http_req_failed | 실패 요청 비율 | 안정성 점검 |
| http_req_blocked | 요청 대기 시간 | 병목 탐지 |
| checks | 사용자 정의 검증 결과 | 기능 충족 여부 판단 |
2.3. 예시코드
import http from 'k6/http';
import { sleep } from 'k6';
export let options = {
vus: 10, // 가상 사용자 수
duration: '30s', // 테스트 지속 시간
};
export default function () {
let res = http.get('https://test-api.example.com');
sleep(1); // VU별 1초 쉼 (초당 요청 조절)
}
2.4. 실행 명령어
# 기본 실행
k6 run script.js
# JSON 출력
k6 run --out json=result.json script.js
# Grafana 연동 (InfluxDB)
k6 run --out influxdb=http://localhost:8086/mydb script.js
2.5. 실습 : k6 설치 및 실행
2.5.1. 설치
[1] 디렉터리 생성 및 이동
mkdir k6 && cd k6
[2] k6 설치
sudo apt-get update
sudo apt-get install k6
## 실패시
sudo apt update
sudo apt install snapd
sudo snap install k6
[3] 확인
k6 version
2.5.2. 테스트 스크립트 작성
vi script.js
import http from 'k6/http';
import { sleep, check } from 'k6';
export let options = {
vus: 10, // 가상 사용자 수
duration: '30s', // 테스트 지속 시간
};
export default function () {
let res = http.get('https://quickpizza.grafana.com');
check(res, { "status is 200": (res) => res.status === 200 });
sleep(1); // VU별 1초 쉼 (초당 요청 조절)
}
2.5.3. 테스트 실행
k6 run script.js
# 출력 예시
ubuntu@ubuntu:~/k6$ k6 run script.js
/\ Grafana /‾‾/
/\ / \ |\ __ / /
/ \/ \ | |/ / / ‾‾\
/ \ | ( | (‾) |
/ __________ \ |_|\_\ \_____/
execution: local
script: script.js
output: -
scenarios: (100.00%) 1 scenario, 10 max VUs, 1m0s max duration (incl. graceful stop):
* default: 10 looping VUs for 30s (gracefulStop: 30s)
█ TOTAL RESULTS
checks_total.......................: 241 7.755185/s
checks_succeeded...................: 100.00% 241 out of 241
checks_failed......................: 0.00% 0 out of 241
✓ status is 200
HTTP
http_req_duration.......................................................: avg=209.55ms min=195.05ms med=205.51ms max=274.11ms p(90)=223.11ms p(95)=233.64ms
{ expected_response:true }............................................: avg=209.55ms min=195.05ms med=205.51ms max=274.11ms p(90)=223.11ms p(95)=233.64ms
http_req_failed.........................................................: 0.00% 0 out of 241
http_reqs...............................................................: 241 7.755185/s
EXECUTION
iteration_duration......................................................: avg=1.25s min=1.19s med=1.21s max=1.95s p(90)=1.28s p(95)=1.34s
iterations..............................................................: 241 7.755185/s
vus.....................................................................: 1 min=1 max=10
vus_max.................................................................: 10 min=10 max=10
NETWORK
data_received...........................................................: 728 kB 23 kB/s
data_sent...............................................................: 18 kB 574 B/s
running (0m31.1s), 00/10 VUs, 241 complete and 0 interrupted iterations
default ✓ [======================================] 10 VUs 30s
2.5.4. 테스트 해석
[1] 기본 실행 정보
execution: local
script: script.js
scenarios: default: 10 looping VUs for 30s
- execution: local: 로컬 환경에서 테스트가 실행됨
- script: script.js: 실행한 테스트 스크립트 파일 이름
- scenarios: 10명의 가상 사용자(VUs)가 30초 동안 루프를 반복하며 요청을 보냄
[2] 체크 결과 (check)
checks_total.......................: 241 7.76/s
checks_succeeded...................: 100.00% 241
checks_failed......................: 0.00% 0
- check() 함수로 설정한 조건(status is 200)에 대한 결과
- 총 241건의 요청 모두 성공적으로 HTTP 200 OK 응답을 받음
[3] http_req_duration
avg=209.55ms
min=195.05ms
med=205.51ms
max=274.11ms
p(90)=223.11ms
p(95)=233.64ms
- 요청 하나가 완료되기까지 걸린 시간 (HTTP 응답 시간)
- 평균 응답 시간: 209ms 정도로, 비교적 빠름
- 최대 응답 시간은 274ms, 거의 모든 응답이 300ms 이하로 안정적
- p(90)은 상위 90% 응답이 223ms 이하라는 뜻 → 대부분 빠른 응답을 보임
[4] http_req_failed
0.00% (0 out of 241)
- 실패한 HTTP 요청 비율: 0%
- 모든 요청이 성공적으로 처리됨
[5] http_reqs
241 requests sent, ≈7.75/s
- 전체 테스트 동안 총 241개의 HTTP 요청 전송
- 평균적으로 초당 약 7.75개의 요청 처리됨
[6] iteration_duration
avg=1.25s
min=1.19s
med=1.21s
max=1.95s
- 하나의 가상 사용자(VU)가 http 요청 + sleep(1) 포함한 한 루프를 수행하는 데 걸린 시간
- 평균적으로 1.25초, 대부분 1.2초~1.3초 사이
- sleep(1) 때문에 자연스럽게 1초 이상 걸림
[7] iterations
241 iterations, ≈7.75/s
- 각 가상 사용자가 반복한 횟수: 총 241회
- 요청 수와 동일한 값 → 1회 반복마다 1 HTTP 요청을 보낸 구조
[8] vus, vus_max
vus = 현재 활성 사용자 수 (최소 1, 최대 10)
vus_max = 설정된 최대 사용자 수: 10
[9] 네트워크 정보 (NETWORK)
data_received: 728 kB (총 응답 데이터 용량)
data_sent: 18 kB (총 요청 데이터 용량)
- 테스트 중 수신한 총 데이터: 약 728KB
- 송신한 총 데이터: 약 18KB
- → 요청에 비해 응답의 데이터 양이 큼
[10] 테스트 종료 상태
running (0m31.1s), 00/10 VUs, 241 complete and 0 interrupted iterations
default ✓ [======================================] 10 VUs 30s
- 전체 30초 테스트가 정상 종료됨
- 241건 반복(=요청)이 모두 완료되었으며, 중단(interrupt)된 요청 없음
'Test > k6' 카테고리의 다른 글
| [4] k6: 테스트 시각화(k6, InfluxDB, Grafana 대시보드 구축) (0) | 2025.12.13 |
|---|---|
| [3] k6: 성능 튜닝 가이드(DB, JVM, 그리고 Redis 캐시) (1) | 2025.12.13 |
| [2] k6: 실전 API 부하 테스트(Spring Boot 환경 구축과 트러블 슈팅) (0) | 2025.12.13 |
