티스토리 뷰
출처
https://github.com/naver/ngrinder/wiki/Frequently-Asked-Question
https://velog.io/@max9106/nGrinderPinpoint-test2
https://flowlog.tistory.com/80
먼저 이번에 작성한 시나리오는
로그인 -> 장바구니에 상품 담기 -> 주문 순으로 이루어졌다.
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 static net.grinder.util.GrinderUtils.* // You can use this if you're using nGrinder after 3.2.3
import groovy.json.JsonSlurper
import groovy.json.JsonBuilder
import org.junit.Before
import org.junit.BeforeClass
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.Cookie
import org.ngrinder.http.cookie.CookieManager
/**
* A simple example using the HTTP plugin that shows the retrieval of a single page via HTTP.
*
* This script is automatically generated by ngrinder.
*
* @author admin
*/
@RunWith(GrinderRunner)
class TestRunner {
public static GTest test1
public static GTest test2
public static GTest test3
public static HTTPRequest request
public static Map<String, String> headers = [:]
public static Map<String, Object> params = [:]
public static List<Cookie> cookies = []
//request에 담을 토큰 값 설정
private static String token
@BeforeProcess
public static void beforeProcess() {
HTTPRequestControl.setConnectionTimeout(300000)
test1 = new GTest(1, "POST /api/members/login")
test2 = new GTest(2, "POST /api/products/cart/{productId}")
test3 = new GTest(3, "POST /api/products/order-one")
request = new HTTPRequest()
grinder.logger.info("before process.")
}
@BeforeThread
public void beforeThread() {
test1.record(this, "test1")
test2.record(this, "test2")
test3.record(this, "test3")
grinder.statistics.delayReports = true
grinder.logger.info("before thread.")
}
//로그인
@Test
public void test1() {
// 로그인 API에 요청을 보내서 JWT 토큰을 받아옴
HTTPResponse response = request.POST("http://api.whitenation.shop/api/members/login", [username: "zser30", password: "abcd1234?"])
//grinder.logger.info("처음에 추가되는 토큰: {}", response.getHeader("Authorization").toString().substring(15))
//토큰 앞에 붙는 쓸데없는 String 제거
token = response.getHeader("Authorization").toString().substring(15);
//헤더에 넣어줌
headers.put("Authorization", token)
//헤더 가져옴
def result = response.getHeader("Authorization");
//grinder.logger.info("header: {}", result)
if (response.statusCode == 301 || response.statusCode == 302) {
grinder.logger.warn("Warning. The response may not be correct. The response code was {}.", response.statusCode)
} else {
assertThat(response.statusCode, is(200))
}
grinder.logger.info("response: {}", response.getBodyText())
}
// 장바구니에 상품 추가
@Test
public void test2() {
def productId = "4"
//grinder.logger.info("봐야되는거: {}", headers)
//로그인 할 때 가져온 걸로 request에 담음
request.setHeaders(headers)
//grinder.logger.info("header: {}", headers)
HTTPResponse response = request.POST("http://api.whitenation.shop/api/products/cart/" + productId);
//response가 성공하면 201로 찍힘
assertThat(response.statusCode, is(201));
//grinder.logger.info("response: {}", response.getBodyText())
if (response.statusCode == 301 || response.statusCode == 302) {
grinder.logger.warn("Warning. The response may not be correct. The response code was {}.", response.statusCode)
} else {
assertThat(response.statusCode, is(201))
}
//grinder.logger.info("response: {}", response.getBodyText())
}
@Test
public void test3() {
// 상품 주문
request.setHeaders(headers)
params = ["productId": 4, "quantity": 2]
//setBody로 하면 타입이 안맞는다고 하면서 에러남
HTTPResponse response = request.POST("http://api.whitenation.shop/api/products/order-one",params)
assertThat(response.statusCode, is(200))
if (response.statusCode == 301 || response.statusCode == 302) {
grinder.logger.warn("Warning. The response may not be correct. The response code was {}.", response.statusCode)
} else {
assertThat(response.statusCode, is(200))
}
//grinder.logger.info("response: {}", response.getBodyText())
}
}
GTest 객체는 각각 테스트 시나리오,
예를 들어 하나당 로그인, 장바구니 담기 등에 해당되는 것이다.
@BeforeProcess -> 테스트가 시작되기 전에 실행되는 메서드. 한 번 실행
@BeforeThread -> 스레드가 시작되기 전에 실행되는 메서드. 스레드가 시작될 때마다 실행.
@BeforeProcess -> @BeforeThread -> HTTP 요청 순서로 실행된다.
'Learned!' 카테고리의 다른 글
Jmeter로 테스트 시나리오 작성하기 / 로그인 물고 테스트하기 (1) | 2023.03.14 |
---|---|
m1 mac brew 로 jmeter 설치했을 때 경로 (0) | 2023.03.13 |
look - aside 캐싱 전략을 적용하는 과정 기록 (0) | 2023.03.03 |
redis에 넣어둔 캐시 조회가 안되던 문제 (0) | 2023.02.28 |
redisson lock 설정하고 조회할 때 에러 /java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id: ~~~ (0) | 2023.02.27 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 대규모더미데이터
- 항해
- jmeter테스트
- 인덱스
- jmeter로그인
- Redisson
- CheckedException
- bankersRounding
- 프로그래머스
- Redis
- jmeter부하테스트
- jwt
- EC2
- index
- 스프링faker
- hackerrank
- Java
- Spring
- jmeter쿠키
- 토큰
- jmeter세션
- 부하테스트시나리오
- 동적크롤링
- pessimisticlock
- Python
- jmeter토큰
- Lock
- CorrectnessAndTheLoopInvariant
- 자바
- jmeter시나리오
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함