Gatling: - 使用jsonFileFeeder比较Web服务Json响应

时间:2014-09-10 12:26:48

标签: json performance scala performance-testing gatling

我使用JSON馈送器来比较Web服务的JSON输出,如下所示,

 val jsonFileFeeder = jsonFile("test_data.json")

    val strategy = (value: Option[String], session: Session) => value.map { jsonFileFeeder =>
      val result = JSONCompare.compareJSON("expectedStr", "actualStr", JSONCompareMode.STRICT)
      if (result.failed) Failure(result.getMessage)
      else Success(value)
      }.getOrElse(Failure("Missing body"))

      val login = exec(http("Login")
       .get("/login"))
      .pause(1)
      .feed(feeder)
      .exec(http("authorization")
        .post("/auth")
        .headers(headers_10)
        .queryParam("""email""", "${email}")
        .queryParam("""password""", "${password}")
        .check(status.is(200))
        .check(bodyString.matchWith(strategy)))
      .pause(1)

但它会抛出错误

value matchWith is not a member of io.gatling.core.check.DefaultFindChe
ckBuilder[io.gatling.http.check.HttpCheck,io.gatling.http.response.Response,String,String]
15:10:01.963 [ERROR] i.g.a.ZincCompiler$ -         .check(bodyString.matchWith(jsonFileFeeder)))

s\lib\Login.scala:18: not found: value JSONCompare
15:10:05.224 [ERROR] i.g.a.ZincCompiler$ -       val result = JSONCompare.compareJSON(jsonFileFeeder, j
sonFileFeeder, JSONCompareMode.STRICT)
               ^
15:10:05.631 [ERROR] i.g.a.ZincCompiler$ - two errors found
Compilation failed

1 个答案:

答案 0 :(得分:1)

这是一个示例脚本,它在语义上将JSON响应与预期输出进行比较:

import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.core.json.Jackson
import java.nio.charset.StandardCharsets.UTF_8
import scala.concurrent.duration._

class BasicSimulation extends Simulation {
  lazy val expectedJson = Jackson.parse(
      getClass.getResourceAsStream("/output.json"),
      UTF_8
    )

  val scn = scenario("Scenario Name")
    .exec(http("request_1")
      .get("http://localhost:8000/output.json")
      .check(bodyString.transform(Jackson.parse).is(expectedJson))
    )

  setUp(scn.inject(atOnceUsers(1)))
}

假设output.json目录中有一个文件resources(该目录中还包含您的datarequest-bodies)。

但是,我认为您应该仔细考虑此解决方案是否适合您的需求。它不会像JSONPath或正则表达式检查一样进行扩展(特别是对于大型JSON文件),它不灵活,看起来更像是一个功能测试任务,而不是一个性能任务。我怀疑,如果您试图以这种方式比较JSON文件,那么您可能会尝试解决错误的问题。

请注意,它不会使用jsonFile,因为jsonFile被设计用作馈线,而我怀疑您想要将单个请求与硬编码响应进行比较。但是,如果您要使用不同的参数制作大量不同的请求并期望不同(已知)响应,jsonFile可能会很有用。这是采用这种方法的示例脚本:

import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.core.json.Jackson
import scala.concurrent.duration._

class BasicSimulation extends Simulation {
  val myFeed = jsonFile("json_data.json").circular

  val scn = scenario("Scenario Name")
    .feed(myFeed)
    .exec(http("request_1")
      .get("${targetUrl}")
      .check(bodyString.transform(Jackson.parse).is("${expectedResponse}"))
    )

  setUp(scn.inject(atOnceUsers(2)))
}

它假设data/json_data.json中有一个json资源,它看起来如下所示:

[
  {
    "targetUrl":"http://localhost:8000/failure.json",
    "expectedResponse":
      {
        "success": false,
        "message": "Request Failed"
      }
  },
  {
    "targetUrl":"http://localhost:8000/success.json",
    "expectedResponse":
      {
        "success": true,
        "message": "Request Succeeded"
      }
  }
]

expectedResponse应该是您希望从服务器返回的确切JSON。当然,您不必参数化targetUrl,您可以通过这种方式参数化。

顺便说一下,您可能也有兴趣知道Gatling 2.1应该允许将响应与文件进行比较,而不使用像这样的黑客攻击(尽管当前的开发版本仅支持逐字节比较,而不是比较 - 作为-JSON)。