QA가 진행하는 테스트 항목 중, 성능 테스트(Performance Test)라는 것이 있습니다.
세세하게 나누면 부하 테스트, 스트레스 테스트 등 다양한 세부항목이 있습니다만, 보통 포괄적으로 성능 테스트라는 단어를 많이 사용합니다.
단어의 뉘앙스로 알 수 있듯이 간단하게 말하자면 트래픽이 몰릴 때 어플리케이션이 얼마나 잘 버티는지, 잘 동작하는지 검증하는 테스트라고 생각하면 될 것 같습니다.
성능 테스트 툴의 종류로는 JMeter, LoadRunner, nGrinder, K6 등 여러 툴이 존재하지만,
저의 경우 다음과 같은 이유로 Locust를 선택했습니다.
- Python을 활용할 수 있어 Selenium, pytest 등 파이썬 라이브러리는 물론 Jenkins, GitLab 등 현재 세팅된 모든 환경에 호환 가능함
- JMeter,nGrinder에 비교했을때 기능적인 측면에서는 좀 부족하지만 필요한 기능은 다 있고, 그 외의 부분(러닝커브, 속도, 생태계)에서 타 툴 대비 매력있음
아직 성능 테스트가 필요할 정도의 프로젝트는 진행하지않아서 설치방법, 사용방법 등만 조사해놓은 상태라,
이런 툴이 있다는 정도로 간략하게 소개해드리도록 하겠습니다.
※ 설치방법
- 파이썬 실행
- 터미널 내 다음 명령어 입력
- pip3 install locust
- 설치 후 다음 명령어로 버전 확인
- locust -V
- 파이썬 코드 상단에 import
from locust import HttpUser, task, between, TaskSet
from locust.contrib.fasthttp import FastHttpUser
※ 테스트 파일 구성
- 프로젝트 루트 폴더
- ㄴ 소스코드 폴더
- ㄴ __init__.py
- ㄴ soruce.py
- ㄴ locustfile.py
※ 테스트 실행방법
- 터미널에서 locustfile이 위치한 디렉토리로 이동
- locust 명령어 입력
- http://localhost:8089 로 이동하여 테스트 페이지 진입
- 다른 디렉토리에 위치해있을 경우 다음 명령어로 실행
locust -f /path/dir/locustfile.py
4. 값 설정 후 Start 버튼으로 테스트 시작
▼ 실행 옵션에 대한 가이드 (공식 가이드문서)
https://docs.locust.io/en/stable/configuration.html
※ Locust 페이지 소개
1) Number of users
- 동시에 시뮬레이션 할 가상 유저의 수
- 동시 사용자 처리 능력을 테스트할 때 설정
2) Ramp up
- 사용자 수가 점진적으로 증가하는 속도 설정
- 사용자가 점진적으로 증가하는 상황을 설정하여 증가 속도에 따라 어떤 변화가 있는지 확인
3) Host
- 성능을 테스트할 URL
4) Advanced options
- 테스트 실행 시간을 설정하여 설정한 시간이 지나면 테스트가 자동으로 종료되도록 함
- 기본 숫자는 초 단위에 s(초),m(분), h(시간)으로 3h30m30s (3시간 30분 30초) 등으로 설정 가능
5) Host에 입력한 URL이 표시되는 위치
6) 현재 테스트 상태
7) Requests Per Second (초당 처리되는 요청 수)
8) 현재 테스트 중 실패된 케이스의 비율
9) Right 모드 / Dark 모드 변경 버튼
1) 테스트 진행 정보에 대한 탭
- STATSTICS: 가장 기본 페이지로, 테스트 모니터링 진행 상태에 따른 각 항목을 지표화해서 보여줌
- CHARTS: 지표화된 각 값을 차트화
- FAILURES: 실패한 케이스에 대한 메서드와 이름 등의 정보를 제공
- EXCEPTIONS: 발생한 예외사항에 대한 정보를 추적
- CURRENT RATIO: 각 항목에 대한 비율을 나타냄
- DOWNLOAD DATA: 테스트 정보를 HTML이나 CSV로 다운로드 받을 수 있음
- LOGS: 테스트 실행 및 상태, 에러 등에 대한 로그 정보
2) STATISTICS 표 내의 각 컬럼
- Type: GET/POST/PUT/DELETE 등 요청의 유형
- Name: 요청의 이름 (실제 경로나 사용자 정의 이름)
- Requests: 실행된 요청의 총 수
- Fails: 실패한 요청의 총 수 (STATUS가 4XX 혹은 5XX로 반환된 요청)
- Median(ms): 요청의 응답 시간 중간값을 밀리초 단위로 나타냄
- 95%ile (ms): 응답 시간의 상위 5%를 제외한 최대값
- 99%ile (ms): 응답 시간의 상위 1%를 제외한 최대값
- Average (ms): 모든 요청의 응답 시간 합계를 요청 수로 나눈 값
- Min (ms): 최소 응답 시간
- Max (ms): 최대 응답 시간
- Average size (ms): 모든 응답 크기의 합계를 요청 수로 나눈 값
- Current RPS: 현재 초당 요청 수
- Current Failures/s: 현재 초당 실패한 요청 수(0.1이면 10초당 1개의 요청이 실패)
※ locust 라이브러리에서 Import 가능한 항목
HttpUser (from locust import SequentialTaskSet)
- locust에서 사용자의 행동을 정의하는 기본 클래스.
- 웹에 HTTP 요청을 보내기 위해 사용됨
- locust가 시뮬레이션하는 가상의 사용자를 나타냄
FastHttpUser (from locust import FastHttpUser)
- HttpUser의 고성능 버전
- 많은 수의 동시 사용자와 요청을 처리해야 하는 경우에 유용함
- ‘geventhttpclient’ 라이브러리를 사용하여 비동기 HTTP 요청을 지원함
WebUser (from locust import WebUser)
- 기본적으로 HttpUser와 비슷함
- Selenium같은 웹 드라이버를 사용하여 상호작용을 시뮬레이션 할 수 있도록 함
- 복잡한 사용자 상호작용을 테스트하는데 사용
task (from locust import task)
- 테스트할 작업을 정의하는데 사용됨.
- ‘@task’ 데코레이터로 메서드를 태그하면 해당 메서드를 작업으로 인식함
- 작업은 사용자가 수행할 특정 동작을 나타냄 (ex. 특정 URL에 대한 HTTP 요청)
Events (from locust import events)
- 부하 테스트 중 발생하는 상황에 대해 대응하는 기능을 제공함
- 테스트 시작/종료, 요청성공/실패 등 상황에 대한 모니터링을 도와줌
- 위 상황들의 기반으로 추가적인 로직을 실행할 수 있음
TaskSet (from locust import TaskSet)
- 사용자가 수행할 작업의 집합을 정의함
- 병렬로 작업을 실행하며, 작업들이 독립적으로 실행됨
- 해당 클래스는 tasks라는 리스트 속성을 가짐
aSequentialTaskSet (from locust import SequentialTaskSet)
- 순차적으로 작업을 실행하는 클래스(실행 순서에 따라 이전 작업의 완료를 기다림)
- 특정 작업의 순서가 중요하거나 선후 관계가 있는 작업들을 테스트할 때 사용됨
shape_class (from locust import LoadTestShape)
- 트래픽 패턴을 정의하는데 사용함
- 점진적으로 부하를 증가시키거나 패턴에 따라 부하 조절 가능
wait_time (from locust import constant)
- 사용자 간의 대기시간을 조정할 수 있음
tag (from locust import tag)
- 테스트 항목에 태그를 설정하여 실행되는 작업을 상세하게 지정할 수 있음
- locust 테스트 실행 간 —tags, —exclude-tags 인수를 사용
※ 테스트 코드 작성 방법
from locust import HttpUser, task, TaskSet, between
import time
class Default_use_case(HttpUser):
@task
def hellow_world(self):
self.client.get("/hello") # /hello 엔드포인트에 get 요청을 보냄
self.client.post("/world") # self.client 뒤에 get, put, delete, post 등 모두 사용 가능
@task(2) # task 우선순위를 2로 설정
def view_items(self):
for item_id in range(10):
self.client.get(f"/item?id={item_id}", name="아이템") # /item?id=0~9 (for문으로 반복한 숫자) 엔드포인트로 get 요청을 보냄
# name="아이템"은 요청의 이름으로 설정되어 통계표에 해당 이름으로 집계됨
class weightTask(HttpUser): # weight 2인 task가 1인 task 보다 2배 더 많이 실행됨
@task(weight=1)
def first_task(self):
pass
@task(weight=2)
def second_task(self):
pass
class MyTaskSequence(TaskSequence):# TaskSequence 클래스로 seq_task 데코를 통해 순서를 지정할 수 있음
@seq_task(1)
def first_task(self):
pass
@seq_task(2)
def second_task(self):
pass
@seq_task(3)
@task(10)
def third_task(self):
pass
'QA' 카테고리의 다른 글
좋은 TC(테스트 케이스)는 무엇일까? (0) | 2024.08.08 |
---|---|
software QA 채용공고에서 보이는 테스팅 툴 (0) | 2024.08.06 |
QA 기술 스택 정리 (1) | 2024.08.06 |