1

我尝试了从该站点上的其他示例中找到的所有建议,但我仍然无法让我的 Gatling 测试将身份验证令牌从 POST 传递到以下 GET。令牌取自 POST 的返回正文,并作为标头传递给 GET

最初登录是在 BaseSimulationTest 但我把它放在 GetDealsTests 进行故障排除

我尝试过的步骤:

  1. 我添加了这个: //println(" Token value" + session("accessToken").as[String]) 我能够看到我在终端中得到了一个字符串,这似乎表明 accessToken 是一个空值
  2. 我尝试在方法和全局中声明 var accessValue 和 var accessToken 。没变。
  3. 在传递令牌后,我尝试检查 GET 上的标头值,但.check(header.is(expected = ${accessToken}))似乎只是出错了
  4. 我已将登录 POST 和 GET 放在相同的方法、不同的方法等中
  5. 我尝试从 .formParam 而不是在请求语句的正文中传递用户名和密码

我需要将标题作为地图吗?这是范围的事情吗?我需要以不同的方式声明变量吗?测试以“预期 200 但收到 401”类型的结果运行。我认为 POST 甚至没有看到传递给它的令牌。

class GetDealsTests extends BaseSimulationTest {

  def logIn2() = {
    exec(http("Log in")
      .post(getUrl() + "login")
      .header("Content-Type", "application/json")
      .body(ElFileBody("bodies/Login.json")).asJson
      .check(status.is(200))
      .check(jsonPath("$.access_token").saveAs("accessToken")))
        exec(
        session=>{
          accessValue = session("accessToken").as[String]
          session
        })
  }

  def getAllDeals() = {

    exec(_.set("accessToken", accessValue))
      .exec(
        http("Get all deals")
          .get("deals/all")
            .header("Authorization", "Bearer" + "${accessToken}")
            .check(status.is(200))
          
      )
  }


  val scnGetAllDeals = scenario("Get All Deals endpoint tests")
    .forever() {
      exec(logIn2())
      exec(getAllDeals())
    }

  setUp(
    scnGetAllDeals.inject(
      nothingFor(5 seconds),
      atOnceUsers(users))

  ).protocols(httpConf.inferHtmlResources())
  .maxDuration(FiniteDuration(duration.toLong, MINUTES))
}

我查看了以下内容:Gatling won't save access tokenGatling Scala:Unable to send auth token to the method using session variableGatling - Setting Authorization header as part of request and don't see what I'm doing wrong

4

1 回答 1

0

许多事:

  1. logIn2 和 getAllDeals 都缺少正确链接不同方法调用的点。例如,这是您的 logIn2 实际在做的事情(正确格式化有帮助):
def logIn2() = {
  val discardedResult = exec(http("Log in")
    .post(getUrl() + "login")
    .header("Content-Type", "application/json")
    .body(ElFileBody("bodies/Login.json")).asJson
    .check(status.is(200))
    .check(jsonPath("$.access_token").saveAs("accessToken")))
  return exec(
    session => {
      accessValue = session("accessToken").as[String]
      session
    })
}
  1. 您可能不应该使用全局变量。你不需要它,而且这样的构造不是线程安全的,所以在负载下,虚拟用户将同时更新和读取这个引用,结果会一团糟。

  2. 您的 Authorization 标头中在 Bearer 和实际值之间缺少一个空格。

  3. asJson只是一个快捷方式.header("Content-Type", "application/json"),所以你设置这个标题两次。

class GetDealsTests extends BaseSimulationTest {

  val logIn2 =
    exec(http("Log in")
      .post(getUrl() + "login")
      .body(ElFileBody("bodies/Login.json")).asJson
      .check(status.is(200))
      .check(jsonPath("$.access_token").saveAs("accessToken")))

  val getAllDeals =
     exec(
        http("Get all deals")
          .get("deals/all")
            .header("Authorization", "Bearer ${accessToken}")
            .check(status.is(200))
          
      )


  val scnGetAllDeals = scenario("Get All Deals endpoint tests")
    .forever {
      exec(logIn2)
      .exec(getAllDeals)
    }

  setUp(
    scnGetAllDeals.inject(
      nothingFor(5 seconds),
      atOnceUsers(users))

  ).protocols(httpConf.inferHtmlResources())
  .maxDuration(FiniteDuration(duration.toLong, MINUTES))

}
于 2020-07-28T05:51:33.513 回答