이번 포스팅에서는 nGrinder를 사용해 스크립트를 작성하고 성능 테스트를 실행하는 전체 과정을 상세히 다뤄보겠습니다. 이를 통해 성능 테스트의 실제 시나리오를 구성하고, 결과를 분석하는 방법까지 알 수 있습니다.
1. nGrinder 스크립트 작성
1-1. Controller에 로그인
- 브라우저를 열고 http://localhost:8080에 접속하여 관리자 계정으로 로그인합니다.
- 기본 계정:
- 아이디: admin
- 비밀번호: admin
1-2. 스크립트 관리로 이동
- 로그인 후 상단 메뉴에서 Scripts를 클릭합니다.
- 우측 상단의 New Script 버튼을 클릭하여 새 스크립트를 생성합니다.
1-3. 스크립트 생성
1.스크립트 템플릿 선택:
- 스크립트 타입: Groovy 선택.
- 스크립트 이름: GetPromptTest (예: 테스트 이름).
2.스크립트 코드 작성:
- 아래 코드를 스크립트 에디터에 입력합니다.
<스크립트 코드>
import static net.grinder.script.Grinder.grinder
import static org.junit.Assert.*
import static org.hamcrest.Matchers.*
import net.grinder.script.GTest
import net.grinder.script.Grinder
import net.grinder.scriptengine.groovy.junit.GrinderRunner
import net.grinder.scriptengine.groovy.junit.annotation.BeforeProcess
import net.grinder.scriptengine.groovy.junit.annotation.BeforeThread
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.ngrinder.http.HTTPRequest
import org.ngrinder.http.HTTPRequestControl
import org.ngrinder.http.HTTPResponse
import org.ngrinder.http.cookie.CookieManager
@RunWith(GrinderRunner)
class TestRunner {
public static GTest test
public static HTTPRequest request
public static Map<String, String> headers = [:]
// 이미 발급된 토큰을 여기에서 설정
public static String authToken = "[토큰]"
@BeforeProcess
public static void beforeProcess() {
HTTPRequestControl.setConnectionTimeout(300000)
test = new GTest(1, "getPromptByCategory Test")
request = new HTTPRequest()
grinder.logger.info("before process.")
}
@BeforeThread
public void beforeThread() {
test.record(this, "test")
grinder.statistics.delayReports = true
grinder.logger.info("before thread.")
}
@Before
public void before() {
headers.put("accept", "*/*")
headers.put("X-AUTH-TOKEN", authToken) // 토큰 설정
request.setHeaders(headers)
grinder.logger.info("before. init headers with auth token")
}
@Test
public void test() {
// getPromptByCategory 요청 (GET)
HTTPResponse response = request.GET("http://[테스트하고 싶은 IP]/api/v1/main/getPromptByCategory?page=1&size=10")
// 상태 코드 확인
if (response.statusCode == 200) {
grinder.logger.info("getPromptByCategory 조회 성공: 상태 코드 200")
} else {
grinder.logger.error("getPromptByCategory 조회 실패: 상태 코드 {}", response.statusCode)
}
// 상태 코드가 200인지 테스트
assertThat(response.statusCode, is(200))
}
}
3. 스크립트 저장:
- 작성이 완료되면 우측 상단의 Save 버튼을 클릭하여 스크립트를 저장합니다.
2. 성능 테스트 시나리오 설정
2-1. 테스트 생성
- 상단 메뉴에서 Create Test를 클릭합니다.
2-2. 테스트 구성
- Script:
- 작성한 스크립트(GetPromptTest)를 선택합니다.
- Agent:
- 테스트에 사용할 Agent를 선택합니다. (Agent Management에서 활성화된 Agent를 확인)
- Vuser(가상 사용자):
- 100명으로 설정하여 동시 요청 시뮬레이션.
- Processes 및 Threads:
- Processes: 10개 (병렬 프로세스)
- Threads: 10개 (각 프로세스당 스레드)
- 총 100개의 병렬 요청이 발생하도록 설정.
- Ramp-Up 설정:
- Initial Count: 0
- Incremental Step: 1
- Interval: 3000ms (3초마다 한 명의 사용자 추가).
- Duration(테스트 지속 시간):
- 1분으로 설정.

2-3. 테스트 실행
- 설정이 완료되면 상단의 Clone and Start 버튼을 클릭하여 테스트를 실행합니다.
3. 테스트 결과 확인 및 분석
테스트가 실행되면 실시간으로 성능 데이터를 확인할 수 있습니다. 테스트가 완료된 후 Reports에서 상세 결과를 확인합니다.

테스트 결과 분석
테스트가 완료되면 결과 보고서(Report)에서 주요 성능 지표를 확인할 수 있습니다:
주요 지표
- TPS (Transactions Per Second):
- 초당 처리 가능한 요청 수. TPS가 높을수록 서버의 처리 능력이 우수합니다.
- Mean Test Time (평균 응답 시간):
- 각 요청이 처리되는 평균 시간. 값이 짧을수록 빠른 응답을 의미합니다.
- Errors:
- 실패한 요청 수. 오류가 없으면 서버가 부하를 잘 처리하고 있다는 뜻입니다.
결과 예시
- TPS: 178.1
- 평균 응답 시간: 385.64ms
- 에러: 0
'백엔드 > 스프링' 카테고리의 다른 글
| [스프링] 매핑과 엔티티의 관계: 1:N, N:1, N:M, 1:1, FetchType (1) | 2024.12.09 |
|---|---|
| [테스트] nGrinder - 성능 테스트 환경 구성하기 (1) | 2024.11.24 |
| [백엔드] QueryDSL (1) | 2024.11.19 |
| [백엔드] Java Stream API에서 map과 collect 사용하기 (1) | 2024.10.14 |
| [백엔드] Spring Boot에서 GlobalExceptionHandler를 활용한 전역 예외 처리 마스터하기 (1) | 2024.10.06 |