서비스 API 를 생성한 개발자 중에, 부하테스트를 하고자하는 분들을 위해, 해당 글을 작성하였습니다. 해당 페이지를 읽고 나시면, 성능테스트의 개념, 성능테스트 도구의 종류에 대해 이해하실 수 있습니다.

자료마다 다른 정의. 약간 다른 뉘앙스. 다른 접근.
| 성능 테스트 | 부하 테스트 | 스트레스 테스트 | |
|---|---|---|---|
| 도메인 | 부하 및 스트레스 테스트의 상위 집합 | 성능 테스트의 하위 집합 | 성능 테스트의 하위 집합 |
| 범위 | 매우 넓은 범위 하위 집합 - {부하 테스트, 스트레스 테스트, 용량 테스트, 볼륨 테스트, 내구성 테스트, 스파이크 테스트, 확장 성 테스트 및 안정성 테스트 등} | 성능 테스트에 비해 범위가 좁다. 볼륨 테스트 및 내구성 테스트를 포함한다. | 성능 테스트에 비해 범위가 좁다. soak 테스트 및 스파이크 테스트를 포함한다. |
| 주요 목표 | 애플리케이션 성능을 벤치 마크 및 표준에 맞춘다. | 시스템의 상한선을 식별하려면 앱의 SLA를 설정하고 시스템이 과부하 볼륨을 처리하는 방법을 확인한다. | 과부하에서 시스템이 작동하는 방식과 장애로부터 복구하는 방식을 테스트하면서 알아낸다. 앱이 기본적으로 예기치 않은 트래픽 급증에 다운되지 않도록 대비한다. |
| 부하 제한 | 임계치 이전과 초과된 경우 모두 검사 | 임계치 이전까지 검사 | 임계치를 초과한 경우 검사 |
| 학습된 속성 | 리소스 사용량, 안정성, 확장성, 리소스 사용량, 응답 시간, 처리량, 속도 등 | 과부하 수준에서 최대 성능, 서버 처리량, 응답 시간 (임계치 값 미만), H/W 환경의 적절성, 처리 할 수 있는 사용자 앱 수, 부하 분산 요구 사항 등 | 대역폭 용량, 응답 시간 이상의 안정성 (임계치 값 초과) |
| 얻은 결과 | 런타임 팽창, 최적화 범위, 속도, 지연 시간, 처리량 등과 관련된 문제를 포함한 모든 성능 버그. 기본적으로 – 성능과 관련된 모든 것! | 부하 분산 문제, 대역폭 문제, 시스템 용량 문제, 응답 시간 부족, 처리량 문제 등 | 과부하, 과부하 상황에서의 데이터 손상 문제, 속도 저하, 메모리 누수 등의 보안 허점 |
성능 테스트 유형에 대한 정의를 정확히 이해해 보고자, 여러 자료들을 비교해가며 하나씩 짚어서 읽어가다 보면, 예상과 달리 그 정의하고 있는 용어와 매핑되는 내용들이 조금씩 다른 것을 보게 됩니다. 예를 들어, 성능 테스트 유형에 대해서도 아래의 경우와 같이 ‘Baseline Testing’이라는 용어를 시작으로, 그 ‘부하량’과 ‘기간’ 등의 정도에 따라 성능 테스트 유형을 정의하는 경우도 있습니다.

성능 테스트 유형’에 대한 기본적인 이해를 가질 수 있도록, 일반적으로 성능 테스트에는 어떠한 종류들이 있는지, 그리고 각각은 대략적으로 어떤 차이점을 가지고 성능 업무에 적용되고 있는지에 대해 몇가지 자료들을 중심으로 살펴봄으로써, 성능테스트가 수행되는 다양한 형태들에 대한 기본적인 이해를 돕고자 합니다.
첫번째로 살펴볼 자료는, 성능 테스트 유형에 대해 사용자의 부하발생 패턴별로 시각화하여 차이점을 비교하고 있는 DCube’s Practices 자료입니다.

그래프의 Y축은 가상사용자(Virtual Users), X축은 지속 시간(Test Time)을 각각 나타내고 있으며,
사용자의 증가, 유지, 감소 등 부하패턴 변화에 따라 각각의 테스트 유형을 구분지어 비교하고 있습니다.
참고로, 성능 테스트 Tool에서는 이러한 그래프와 유사하게 Workload를 설계하여 사용하고 있습니다. 예를 들어, 500명의 가상사용자(Virtual Users)를 이용한다면, 5분간 500명 증가(Ramp Up), 10분간 부하지속(Steady State), 1분간 부하 감소(Ramp Down) 등과 같은 형태로 설계하여 실제 부하를 발생시키고 있습니다.

사전에 결정된 Peak시점의 부하 상황에서 시스템의 성능을 검증하는 것으로, Peak Load는 일반적으로 1시간동안 유지됩니다.
이 테스트는 적정한 성능으로 Peak Hour Traffic을 감당할 수 있는지 확인합니다.
Peak Load보다 훨씬 높은 부하 상황에서 시스템의 성능을 검증합니다.(일반적으로는 Peak Load의 2배를 사용합니다.)
이러한 상황에서 시스템이 장애가 발생하는지 또는 사용 가능한 상태로 유지되는지,
그리고 부하가 정상 수준으로 돌아갈 때 우아하게(gracefully) 복구되는지 체크합니다.
장기간에 걸ㅁ쳐 나타나는 메모리 누수와 같은 이슈들을 감지하기 위해, 8시간 이상의 기간에 걸쳐 시스템의 안정성을 확인하는 장기적인 테스트입니다.
시스템의 갑작스러운 사용량 급증에 대한 독특한 시나리오에 대해 시뮬레이션합니다.
이것은 인기있는 제품 출시(e.g. iPhone) 또는 Big Sales(e.g. Singles’ Day)와 같은 상황과 관련이 있습니다.
동시단말 사용자(concurrent users)의 수를 점진적으로 증가시켜서, 시스템의 장애 지점을 결정합니다.
테스트 이후, 시스템을 사용할 수 없게 되는 지점,
즉 시스템의 중단점(the breakpoint of the system)을 관찰하기 위해 그래프를 그릴 수 있습니다.
정리해 보면, DCube’s Practices에서 단순하게 구분짓고 있는 다섯가지 성능테스트 유형은 다음과 같이 요약할 수 있습니다.
여기서는, Stress Testing의 정의가 ‘적정 부하의 2배’ 등의 예시로 단순화하여 설명되었지만, 원래의 의미는 좀 더 넓은 개념으로 사용되고 있습니다. 예를 들어, 아래 그림에서 부하 유형의 그래프들 중 사선으로 표시한 부분을 보면, Stress Testing에 대한 설명이 ‘Find the Performance Limits of the System’으로 되어 있어서, 앞서 언급된 Breakpoint Testing과 비슷한 의미로 사용되기도 합니다. 좀더 자세한 설명은 두번째 예시에서 참조하시기 바랍니다.

출처 : https://netsolutions.com/insights/performance-testing/
Soak Testing은 오랜 시간동안 대량 부하(huge volume of load) 상황에서, 애플리케이션의 성능을 측정하는데 사용되는 비기능 테스트의 한 유형입니다. 이 유형의 테스트에서 기본적으로 모니터링 되는 것은 시스템의 애플리케이션에 의한 메모리의 사용율입니다.
Why do Soak Testing?
시스템이 2시간 동안 사용될 때는 정상적으로 동작할 수 있지만, 동일한 시스템을 10시간 이상 사용하면 장애가 발생하거나 비정상적인 상황이 발생할 수 있습니다. 이러한 상황을 예측하기 위해 Soak Testing이 수행됩니다.
When to do Soak Testing?
빌드가 고객에게 배포되기 전에, 즉 특정 플랫폼에서 애플리케이션이 출시되기 전에 일련의 Load Tests가 수행된 이후, Soak Tesitng이 수행됩니다. 메모리 누수/ 메모리 손상 등과 같은 이슈가 발견되면 즉시 보고해야 합니다.
Source: guru99.com
Software Testing Class에서는 성능테스트(Performance Testing)의 주요 유형을 6가지로 정의하고 있습니다. 위에서 언급되었던 ‘Breakpoint Testing’이 빠지고, 여기서는 ‘Volume Testing’과 ‘Scalability Testing’이 추가되어 있습니다. 참고자료로 남깁니다.
https://www.softwaretestingclass.com/what-is-performance-testing/
1. Load Testing
Load Testing은 부하가 임계치(Threshold Value)에 도달할 때까지 시스템의 부하를 지속적으로 증가시키면서 시스템을 확인하는, Performance Testing의 한 유형입니다. 여기서 부하를 증가시킨다는 것은, 동시단말사용자(concurrent users)와 트랜잭션을 증가시키면서 테스트 중인 애플리케이션의 동작을 확인하는 것을 의미합니다. ‘Endurance testing’ 또는 ‘Volume testing’이라고 불리기도 합니다.
Load Testing의 주요 목적은 과부하 상태(under heavy load)에서 시스템이 잘 작동될 때, 응답시간과 애플리케이션의 지구력(staying power)을 모니터링하는 것입니다. Load Testing과 아래에 기술된 테스트들은 모두 비기능 테스트(NFT/ Non Functional Testing)에 속하며, 소프트웨어 애플리케이션의 비기능 요구사항을 테스트하기 위해 설계되었습니다.
Load Testing은 테스트중인 애플리케이션이 견딜 수 있는 부하의 양을 확인하기 위해 수행됩니다. ‘성공적으로 수행된 Load Testing’은 지정된 테스트 케이스가 할당된 시간동안 오류없이 수행된 경우에만 가능합니다.
2. Stress Testing
Stress Testing은 CPU, Memory, Disk Space 등과 같은 하드웨어 자원이 충분하지 않을 때, 소프트웨어의 안정성을 확인하는 Performance Testing의 한 유형입니다. Stress Testing의 기본 개념은 시스템의 오류를 확인하고, 어떻게 시스템이 정상적으로 복구되는지를 살펴보는 것입니다.
“To determine or validate an application’s behavior when it is pushed beyond normal or peak load conditions.”
Stress Testing은 시스템 하드웨어 자원에서 처리할 수 없는 많은 수의 동시단말사용자(concurrent users)/프로세스로 소프트웨어에 부하를 주는 Negative Testing입니다. 이 Testing은 피로시험(Fatigue testing)으로도 알려져 있습니다.
Stress Testing의 기본 개념은 시스템의 장애를 확인하고 시스템이 어떻게 정상적으로 복구되는지를 주시하는 것입니다. 이러한 품질 특성을 회복성(recoverability)이라고 합니다.
3. Spike testing
Spike testing은 Stress Testing의 Subset입니다. 테스트 대상 시스템에 대해, 상용 운영환경에서 예상되는 부하 이상의 Workload를 짧은 기간동안 반복적으로 증가시킬 때 나타나는 성능 특성을 검증하기 위해 수행합니다.
4. Endurance testing
Endurance testing은 시스템의 동작을 확인하기 위해, 장기간에 걸쳐 예상되는 부하량에 기반하여 시스템을 테스트 하는 것을 포함합니다. 예를 들어, 시스템이 3시간동안 작업을 수행하도록 설계되었다면, 동일 시스템이 6시간동안 지속되어도 시스템이 지구력을 유지하는지를 확인하는 것입니다. 가장 일반적인 테스트 케이스는 메모리 누수, 시스템 장애 또는 무작위적인 동작(random behavior)과 같은 시스템의 동작을 확인하기 위해 수행됩니다. 때때로, Endurance testing은 ‘Soak testing’이라고도 합니다.
5. Scalability Testing
Scalability Testing은 사용자 부하, 트랜잭션 수, 데이터 볼륨 등과 같은 비기능 측면에서 확장할 수 있는 역량을 판단하기 위한 소프트웨어 애플리케이션 테스트입니다. 이 테스트의 주요 목적은 더이상 확장(Scaling)하지 못하도록 막는 ‘시스템의 Peak’가 무엇인지 확인하는 것입니다.
6. Volume testing
Volume testing은 처리해야 할 많은 양의 데이터를 가진 애플리케이션의 효율성을 확인하기 위한 테스트입니다. 이 테스트의 주요 목표는 다양한 Database Volumes 하에서 애플리케이션의 성능을 모니터링 하는 것입니다.
https://github.com/naver/ngrinder/wiki/Architecture#general-architecture
웹 애플리케이션을 서비스하기 전에 서버가 얼마나 많은 사용자를 수용할 수 있는지 요청을 전송해봄으로써 서버의 성능을 측정해볼 수 있다.
nGrinder는 Controller와 Agent로 이루어져 있다.
✔️ Controller
├── 성능 측정을 위한 웹 인터페이스 제공
├── 테스트 프로세스 조정
├── 테스트 통계를 수집하고 표시
└── 스크립트 수정 기능 제공
✔️ Agent
├── 에이전트 모드에서 실행할 때 대상 시스템에 부하를 주는 프로세스 및 스레드를 실행
└── 모니터 모드에서 실행 시 대상 시스템 성능(CPU/메모리) 모니터링

✔️ Agent
├── 성능 측정에 사용할 Agent 개수
└── Agent를 여러개로 구성하고 싶은 경우 클라우드 서비스 이용하기
└── 여러개의 인스턴스를 생성해서 Agent 설치하기
✔️ Vuser per agent
├── Agent 당 설정할 가상 사용자 수
└── 동시에 요청을 날리는 사용자 수를 의미
✔️ Process / Thread
└── 하나의 Agent에서 생성할 프로세스와 스레드 개수
✔️ Script
├── 성능 측정 시 각 Agent에서 실행할 스크립트
└── 앞서 API 호출 과정에서 생성한 Script를 연결(.groovy)하거나 Github에서 가져올 수 있다.
✔️ Duration (HH:MM:SS)
└── 성능 측정 수행 시간
✔️ Run Count
└── 스레드 당 테스트 코드를 수행하는 횟수
✔️ Enable Ramp-Up
└── 성능 측정 과정에서 가상 사용자를 점진적으로 늘리도록 활성화
✔️ Initial Count
└── 처음 시작 시 가상 사용자 수
✔️ Initial Sleep Time
└── 테스트 시작 시간
✔️ Incremental Step
└── Process 또는 Thread를 증가시키는 개수
✔️ Interval
└── Process 또는 Thread를 증가시키는 시간 간격
현존하는 도큐먼트 중에 가장 설명이 잘 되어있습니다.
cicd 를 공식 지원합니다.
Js 를 이용합니다.
평균 output 으로 결과가 나오지만, 그라파나를 활용해 대시보드를 구성가능합니다.
threadsholds 라는 임계값이라는 개념이 있어, 테스트 지표에 대해 정의하는 평균치에 대한 통과, 실패 기준이 있습니다.
해당 부분에 대한 예시입니다. 공식페이지에서 더 많은 옵션을 확인할 수 있습니다.
thresholds: {
// 90% of requests must finish within 400ms, 95% within 800, and 99.9% within 2s.
http_req_duration: ['p(90) < 400', 'p(95) < 800', 'p(99.9) < 2000'],
// During the whole test execution, the error rate must be lower than 1%.
http_req_failed: ['rate<0.01'],
},
pip install locust 로 가능한 파이썬 라이브러리로, ncc 및 로컬 이식에 용이합니다.constant_throughput : tps 를 유지하게 노력 함. 이런 옵션들을 획득할 수 있습니다.성능 및 로드 테스트 애플리케이션을 측정하도록 설계된 오픈 소스 Java 애플리케이션입니다.

설정 값은 다음과 같습니다.
