본문 바로가기
Today I learned

2020 11 11

by soheemon 2020. 11. 11.

Gatling

 

이전시간에 테스트 시나리오를 모듈화를 했어요.

이제 client의 수를 늘려봅시다.

 

# 사용자 수를 늘리려면?

2. 가상 사용자 구성

val users = scenario("Users").exec(Search.search, Browse.browse)			//구매자를 가정한 시나리오
val admins = scenario("Admins").exec(Search.search, Browse.browse, Edit.edit)	//판매자를 가정한 시나리오

setUp(users.inject(atOnceUsers(10)).protocols(httpProtocol))	//10명의 사용자가 한번에 빵!쏜다.

# 사용자의 시나리오 시작 시점에 변화를 주려면?

atOnceUsers()는 지정한 사용자가동시에 request를 날린다.

하지만 rampUsers를 사용하면 사용자들 사이에 일정한 간격을 두고 request를 날릴 수 있다.

 

//시나리오 시작
// 10명의 사용자가 10초간격으로 요청을 보낸다 (user 시나리오)
// 2명의 사용자가 10초 간격으로 요청을 보낸다 (admin 시나리오)
setUp(
  users.inject(rampUsers(10) during (10 seconds)),
  admins.inject(rampUsers(2) during (10 seconds))
).protocols(httpProtocol)

 

대충 이런 그래프가 된다.. 성능측정할때 많이 봤었던 모양.... 이런 의미였구나!

# 검색어를 동적으로 넘기자

3. Feeders 및 Checks와 함께 동적 데이터 사용

이제 사용자의 숫자까지 설정했지만, 모두 동일한 단어를 검색하고있다. 서로 다른 단어를 검색하도록 변경해보자.

Fidder는 시나리오에서 사용하려는 값들이 저장된 곳이다. DB나 csv 등등 여러 유형이 있다. 다양한 피더를 확인하려면 여기

 

search.csv라는 파일을 만들어 user-files 폴더에 넣자.

// search.csv
searchCriterion,searchComputerName
Macbook,MacBook Pro
eee,ASUS Eee PC 1005PE

# 검색어를 CSV 파일에서 파라미터 읽어와서 동적으로 스크립트에 포함시키기

# response에서 EL과 DOM메서드를 활용하여 데이터 값 긁어오기

search.csv

searchCriterion,searchComputerName	// 열이름..
Macbook,MacBook Pro					// 값들
eee,ASUS Eee PC 1005PE

object Search {

  val feeder = csv("search.csv").random // 무작위로 가져온다. (기본은 queue)

  val search = exec(http("Home")
    .get("/"))
    .pause(1)
    .feed(feeder) // 사용자가 피드 단계에 도달할 때 마다 피드에서 임의의 레코드를 선택한다.
    .exec(http("Search")
      .get("/computers?f=${searchCriterion}") // EL을 통해 검색을 매개변수로 교체한다.
      .check(css("a:contains('${searchComputerName}')", "href").saveAs("computerURL"))) // response에서 text태그값을 ${searchComputerName}값으로 갖는 a태그의 href값을 가져온다..어렵당
    .pause(1)
    .exec(http("Select")
      .get("${computerURL}")) // 6
    .pause(1)
}

대충 이런 구조이다.

1) 파일에서 ${컬럼명}으로 사용자별로 랜덤으로 값을 가져와서

2) response에서 ${컬럼명}값이 a태그의 text태그와 일치하는 href속성을 가져와서---

3) 그 페이지로 이동한다.

 

"어렵다"

 

#시나리오를 반복하기

1) 반복되는 exec 블록을 함수로 추출한다.

// repeat 사용 전
object Browse {

  def gotoPage(page: Int) = exec(http("Page " + page)
    .get("/computers?p=" + page))
    .pause(1)

  val browse = exec(gotoPage(0), gotoPage(1), gotoPage(2), gotoPage(3), gotoPage(4))
}

// repeat 사용 후
object Browse {

  val browse = repeat(5, "n") { 5회 반복, 세션에 저장된 카운터의 이름(n)을 사용한다.
    exec(http("Page ${n}")
      .get("/computers?p=${n}")) // 파라미터로 n을 받아서 이동한다.
      .pause(1)
  }
}

 

'Today I learned' 카테고리의 다른 글

2020 11 22  (0) 2020.11.22
2020 11 19  (0) 2020.11.19
2020 11 09  (0) 2020.11.09
2020 11 06  (0) 2020.11.06
2020 11 05  (0) 2020.11.05

댓글