반응형
nGrinder 테스트를 위한 스크립트를 작성하자
📌 서론
이전 포스트에서 nGrinder 세팅을 마쳤다면 이번에는 스크립트를 작성해 보자
자바 버전에서 오류가 나서 약간 고생했지만 빠르게 해결되었다. (자바 17 말고 자바 11을 사용해야 한다.)
만약 zsh를 사용하고 있다면 2번 중간에서 읽다가 바로 3번으로 넘어가서 세팅하는 것을 추천한다.
만약 nGrinder 설치를 안했다면 아래의 포스트를 보고 설치부터 진행하도록 하자
1. nGrinder 테스트 스크립트 작성
테스트를 위한 스크립트를 작성해 보자
- nGrinder 웹페이지 최상단의 "스크립트" 메뉴를 클릭하면 아래와 같은 페이지로 이동된다.
- 이동된 페이지 상단에 있는 "만들기" 버튼을 클릭한다.
만들기 버튼 클릭
- 드롭다운 메뉴에서 스크립트 만들기를 선택한다.
스크립트 생성 팝업 작성하기
- 스크립트 작성 언어는 Groovy를 선택했고 url에는 내 프로젝트에 작성한 getMapping 경로를 적어줬다.
- 테스트할 URL에는 localhost:8082 이런 식으로는 입력이 불가능하고 127.0.0.1:8082 이렇게 입력해줘야 한다.
스크립트가 성공적으로 만들어졌다면 다음과 같은 페이지로 이동될 것이다.
- 여기서 groovy 스크립트를 작성하고 검증을 한다.
- 검증에 성공했다면 스크립트를 저장한다.
내가 작성한 스크립트는 다음과 같다.
- 레시피아 프로젝트는 로그인된 유저만 사용할 수 있으며 jwt 인증을 통과해야만 요청이 동작하도록 설계되어 있다.
- 이런 사항을 만족시키기 위해 실제 Header에는 실제 유저의 accessToken(jwt)을 담아줬다.
- 실제 존재하는 레시피의 pk인 recipeId를 요청 파라미터에 넣어줬다.
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.HTTPResponse
import HTTPClient.NVPair
/**
* 1. nGrinder 테스트 스크립트 정의:
* RecipeTest 클래스는 nGrinder에서 HTTP GET 요청을 통해 레시피 상세 정보를 조회하는 테스트 케이스를 정의함.
*/
@RunWith(GrinderRunner)
class RecipeTest {
public static GTest test;
public static HTTPRequest request;
public static NVPair[] headers = [];
/**
* 2. 테스트 프로세스 시작 전 설정: nGrinder 테스트 프로세스가 시작되기 전에 한 번 실행되며, 테스트와 HTTP 요청 객체를 초기화함.
*/
@BeforeProcess
public static void beforeProcess() {
test = new GTest(1, "Recipe Detail Test");
request = new HTTPRequest();
grinder.logger.info("before process.");
}
/**
* 3. 테스트 스레드 시작 전 설정: 각 nGrinder 테스트 스레드(가상 사용자)가 시작되기 전에 실행되며, 테스트 메소드의 성능 측정을 위한 설정을 함.
*/
@BeforeThread
public void beforeThread() {
test.record(this, "testRecipeDetail");
grinder.statistics.delayReports = true;
grinder.logger.info("before thread.");
}
/**
* 4. 각 테스트 실행 전 설정: 각 테스트 실행 전에 호출되며, HTTP 요청 헤더를 설정함. 여기서는 JWT 토큰을 Authorization 헤더에 추가함.
*/
@Before
public void before() {
// 실제 JWT 토큰 값으로 "your_jwt_token"을 대체해야 함
headers = [new NVPair("Authorization", "Bearer {여기에 access token 작성}")];
request.setHeaders(headers);
grinder.logger.info("before. init headers");
}
/**
* 5. 테스트 케이스 실행: 실제 테스트 로직을 실행하는 부분으로, HTTP GET 요청을 보내고 응답 상태 코드를 검증함.
*/
@Test
public void testRecipeDetail() {
long recipeId = 33; // 실제 레시피 ID
HTTPResponse response = request.GET("http://localhost:8082/recipe/getRecipeDetail?recipeId=${recipeId}");
assertThat(response.statusCode, is(200));
grinder.logger.info("Recipe detail test passed with status code 200.");
}
}
스크립트 코드를 내가 작성한 것으로 변경하고 검증 버튼을 눌렀다.
- 검증에서 아래와 같은 에러가 발생했다.
발생한 에러코드는 다음과 같다.
2024-02-13 14:10:14,626 INFO Setting of nGrinder local DNS successfully
2024-02-13 14:10:14,627 INFO The Grinder version 3.9.1
2024-02-13 14:10:14,628 INFO OpenJDK Runtime Environment 17.0.9+8-LTS: OpenJDK 64-Bit Server VM (17.0.9+8-LTS, mixed mode, sharing) on Mac OS X aarch64 14.2.1
2024-02-13 14:10:14,634 INFO time zone is KST (+0900)
2024-02-13 14:10:14,650 INFO worker process 0 of agent number 0
2024-02-13 14:10:14,654 INFO Instrumentation agents: byte code transforming instrumenter for Java
2024-02-13 14:10:14,909 ERROR Script error - Error while initialize test runner
net.grinder.engine.common.EngineException: Error while initialize test runner
at net.grinder.scriptengine.groovy.GroovyScriptEngine.<init>(GroovyScriptEngine.java:71)
at net.grinder.scriptengine.groovy.GroovyScriptEngineService.createScriptEngine(GroovyScriptEngineService.java:87)
at net.grinder.engine.process.ScriptEngineContainer.getScriptEngine(ScriptEngineContainer.java:105)
at net.grinder.engine.process.GrinderProcess.run(GrinderProcess.java:345)
at net.grinder.engine.process.WorkerProcessEntryPoint.run(WorkerProcessEntryPoint.java:87)
at net.grinder.engine.process.WorkerProcessEntryPoint.main(WorkerProcessEntryPoint.java:60)
Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
General error during conversion: Unsupported class file major version 61
2. 스크립트 오류 분석 및 해결 (java 버전 문제)
오류를 분석해 보자
- 오류에서는 Groovy 컴파일러가 Java 클래스 파일의 버전 61 (Java 17에 해당)을 지원하지 않는다는 것을 나타낸다.
- nGrinder 또는 그 안에서 사용되고 있는 Groovy 엔진이 Java 17로 컴파일된 클래스 파일을 처리할 수 없어서 발생한 문제다.
- 내가 로컬 pc에서 Java17을 사용하고 있어서 발생한 오류였다.
General error during conversion: Unsupported class file major version 61
오류 해결: Java 버전을 11로 다운그레이드하기
- 먼저 nGrinder를 실행 중인 내 로컬 macOS의 자바 버전을 확인했다.
- Java17이 환경변수에 세팅되어 있는 것을 확인했다.
- Java17을 Java11로 변경하기 위해 로컬 pc의 JVM 설치 경로로 이동했다.
cd /Library/Java/JavaVirtualMachines
- ls 명령어를 입력해서 설치된 자바를 확인한다. 여기서 zulu-11을 찾았다.
- 아래의 명령어를 입력해서 내부로 이동한다.
cd Contets/Home
- 여기서 pwd 명령어를 입력해서 나온 경로를 복사한다. (환경변수에 세팅하기 위함)
- 복사한 경로를 세팅하기 위해 .bash_profile을 vim 에디터로 열어준다. (zsh를 사용 중이라면 지금부터 작성한 방법대로 적용하면 문제가 발생하기에 이 파트는 읽기만 하고 아래의 3번 내용으로 넘어가면 된다.)
vim ~/.bash_profile
- 아래의 방법을 통해 내용들을 입력해 준다. (복사한 경로만 수정해서 붙여 넣기 하면 된다.)
- 키보드로 i(insert)를 입력하고 내용을 적는다.
- 내용을 다 적고 esc를 누른다.
- :wq! 를 입력하면 적은 내용이 저장되면서 에디터에서 나가진다. [w:저장, q:나가기, wq:저장 후 나가기]
JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME
export PATH
- vim에디터를 저장한 후 아래의 명령어를 통해 환경변수를 적용시켜준다.
source .bash_profile
- 아래의 명령어를 통해 환경변수가 제대로 세팅되었는지 확인한다.
- 아래 이미지와 같이 내가 설정해준 경로가 제대로 나오는것을 알 수 있다.
echo $JAVA_HOME
- 마지막으로 아래의 명령어로 다시 자바 버전을 확인한다.
- Java17에서 Java11로 변경된것을 확인했다.
java -version
3. 자바 환경변수가 변경되지 않음 (zsh에서는 bash 변경사항 적용이 안됨)
자바가 변경된줄 알았는데 터미널을 다시 열면 자바가 17로 돌아갔다.
- 최근 macOS에서는 기본 쉘이 bash에서 zsh로 바뀌었다. 그래서 .bash_profile에 자바 환경변수 설정을 했다면, zsh를 사용할 때는 적용이 안 될 수 있다.
- 나는 zsh를 사용하고 있었으니 bash_profile파일이 아니라 zshrc 파일을 변경했어야 했던 것이다.
zsh를 사용 중이라면 .zshrc 파일에 환경변수를 설정해야 한다.
- 터미널을 열고 vim ~/.zshrc 명령어로 .zshrc 파일을 연다.
- 아래와 같이 JAVA_HOME과 PATH 환경변수 설정을 여기에 추가한다. (아래의 2가지만 추가하면 된다.)
export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home
export PATH=$PATH:$JAVA_HOME/bin
에디터에서 저장한 다음 변경사항을 적용하는 명령어를 입력한다.
source ~/.zshrc
자바 버전 확인
- 드디어 변경에 성공했다. 터미널을 종료하고 다시 실행해도 적용한 환경변수대로 자바 버전이 출력되었다.
스크립트 검증 재시도
- 먼저 nGrinder를 재실행했다. (자바17에서 자바11로 변경했으니 재실행해야 적용된다.)
- 이후 검증을 시도했더니 아래와 같이 요청에 대한 결과를 200으로 잘 받는것을 확인할 수 있었다.
검증이 완료되었으니 스크립트를 저장하자
- 우측의 "저장/닫기" 버튼을 클릭한다.
- 저장에 성공하면 아래와 같이 스크립트 목록에 내가 추가한 스크립트가 보인다.
다음 포스트에서 테스트를 진행해 보자
같은 팀원인 "평양냉면"님의 블로그도 한번 방문해 보세요! 좋은 글이 많이 있습니다.
반응형
'DevOps > nGrinder' 카테고리의 다른 글
[nGrinder] ECS로 기동중인 SpringBoot 부하 테스트 (7) | 2024.02.15 |
---|---|
[nGrinder] 서버 부하 테스트 진행 (SpringBoot) (21) | 2024.02.14 |
[nGrinder] M1 Mac에 설치하기 (3) | 2024.02.14 |