체크(Check)로 응답 검증하고 값 뽑아내기
체크(Check)로 응답 검증하고 값 뽑아내기
요청을 보내고 나면 응답이 기대대로 왔는지 확인해야 하죠. 체크(check)는 요청의 응답이 기대와 맞는지 검증하고, 응답에서 나중에 재사용할 요소를 추출하는 데 쓰여요. 이 글은 Gatling이 공식 지원하는 모든 프로토콜에서 쓸 수 있는 일반적인 체크를 설명해요. HTTP의 status처럼 프로토콜 고유의 체크는 이 페이지가 아니라 해당 프로토콜 문서에서 다뤄요.
체크는 check 메서드로 보통 부모 객체에 붙여 써요. 응답 검증과 요소 추출이 체크의 두 가지 목적이에요.
본문
기본 사용법
HTTP 요청에 체크를 붙이는 기본 형태는 이래요.
http("Gatling").get("https://gatling.io")
.check(status.is(200))
여러 체크를 한 번에 정의할 수도 있어요.
http("Gatling").get("https://gatling.io")
.check(status.not(404), status.not(500))
Gatling은 체크를 다음 순서로 연결하는 메서드들을 제공해요.
- 체크 타입 정의
- 추출(extract)
- 변환(transform)
- 검증(validate)
- 이름 붙이기(name)
- 저장(save)
일반 체크 타입
// 응답 시간이 100ms 이하인지
.check(responseTimeInMillis.lte(100))
substring
응답 본문 텍스트 안에서 주어진 부분 문자열의 등장 위치(index)를 찾는 체크예요. pattern은 일반 String, Gatling EL String, 또는 함수가 될 수 있어요.
regex
응답 본문 텍스트에 Java 정규식 패턴을 적용하는 체크예요. pattern은 일반 String, Gatling EL String, 또는 함수가 될 수 있어요.
xpath
XML 응답 본문에 XPath 질의를 적용하는 체크예요. 두 매개변수를 받아요.
expression: 일반String, Gatling ELString, 또는 함수namespaces(선택): (prefix, uri) 쌍의 List. 문서에 네임스페이스가 있으면 필수예요.
.check(
// 네임스페이스가 없는 문서용 단순 표현식
xpath("//input[@id='text1']/@value"),
// 네임스페이스가 있는 문서에는 namespaces 매개변수가 필수
xpath("//foo:input[@id='text1']/@value", Map("foo" -> "http://foo.com"))
)
XPath는 well-formed XML 문서에서만 동작해요. HTML은 그렇지 않으니, HTML 문서를 파싱한다면 CSS 셀렉터 지원을 살펴보세요.
jsonPath
JsonPath는 JSON용 XPath 같은 구문이에요.
.check(
// 정적 값으로
jsonPath("$..foo.bar[2].baz").is("expected"),
// Gatling EL 문자열로
jsonPath("$..foo.bar[#{index}].baz"),
// 함수로
jsonPath(session => "$..foo.bar[" + session("index").as[Int] + "].baz")
)
jsonpJsonPath는 JSONP용으로 같은 동작을 하는 체크예요.
jmesPath
expression은 일반 String, Gatling EL String, 또는 함수가 될 수 있어요. jsonpJmesPath는 JSONP용이에요.
css
CSS 셀렉터로 HTML 본문의 DOM 노드를 선택하는 체크예요.
selector: 일반String, Gatling ELString, 또는 함수attribute(선택): 선택한 DOM 노드의 속성을 타깃으로 할 때 쓰는 정적String
.check(
// 정적 값으로
css("#id"),
// Gatling EL 문자열로
css("##{id}"),
// 함수로
css(session => "#" + session.getString("id")),
// 속성까지
css("article.more a", "href")
)
form
.check(form("myForm"))
md5, sha1
체크섬은 청크 스트림 기준으로 계산되므로 응답 본문 전체를 메모리에 저장하지 않아요.
.check(md5.shouldBe("???"), sha1.shouldBe("???"))
추출(Extracting)
추출 단계에서는 원하는 occurrence(발생)를 걸러내요. 추출 단계를 명시하지 않으면 Gatling이 암시적으로 find를 수행해요.
검증(Validating)
검증 단계를 명시하지 않으면 Gatling이 암시적으로 exists를 수행해요.
is — 값 일치 검증
추출한 값이 기대값과 같은지 검증해요. expected는 추출 값과 타입이 일치하는 일반 값, Gatling EL String, 또는 함수가 될 수 있어요. Kotlin에서 is는 예약어이므로 백틱(is)으로 감싸거나 shouldBe 별칭을 쓰세요.
.check(
// 정적 값으로
jmesPath("foo").is("expected"),
// Gatling EL 문자열 (메서드가 다르니 주의)
jmesPath("foo").isEL("#{expected}"),
// 함수로
jmesPath("foo").is(session => session.getString("expected"))
)
exists — 존재 검증
추출한 값이 존재하는지 검증해요.
.check(jmesPath("foo").exists)
in — 목록 안에 포함 검증
추출한 값이 주어진 값들 중 하나인지 검증해요. Kotlin에서 in은 예약어이므로 백틱이나 within 별칭을 쓰세요.
.check(
// 정적 값들로
jmesPath("foo").in("value1", "value2"),
// 세션의 List를 가리키는 Gatling EL 문자열 (메서드가 다름)
jmesPath("foo").inEL("#{expectedValues}")
)
조건부 체크 — checkIf
// 조건이 참일 때만 체크
.checkIf("#{bool}") {
jsonPath("$..foo")
}
// 함수로 조건 계산
.checkIf(session => session("key").as[String] == "executeCheck") {
jsonPath("$..foo")
}
한눈에 보는 종합 예시
.check(
// 응답 본문에 https 링크가 5개인지
regex("https://(.*)").count().shouldBe(5),
// https 링크의 첫 번째는 www.google.com, 두 번째는 gatling.io인지
regex("https://(.*)/.*").findAll().shouldBe(Seq("www.google.com", "gatling.io")),
// 응답 본문에 "someString"의 두 번째 등장이 있는지
substring("someString").find(1).exists(),
// 응답 본문에 "someString"이 없어야 하는지
substring("someString").notExists()
)