在开环中加入重用会话

时间:2016-09-19 14:18:47

标签: load-testing gatling

对于负载测试,我有以下情况:

  • 登录
  • MainPage1
    • 第1页
  • MainPage2
    • 第2页
    • 第3页
    • 第4页
  • MainPage3
    • 第5页
    • 第6页

使用具有一些动态值的登录表单对Web应用程序防火墙(WAF)执行登录。

我必须建模一个开环,所以我需要一个恒定的request / s或users / s。问题是,我无法不断注入新用户,因为如果速率太高,WAF会有效地限制登录步骤阻止请求。

所以我需要为每个用户只创建一次会话cookie,并在其余的负载测试中重复使用cookie。

我使用了这种情况:

val users = ...
val rampup = ...
val duration = ...

var login = exec(_.set("username", username).set("password", password))
    .exec(WAF.login)
    .exec(flushHttpCache)

val scn1 = scenario("Scenario 1")
    .exec(login) // only once for each user
    .during(duration seconds) { //repeat for the rest of the test
      group("Page"){
        exec(Pages.mainPage1)
         .exec(Pages.mainPage2)
         .exec(Pages.mainPage3)
     }
  }

setUp(
  scn1.inject(rampUsers(users) over(rampup seconds))
).protocols(httpProtocol)

但是这模拟了一个闭环,“Page”组的每次迭代都被SuT的响应时间限制。 我尝试.throttle场景,但是这会创建一个上限,不会低一些。

我不能使用constantUsersPerSec,因为这会为每次迭代创建一个新用户,这被WAF有效阻止。

在实际测试场景之前,是否有其他方法可以设置和重用会话?或者以其他方式设置恒定速率测试?

1 个答案:

答案 0 :(得分:0)

我有类似的问题 - 不是因为登录率封锁,而是因为我们想要测试不同微服务的端点而不在这些模拟中测试登录微服务(它们在单独的模拟/管道中进行测试)。

我希望每次性能测试只登录一次,通常持续30-60秒,并注入数百或数千个用户。我不知道这种方法是否适合您,但在我们的情况下,我需要传递仅在登录过程中生成的cookie。

所以,我使用Apache HttpClient提取了通过登录Htpp POST请求收集的cookie:

def getLoginCookies() : Array[Header] = {
  val nameValuePairs = new util.ArrayList[NameValuePair](10)
  nameValuePairs.add(new BasicNameValuePair("username", loginUsername))
  nameValuePairs.add(new BasicNameValuePair("password", loginPassword))

  val response = getHttpPostResponse(baseUrl + loginUrl, nameValuePairs)

  val cookies = response.getHeaders("Set-Cookie")
  response.close()
  cookies
}

private def getHttpPostResponse(url: String, nameValuePairs: util.ArrayList[NameValuePair]) : CloseableHttpResponse = {
  val client = HttpClientBuilder.create().build()
  val post = new HttpPost(url)
  post.setEntity(new UrlEncodedFormEntity(nameValuePairs))
  val response = client.execute(post)
  client.close()
  response
}

在方案对象中,我正在收集所有cookie值:

private val cookies = getLoginCookies()

private var cookieValue = ""
for (cookie <- cookies) {
  cookieValue += cookie.getValue + ";"
}

...我在我的场景中指定了后续Http GET请求的标题,例如:

  private lazy val homepage =
    exec(http(name)
     .get(url)
     .header(HttpHeaderNames.Cookie, cookieValue)
     .disableFollowRedirect
     .check(status.is(200)))

希望有助于或至少给出一个提示。