[1] k6: 성능 테스트 기초(테스트 이론과 k6 입문)

2025. 7. 4. 10:07·Test/k6

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. 테스트의 일반 흐름

  1. 요구사항 분석 및 테스트 시나리오 도출
  2. 테스트 케이스 작성 및 자동화 여부 결정
  3. 테스트 환경 구성 (로컬, QA, 스테이징 등)
  4. 테스트 실행 (자동/수동)
  5. 결과 수집 및 분석 (성공, 실패, 로깅)
  6. 버그 수정 및 재테스트 (회귀 테스트 포함)
  7. 릴리즈 승인

 

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
'Test/k6' 카테고리의 다른 글
  • [4] k6: 테스트 시각화(k6, InfluxDB, Grafana 대시보드 구축)
  • [3] k6: 성능 튜닝 가이드(DB, JVM, 그리고 Redis 캐시)
  • [2] k6: 실전 API 부하 테스트(Spring Boot 환경 구축과 트러블 슈팅)
h6bro
h6bro
백엔드 개발자의 기술 블로그
  • h6bro
    Jun's Tech Blog
    h6bro
  • 전체
    오늘
    어제
    • 분류 전체보기 (250) N
      • Java (18)
        • Core (9)
        • Design Pattern (9)
      • Spring (80)
        • Core (24)
        • MVC (6)
        • DB (10)
        • JPA (26)
        • Monitoring (3)
        • Security (11)
        • WebSocket (0)
      • Database (33)
        • Redis (15)
        • MySQL (18)
      • MSA (25) N
        • MSA 기본 (11)
        • MSA 아키텍처 (14) N
      • Kafka (30)
        • Core (18)
        • Connect (12)
      • ElasticSearch (11)
        • Search (11)
        • Logging (0)
      • Test (4)
        • k6 (4)
      • Docker (9)
      • CI&CD (10)
        • GitHub Actions (6)
        • ArgoCD (4)
      • Kubernetes (18)
        • Core (12)
        • Ops (6)
      • Cloud Engineering (4)
        • AWS Infrastructure (3)
        • AWS EKS (1)
        • Terraform (0)
      • Project (8)
        • LinkFolio (1)
        • Secondhand Market (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • Cloud Engineering 포스팅 정리
  • 인기 글

  • 태그

    ㅈ
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
h6bro
[1] k6: 성능 테스트 기초(테스트 이론과 k6 입문)
상단으로

티스토리툴바