2014-09-10 45 views
1

我使用JSON料器JSON输出由Web服务如下比较比较Web服务JSON响应,加特林: - 使用jsonFileFeeder

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

这个错误似乎表明'matchWith'函数和'JSONCompare'对象不存在 - 这是真的,在Gatling中没有这样的代码(我猜'JSONCompare'来自JSONAssert,不确定'matchWith' )。虽然可能修复此代码,但是您是否考虑过使用jsonPath,我怀疑这会证明更容易,更灵活? – 2014-09-10 13:25:04

+0

@James_pic: - 请问您可以添加一些snipet代码,我如何使用JSONFeeder来比较Web服务JSON响应? – 2014-09-10 13:34:06

+0

JSON响应有多大?另外,重要的是它完全匹配,还是仅仅检查返回的JSON的一个或两个元素会令人满意? – 2014-09-10 13:45:21

回答

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))) 
} 

它假设有一个文件在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预计可以在不使用类似黑客的情况下比较响应和文件(尽管当前的开发版本只支持逐字节比较,而不是比较-as-JSON)。

+0

谢谢@James: - 在这里,我正在尝试做精确度测试。 – 2014-09-10 14:44:43

+0

我有一个gatling-charts-highcharts-2.0.0-RC3 \ user-files \ data \ output.json文件,我用'\ output.json'尝试了你的代码,并且没有反斜杠,但失败并显示错误消息。线程“main”中的异常java.lang.ExceptionInInitializerError由com.fasterxml.jackson.databind引起。JsonMappingException:由于输入结束 at [Source:UNKNOWN; line:1,column:1] – 2014-09-10 14:49:48

+0

是的,它需要在'user-files'中,而不是'user-files \ data'中,而* front *斜线是必需的。对不起,我不能给你的目录的确切名称 - 加特林有几个不同的配置,你可以使用它,文件的确切位置可能会有所不同(我使用Maven,它将资源保存在“资源”目录中)。 – 2014-09-10 14:52:34