SoapUI对于Json数据进行属性值获取与传递
SoapUI的Property Transfer功能可以很好地对接口请求返回的数据进行参数属性获取与传递,但对于Json数据,SoapUI会把数据格式先转换成XML格式,但实际情况却是,转换后的XML格式往往根本没法用Xpath形式获取到指定的数据了。因此只能用Script脚本形式了。
{"addUsersToDirectoryResponse":{"addUserToDirectoryResponse":[{"ack":"Success","userId":"2745379"}]}}
例如要获得userId的数据,有两种方式
一、建立一个script步骤,然后再建一个Property Transfer步骤,将script步骤的结果传递到指定的properties中的property中就可以了
import groovy.json.JsonSlurper
def xresponse = testRunner.testCase.testSteps["addUserToDirectory"].testRequest.response.contentAsString
def slurper = new JsonSlurper()
def result = slurper.parseText(xresponse)
def userId = result.addUsersToDirectoryResponse.addUserToDirectoryResponse[0].userId
二、直接在script步骤中赋值
import groovy.json.JsonSlurper
def xresponse = testRunner.testCase.testSteps["addUserToDirectory"].testRequest.response.contentAsString
def slurper = new JsonSlurper()
def result = slurper.parseText(xresponse)
def userId = result.addUsersToDirectoryResponse.addUserToDirectoryResponse[0].userId.toString()
//testSteps[]中括号中指定当前testCase中的哪个Properties步骤,setPropertyValue()方法中第一个userId参数指Properties步骤中名为userId的property,
第二个参数设定它的值,即上面从返回结果中获得的userId
testRunner.testCase.testSteps["Properties"].setPropertyValue("userId",userId)
另外,在断言中使用脚本断言时,如果也要获得testCase步骤中的property的话,不能直接使用
testRunner.testCase.testSteps["Properties"].getPropertyValue("userId")这样的形式,
否则会报"No such property: testRunner for clases: Script1"的错误
在Script Assertion中想要获得属性值的话可以用以下形式替代
def number = messageExchange.modelItem.testCase.testSteps["Properties"].getPropertyValue("userId")
对于项目中的属性可分为这么几个级别Global, Project,TestSuite, TestCase
即全局变量、项目级别、用例集级别、单个用例级别
要获得如项目级别的属性变量的话,可以用以下方法
def time_num=context.expand('${#Project#time_num}') //##号内为定义哪个级别的属性变量,后面为属性名
实例:
获取登录时的界面cookies值和登录相关的JsessionID
1 def setCookie = testRunner.testCase.testSteps["打开cas页面"].testRequest.response.responseHeaders["Set-Cookie"] 2 3 4 5 def JSessionId 6 if ((m = setCookie =~ /JSESSIONID=(\w*);/)) { 7 JSessionId = m.group(1) 8 testRunner.testCase.setPropertyValue( "JSESSIONID", JSessionId ) 9 }
验证登录信息:
1 def setCookie = testRunner.testCase.testSteps["登录请求"].testRequest.response.responseHeaders["Set-Cookie"] 2 def match 3 if ((m = setCookie =~ /CASTGC=(.*);/)) { 4 match = m.group(1) 5 6 } 7 def Castgc =match 8 9 testRunner.testCase.setPropertyValue( "CASTGC", Castgc )