情景

时间:2017-01-05 15:48:48

标签: gatling

我遇到一个问题,它看起来来自馈线的数据没有添加到会话中。我正在测试一个用户有角色的系统(即用户或管理员),我需要根据角色执行各种测试。在高级教程之后,我将链分成不同的对象(每个对象在自己的文件中) - 其中一个对象包含登录过程,无论用户角色如何,都是相同的。我不会重复使用它,但使用不同的馈线。

我使用csv馈送器加载用户名和密码,但看起来它无法将数据添加到会话中,因为我在运行模拟时得到Failed to build request Submit user/password: No attribute named 'password' is defined

这是我的代码,它被分成多个文件:

Simulation.scala

import io.gatling.core.Predef._
import io.gatling.http.Predef._

class Simulation extends Simulation {  
  val httpProtocol = http
    .baseURL("baseURI")

  val admins = scenario("Admins")
    .feed(csv("admins.csv"))
    .exec(Login.login)
    .exec(TaskA.taskA)

  val users = scenario("Users")
  .feed(csv("users.csv"))
  .exec(
    Login.login,
    TaskB.taskB,
    TaskC.taskC
  )


  setUp(
    admins.inject(atOnceUsers(1))/*,
    users.inject(atOnceUsers(1))*/
  ).protocols(httpProtocol)
}

Login.scala

object Login {
  val login = group("Login") {
    exec(http("Get form")
    .get("/login/login.php")
    .check(form("""form[name="relay"]""").saveAs("passwordForm")))
    .pause(10 seconds)

    .exec(http("Submit user/password")
    .post("/login/authenticate.php")
    .form("${passwordForm}")
    .formParam("pass", "${password}") //TODO: get from feeder
    .formParam("user", "${username}") //TODO: get from feeder
)
}
}

目前csv文件是相同的:

username,password
user,user

奇怪的是,如果我将.feed(csv("admins.csv"))移动到Login.scala中,它会起作用,但是我无法为用户重复使用它。

1 个答案:

答案 0 :(得分:1)

解决方案非常简单 - 将不同的Login实例注入每个场景,如下所示:

<强> Login.scala

object Login {
  def login(feeder: FeederBuilder[_]): ChainBuilder = {
     feed(feeder)
     ...
  }
}

然后在模拟中

<强> Simulation.scala

import io.gatling.core.Predef._
import io.gatling.http.Predef._

class Simulation extends Simulation {  
  val httpProtocol = http
    .baseURL("baseURI")

  val admins = scenario("Admins")
    .exec(Login.login(csv("admins.csv")))
    .exec(TaskA.taskA)

  val users = scenario("Users")
  .exec(
    Login.login(csv("users.csv")),
    TaskB.taskB,
    TaskC.taskC
  )


  setUp(
    admins.inject(atOnceUsers(1))/*,
    users.inject(atOnceUsers(1))*/
  ).protocols(httpProtocol)
}