gpt4 book ai didi

load-testing - 如何为 rest json 模板编写自定义 feeder

转载 作者:行者123 更新时间:2023-12-04 18:40:18 25 4
gpt4 key购买 nike

我编写了一个简单的“教程”应用程序,它提供了一个名为“世界端点”的 REST 接口(interface),您可以使用它来添加居民等。执行此操作的示例 json 请求可能如下所示:

{
"name": "Sergio Gonzales",
"age": "34",
"languages": [
{ "id": "119" },
{ "id": "14" }
],
"homeland": { "id": "121" },
"hometown": { "id": "155" }
}

我想添加一个加特林负载测试来测试新居民的“创造”。为了获取数据,我有三个不同的来源:
  • first_names.csv
  • last_names.csv
  • country_capital_language.csv

  • 前两个将用于创建随机名称(它当然不是创建有意义数据的高度复杂的方法)。最后一个将用于选择家乡、家乡和母语的 id。此外,我会随机选择额外的 0 - 3 种语言。

    我假设我必须为此编写一个自己的馈线,但遗憾的是,自定义馈线的文档似乎自 2.x.x 版本以来就消失了。

    编写馈线的好方法是什么?我的第一个想法是像这样直接加载 csv 数据:

    Source.fromInputStream(getClass.getResourceAsStream("/names/first_names.csv")).getLines.toSet



    不确定使用 csv("first_names.csv") 是否会是更好的方法?

    此外我也不知道,如何通过动态创建的数据替换 json 中的“语言”部分?是否有可能传递语言 ID 列表并自动翻译成有效的 json 数组?

    UDPATE

    这是我的第一个工作版本。它有缺陷,但基本上可以满足我的要求。如果有人对如何增强有建议,请不要犹豫(我对 scala 很陌生)。
    package com.u6f6o.apps.hazelnate.load.scenario

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

    import scala.concurrent.forkjoin.ThreadLocalRandom

    class Insert100kInhabitants extends Simulation {
    val random = ThreadLocalRandom.current
    val footprints = csv("data/footprints.csv").records
    val forenames = csv("data/forenames.csv").records
    val surnames = csv("data/surnames.csv").records

    val httpConf = http
    .baseURL("http://localhost:4567")
    .acceptHeader("application/json")
    .doNotTrackHeader("1")

    val scn = scenario("Insert100kInhabitants").repeat(10000){
    exec{ session =>
    val footprintRecords = chooseRandomly(footprints, 5)
    session.setAll(
    "forename" -> chooseRandomly(forenames).getOrElse("forename", ""),
    "surname" -> chooseRandomly(surnames).getOrElse("surname", ""),
    "age" -> random.nextInt(1, 110),
    "hometown" -> footprintRecords.head.getOrElse("city", ""),
    "homeland" -> footprintRecords.head.getOrElse("country", ""),
    "languages" -> footprintRecords.map{ x => x.getOrElse("language", "")}
    )
    }
    .exec(http("insert100kInhabitants")
    .post("/world/inhabitants")
    .body(StringBody( session => generateJson(session))).asJSON
    )
    }

    setUp(
    scn.inject(atOnceUsers(10))
    ).protocols(httpConf)

    def generateJson(session:Session) : String = {
    s"""{
    | "name": "${session("forename").as[String]} ${session("surname").as[String]}",
    | "age": "${session("age").as[String]}",
    | "hometown": "${session("hometown").as[String]}",
    | "homeland": "${session("homeland").as[String]}",
    | "languages": [
    | ${session("languages").as[Seq[String]].map{ x => s"""{ "id": "${x}" }"""}.mkString(", ")}
    | ]
    |}""".stripMargin
    }

    def chooseRandomly(pool:IndexedSeq[Record[String]]) : Record[String] = {
    pool(random.nextInt(pool.length))
    }

    def chooseRandomly(pool:IndexedSeq[Record[String]], maxLength:Int) : IndexedSeq[Record[String]] = {
    for (i <- 1 to random.nextInt(1, maxLength)) yield pool(random.nextInt(pool.length))
    }
    }

    最佳答案

    对于名字和姓氏,使用简单的 Feeder。

    对于更复杂的数据注入(inject)逻辑,不要使用 Feeder。写自定义exec(function)您在其中手动选择记录并将它们设置到 session 中。您仍然可以使用 Gatling 的 csv 解析器来加载数据:

    val records: Seq[Map[String, Any]] = csv("country_capital_language.csv").records

    由于您需要动态数量的语言,因此您将无法使用 Gatling EL 模板。
    您必须手动制作请求正文,请参阅 documentation .

    关于load-testing - 如何为 rest json 模板编写自定义 feeder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27636835/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com