我使用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
答案 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
(该目录中还包含您的data
和request-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)。