加特林负载测试-可能将XML文件作为提要?

时间:2018-09-25 19:57:08

标签: xml scala load-testing gatling scala-gatling

我有一个采用特殊格式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)
}

由于某种原因,csv的.feed()参数起作用(csv(Environment.createResponseFeedCsv).circular;其中createResponseFeedCsv在我的环境文件中的utils下定义)。

在此问题上的任何帮助将不胜感激。 预先感谢。

1 个答案:

答案 0 :(得分:0)

CSV馈送器仅适用于逗号分隔的值,因此从理论上讲,您可以仅用一列准备CSV文件,并且该列可以是XML文件的单行表示形式的列表(假设这些不包含任何逗号)。但是,根据您的情况,最好使用Feeder[T]只是Iterator[Map[String, T]]的别名这一事实,以便您可以定义自己的供料器fe。从某些目录读取文件列表,并不断遍历其路径列表:

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()属性(用Gatling EL提取)来调用filePath

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 fe从SessionExpression[String]中提取它:

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
  )