2014-09-10 74 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