[테스트] nGrinder - 성능 테스트 스크립트 및 테스트

이번 포스팅에서는 nGrinder를 사용해 스크립트를 작성하고 성능 테스트를 실행하는 전체 과정을 상세히 다뤄보겠습니다. 이를 통해 성능 테스트의 실제 시나리오를 구성하고, 결과를 분석하는 방법까지 알 수 있습니다.

 

1. nGrinder 스크립트 작성

1-1. Controller에 로그인

  • 브라우저를 열고 http://localhost:8080에 접속하여 관리자 계정으로 로그인합니다.
  • 기본 계정:
    • 아이디: admin
    • 비밀번호: admin

1-2. 스크립트 관리로 이동

  1. 로그인 후 상단 메뉴에서 Scripts를 클릭합니다.
  2. 우측 상단의 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. 테스트 생성

  1. 상단 메뉴에서 Create Test를 클릭합니다.

2-2. 테스트 구성

  1. Script:
    • 작성한 스크립트(GetPromptTest)를 선택합니다.
  2. Agent:
    • 테스트에 사용할 Agent를 선택합니다. (Agent Management에서 활성화된 Agent를 확인)
  3. Vuser(가상 사용자):
    • 100명으로 설정하여 동시 요청 시뮬레이션.
  4. Processes 및 Threads:
    • Processes: 10개 (병렬 프로세스)
    • Threads: 10개 (각 프로세스당 스레드)
    • 총 100개의 병렬 요청이 발생하도록 설정.
  5. Ramp-Up 설정:
    • Initial Count: 0
    • Incremental Step: 1
    • Interval: 3000ms (3초마다 한 명의 사용자 추가).
  6. Duration(테스트 지속 시간):
    • 1분으로 설정.

2-3. 테스트 실행

  • 설정이 완료되면 상단의 Clone and Start 버튼을 클릭하여 테스트를 실행합니다.
 
 

3. 테스트 결과 확인 및 분석

테스트가 실행되면 실시간으로 성능 데이터를 확인할 수 있습니다. 테스트가 완료된 후 Reports에서 상세 결과를 확인합니다.

테스트 결과 분석

테스트가 완료되면 결과 보고서(Report)에서 주요 성능 지표를 확인할 수 있습니다:

주요 지표

  1. TPS (Transactions Per Second):
    • 초당 처리 가능한 요청 수. TPS가 높을수록 서버의 처리 능력이 우수합니다.
  2. Mean Test Time (평균 응답 시간):
    • 각 요청이 처리되는 평균 시간. 값이 짧을수록 빠른 응답을 의미합니다.
  3. Errors:
    • 실패한 요청 수. 오류가 없으면 서버가 부하를 잘 처리하고 있다는 뜻입니다.

결과 예시

  • TPS: 178.1
  • 평균 응답 시간: 385.64ms
  • 에러: 0