Gatling Load Test - возможен ли XML-файл в качестве фида? - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть конечная точка, которая принимает специально отформатированный XML.Я пытаюсь использовать аналогичную функцию в качестве циркулярного файла XML для канала.Я могу сделать это с помощью файла CSV, но я не могу получить это с файлом XML.Это вообще возможно сделать?

Я также читал это: https://gatling.io/docs/3.0/session/feeder/?highlight=feeder#file-based-feeders

Я также довольно новичок в гатлинге и пока написал только один нагрузочный тест.

Вот пример кода, который у меня есть:

object ProcessXml {

val createProcessHttp = http("Process XML")
    .post("/myEndpointPath")    
    .body(RawFileBody("data/myXml.xml"))
    .asXML
    .check(status is 200)

val createProcessShipment = scenario("Process Shipment XML")
    .feed(RawFileBody("data/myXml.xml).circular) // feed is empty after first user
    .exec(createProcessHttp)
}

По какой-то причине аргумент .feed () для csv работает (csv (Environment.createResponseFeedCsv) .circular; где createResponseFeedCsv определен вмой файл Environment под утилитами).

Любая помощь по этому вопросу будет принята с благодарностью.Заранее спасибо.

1 Ответ

0 голосов
/ 26 сентября 2018

CSV-фидер работает только со значениями, разделенными запятыми, поэтому теоретически вы можете подготовить CSV-файл только с одним столбцом, и этот столбец может быть списком однострочных представлений ваших файлов XML (при условии, что они не содержат запятых).Но в вашем случае было бы лучше использовать тот факт, что Feeder[T] это просто псевдоним для Iterator[Map[String, T]], чтобы вы могли определить свой собственный фидер, например.читает список файлов из определенного каталога и постоянно перебирает список их путей:

val fileFeeder = Iterator.continually(
  new File("xmls_directory_path") match {
    case d if d.isDirectory => d.listFiles.map(f => Map("filePath" -> f.getPath))
    case _ => throw new FileNotFoundException("Samples path must point to directory")
  }
).flatten

Таким образом, этот фидер будет заполнять атрибут filePath путем к пути файлов из каталога xmls_directory_path.Поэтому, если вы загрузите его со всеми вашими примерами XML, вы можете вызвать RawFileBody() с этим атрибутом filePath (извлеченным с помощью Gatling EL ):

val scn = scenario("Example Scenario")
  .feed(fileFeeder)
  .exec(
    http("Example request")
      .post("http://example.com/api/test")
      .body(RawFileBody("${filePath}"))
      .asXML
  )

Или, если хотите.хотел бы использовать его в других сценариях, вы можете определить свой собственный FeederBuilder класс fe:

class FileFeeder(path: String) extends FeederBuilder[File]{
  override def build(ctx: ScenarioContext): Iterator[Map[String, File]] = Iterator.continually(
    new File(path) match {
      case d if d.isDirectory => d.listFiles.map(f => Map[String, File]("file" -> f))
      case _ => throw new FileNotFoundException("Samples path must point to directory")
    }
  ).flatten
}

В этом случае логика похожа, я только что изменил ее для подачи атрибута file с File объект, так что он может быть использован в большем количестве случаев использования.Поскольку он не возвращает String путь, нам нужно извлечь его из File с помощью SessionExpression[String] fe:

val scn = scenario("Example Scenario")
  .feed(new FileFeeder("xmls_directory_path"))
  .exec(
    http("Example request")
      .post("http://example.com/api/test")
      .body(RawFileBody(session => session("file").as[File].getPath))
      .asXML
  )
...