2

我在文件中有一个带有 Json 请求正文的文件。我想使用 constantUsersPerSec(..) 对每秒发送恒定数量请求的网络进行基准测试。

但是,每次发送请求时,我都希望从请求列表中获取它(随机或循环,我不在乎)。

我不知道如何用加特林做到这一点。使用以下代码,请求被随机选择一次,并一遍又一遍地发送相同的请求。这不是我想要的

我的代码:

class GcStressManyRequests extends Simulation{ 
  ...
  ...
    val httpProtocol: HttpProtocolBuilder = http
    .baseURL(baseUrl)
    .contentTypeHeader(contentType)  

    var requests = Source.fromResource("bodies/requests.txt").getLines().toIndexedSeq
    val random = new Random(System.currentTimeMillis())

    val scn: ScenarioBuilder = scenario("AE prod requests")
    .exec (
         http("bid_request")
         .post(endpoint)
         .body(StringBody(requests(random.nextInt(requests.length))))
         .asJSON
         .check(status.is(200))) 

         setUp(
         scn.inject(
         constantUsersPerSec(400) during (1 minutes),
         ).protocols(httpProtocol))

 }
4

3 回答 3

3

我看到您在文本文件body.txt中有您的请求。对于您的任务,我将使用Feeder(检查步骤 03)。使用 feeder,您可以从项目列表中检索随机项目并在您的呼叫中使用它。您必须采取的步骤才能使其发挥作用:

  1. 将您的文本文件转换为 csv 文件,csv 文件只需要一个标题,然后是值。每个值一行。假设您将标题命名为“请求”。
  2. 创建馈线:

    val random_request = csv("bodies.csv").random
    
  3. 编辑场景:

     val scn: ScenarioBuilder = scenario("AE prod requests")
       .feed(random_request) //Puts a random request in your session.
       .exec (
         http("bid_request")
         .post(endpoint)
         .body(StringBody(${request})) //Retrieve the request from current session.
         .asJSON
         .check(status.is(200))) 
    
     setUp(
       scn.inject(
       constantUsersPerSec(400) during (1 minutes),
     ).protocols(httpProtocol))
    
于 2018-02-05T08:23:27.607 回答
2

为了完整起见,我想分享 Domingos Creado 关于对我有用的 Gatling Google Groups 的回答。

val scn: ScenarioBuilder = scenario("AE prod requests")
.exec(session => {
          val session2 = session.set("therequest", requests(random.nextInt(requests.length)))
          session2
        })
.exec (
     http("bid_request")
     .post(endpoint)
     .body(StringBody("${therequest}"))
     .asJSON
     .check(status.is(200))) 
于 2018-02-02T19:44:24.290 回答
1

第 1 步:在我的情况下创建输入是堆栈。下面只是一种您可以使用自己的实现的方法

var jobsQue: Stack[InputData] = GenerateInput.creatJobsCollection()

第 2 步:使用它

val execScn = scenario("Requests").group("Groups") {
asLongAs(session => jobsQue.length > 0) {  exec { session =>
    var length = jobsQue.length  //Whatever
    var reportElement = jobsQue.pop(); //POP it } } }

希望这对您有所帮助。

于 2018-02-02T17:35:36.390 回答