soap ui

簡介 TestRunner: a TestCaseRunner object, which is the entry-point to the SoapUI API for accessing project items,results, and so on. context: a TestCaseRunContext object holding context-related properties. messageExchange: 當前交互 request/response 的 MessageExchange,能夠用來直接訪問 message content, HTTP Headers,Attachment 等對象: http://www.soapui.org/apidocs/com/eviware/soapui/model/iface/MessageExchange.html log: 一個標準的 Log4j Logger 對象 SoapUI官網: https://www.soapui.org/ http://readyapi.smartbear.com/ http://readyapi.smartbear.com/structure/steps/script/groovy/start API Document: http://www.soapui.org/apidocs/com/eviware/soapui/impl/wsdl/teststeps/RestResponseMessageExchange.html http://www.soapui.org/apidocs/com/eviware/soapui/model/testsuite/TestSuite.html http://www.soapui.org/apidocs/com/eviware/soapui/model/testsuite/TestCaseRunner.html http://www.soapui.org/apidocs/com/eviware/soapui/model/testsuite/TestStep.html http://docs.groovy-lang.org/latest/html/gapi/ https://smartbear-cc.force.com/portal/KbHome?utm_source=doc_notif_popup&utm_medium=rapi&utm_campaign=Support TestCase Memory Usage: http://www.soapui.org/working-with-soapui/improving-memory-usage.html By default, SoapUI automatically saves the entire request-response message exchange for each request so it can be viewed by double-clicking the corresponding entry in the TestCase log. Obviously this will fill up memory over time no matter how much you have allocated, but fortunately there are ways to discard old results from memory if not needed. 1. 屬性表達式Property Expansion 1.1 獲取響應數據: ${Search Request#Response#//ns1:Item[1]/n1:Author[1]/text()} 1.1.1獲取json屬性 response = context.expand('${GetDataPoints#Response)---Json format response = context.expand('${GetDataPoints#Response#$.params[2].options[0].id}') ---Json format '.'表示當前json對象 1.1.1獲取XML屬性 /** * * * * 0Axxxxx * 4 * * * */ responseAsXml = context.expand( '${JDBC Request#ResponseAsXml')---Xml format responseAsXml = context.expand('${JDBC Request#ResponseAsXml#//Results[1]/ResultSet[1]/Row[1]/ID[1]}') --Xml format 1.2 獲取property屬性值: 1.2.1 獲取Project、TestSuite、TestCase中的屬性值 #Project# - references a Project property(Reference properties across a particular SoapUI project) #TestSuite# - references a TestSuite property in the containing TestSuite #TestCase# - references a TestCase property in the containing TestCase Example: context.expand("${#Project#FilePath}") context.expand("${#TestSuite#FilePath}") context.expand("${#TestCase#FilePath}") #MockService# - references a MockService property in the containing MockService 1.2.2 獲取全局屬性值 #Global# - references a global property. Found in File>Preferences>Global Properties tab. Reference properties across all projects Example: Preferences -> Global Properties: test = global variables assert context.expand("${test}") == "global variables" 1.2.3 獲取系統屬性值 #System# - references a system property. Found in Help>System properties. Example: assert context.expand('${#System#file.encoding}') == 'GBK' 1.2.4 獲取環境變量值 #Env# - references an environment variable Example: context.expand('${#Env#JAVA_HOME}') 1.2.5 獲取TestStep中屬性值 #[TestStep name]# - references a TestStep property Example: Property step 獲取屬性值 Property step: context.expand('${Properties#variable}') 腳本step獲取return的返回值 Groovy Step: context.expand('${getSql2#result}') 請求step獲取響應值 Request Step: context.expand('${Request 1#Response}') 1.3 Dynamic Properties: 動態屬性 ${=(int)(Math.random()*1000)} ${=request.name} ${=request.operation.interface.project.name} ${=import java.text.SimpleDateFormat ; new SimpleDateFormat("YYYY-MM-DDT00:00:00").format(new Date())} context.expand('${=request.name}') Test library: http://www.soapui.org/apidocs/com/eviware/soapui/impl/rest/RestRequest.html 1.4 Nested Properties: 嵌套屬性 testxml = "hello" testxpath = "//value[@id=${id}]/text()" id = "123" -> "${#testxml#${testxpath}}" evaluates to "hello" 2. SoapUI自定義變量: 2.1 messageExchange: testLibrary: http://www.soapui.org/apidocs/com/eviware/soapui/impl/wsdl/teststeps/RestResponseMessageExchange.html 2.1.1 獲取響應Get response content: response = messageExchange.response.responseContent response = messageExchange.responseContent String response = messageExchange.getResponseContent() String response = messageExchange.getResponseContentAsXml() 2.1.2 獲取請求URL Get the request URL: String url = messageExchange.getEndpoint() 2.1.3 獲取響應頭 Get the request headers: HashMap map = messageExchange.getResponseHeaders() 2.1.4 獲取響應狀態碼 Get http code: int status = messageExchange.getResponseStatusCode() 2.1.5 獲取耗時 Get time taken: long time = messageExchange.getTimeTaken() 2.2 testRunner: com.eviware.soapui.impl.wsdl.panels.support.MockTestRunner testLibarary: http://www.soapui.org/apidocs/com/eviware/soapui/impl/wsdl/panels/support/MockTestRunner.html testRunner.testCase //能夠訪問和操做項目中的全部對象 testRunner.fail(....) testRunner.cancel,結束測試執行 testRunner.gotoTestStepByname("Groovy Script") // goto 表示跳轉到哪一步開始執行,會等待當前腳本執行完成再跳轉到對應步驟執行 testRunner.runTestStepByname("Groovy Script") //腳本會先去執行這個步驟,而後繼續執行當前腳本 2.3 context: com.eviware.soapui.impl.wsdl.panels.support.MockTestRunContext testLibarary: http://www.soapui.org/apidocs/com/eviware/soapui/impl/wsdl/panels/support/MockTestRunContext.html 2.3.1 獲取當前testStep,Get current test step: TestStep step = context.getCurrentStep() 2.3.2 獲取當前TestStep所在index Get the index of current step: in index = context.getCurrentStepIndex() 2.3.3 獲取屬性 Get property: context.getProperty(String testStep, String propertyName) 2.3.4 獲取用例 TestCase tc = context.getTestCase() 2.3.5 獲取TestCaseRunner tcr = context.getTestRunner() 2.3.6 context.expand('${#TestCase#expectValue}') 2.3.7 使用Via XPath expressions def responseAsXml = context.expand( '${HTTP Request#ResponseAsXml#//table[4]/tr[2]/td[3]/table[1]/tr[1]/td[2]/span[4]/text()}') log.info responseAsXml xptah specs: http://www.w3school.com.cn/xpath/xpath_syntax.asp 2.3.8 其餘方法 other methods: getProperties, getProperty, getPropertyNames, hasProperty, removeProperty, setProperty 2.4 log: testLibarary: org.apache.log4j.Logger log.info "Test information" 2.5 project: http://www.soapui.org/apidocs/com/eviware/soapui/impl/wsdl/WsdlProject.html 1> project.name 2> project.getPropertyValue(name) 3> project.setPropertyValue(name, value) 4> project.testSuiteList.each{log.info it.name} 5> project.testSuites.each{key,value-> log.info key //case name } 2.6 testSuite: com.eviware.soapui.impl.wsdl.WsdlTestSuite http://www.soapui.org/apidocs/com/eviware/soapui/impl/wsdl/WsdlTestSuite.html 1> testSuite.name 2> testSuite.getProject().getPropertyValue(name) 3> testSuite.getProject().setPropertyValue(key,value) 4> testSuite.getPropertyValue(name) 5> testSuite.setPropertyValue(name,value) 6> testSuite.testCaseList.each{log.info it.name} 7> testSuite.testCases.each{key,value-> log.info key //case name } 8> testSuite.getTestCaseByName(arg0) 2.7 testCase: com.eviware.soapui.impl.wsdl.WsdlTestCasePro http://www.soapui.org/apidocs/com/eviware/soapui/impl/wsdl/testcase/WsdlTestCase.html 1> testCase.name 2> testCase.getPropertyValue(name) 3> testCase.setPropertyValue(name, value) 4> testCase.testStepList.each{log.info it.name} 5> testCase.getTestSteps().each{key, value-> log.info key } 6> testCase.getTestStepByName(arg0) 8> testCase.project 9> testCase.testSuite 10> testCase.getTestStepsOfType(com.eviware.soapui.impl.wsdl.teststeps.RestTestRequestStep.class) 經過類型過濾查找獲得 testSteps列表。 3. 獲取響應Get response of testStep: 3.1 獲取當前 testStep的響應 1> response = messageExchange.response.responseContent 2> response = messageExchange.responseContent 3.2 獲取其餘testStep的響應. 1> context.expand('${testStepNM#response}') 2> testRunner.testCase.testSteps["testStepNM"].testRequest.response.contentAsString 4. Json解析和構建 4.1 jsonSlurper解析 testLibarary: http://docs.groovy-lang.org/latest/html/gapi/groovy/json/JsonSlurper.html 如json爲: {"calendar": [ {"calendar_id":"1705","showtime":"1288927800","endshowtime":"1288931400","allDay":false}, {"calendar_id":"1706","showtime":"1288933200","endshowtime":"1288936800","allDay":false}, {"calendar_id":"1709","showtime":"1288935600","endshowtime":"1288938900","allDay":false} ] } import groovy.json.jsonSlurper response = messageExchange.response.responseContent // response = testRunner.testCase.testSteps["getCalendarListByCoid"].testRequest.response.contentAsString def slurper = new JsonSlurper() def re = slurper.parseText(response) //訪問頂級元素,返回的是一個列表使用size 得到長度 re.calendar re.calendar.size() //訪問元素模式 re.calendar.calendar_id re.calendar.calendar_id[index] //另外一種訪問形式 re['calendar']['calendar_id'][index] //查找過濾 re.calendar.calendar_id.find{it=='1706'} //得到的結果是 calendar_id 1706 re.calendar.find{it.calendar_id=='1706'} //得到的是calendar元素 4.2 JSONObject解析 def jsonMeta = net.sf.json.JSONSerializer.toJSON(messageExchange.responseContent); meta = jsonMeta.get("_meta").get("response_status") 4.3 json builder構建 def createAuthorId = context.expand( '${查詢空間詳情#Response#$.createAuthorId}' ) def flag = "1" import groovy.json.JsonBuilder def json = new JsonBuilder() json { userID createAuthorId fileflag flag} return json 5. xml解析 5.1 XmlParser testLibarary: http://docs.groovy-lang.org/latest/html/api/groovy/util/XmlParser.html def langs = new XmlParser().parse("languages.xml") def xml = "" def langs2 = new XmlParser().parseText(xml) log.info langs.lang.attribute("text") //注意與xmlSlurper的區別 5.2 XmlSlurper testLibarary: http://docs.groovy-lang.org/latest/html/api/groovy/util/XmlSlurper.html def langs = new XmlSlurper().parse("languages.xml") def xml = "*******" def langs2 = new XmlSlurper().parseText(xml) log.info langs.lang.@text Example 1: xmlStr = ''' Information1 Information2 Information3 ''' def result = new XmlSlurper().parseText(xmlStr) def rows = result.ResultSet.Row log.info rows.DESCRIPTION.join(',')//output: Information1,Information2,Information3 示例:http://renjie120.iteye.com/blog/1504827 6. 經常使用method-testRunner 6.1 Get response: testRunner.testCase.testSteps["ColumnSetsAllSummary"].testRequest.response.contentAsString context.expand('${Groovy2#result}') context.expand('${Request 1#Response}') 6.2 Add propery: testRunner.testCase.getTestStepByName("stepNM").addProperty("propertyNM") testRunner.testCase.addProperty("propertyNM") testRunner.testCase.testSuite.addProperty("propertyNM") 6.3 Set property value: testRunner.testCase.getTestStepByName("stepNM").setPropertyValue("propertyNM","value") testRunner.testCase.setPropertyValue("propertyNM","value") testRunner.testCase.testSuite.setPropertyValue("propertyNM","value") 6.4 Delete property: testRunner.testCase.getTestStepByName("stepNM").removeProperty("properNM") testRunner.testCase.removeProperty("properNM")) testRunner.testCase.testSuite.removeProperty("properNM") 6.5 Get properties: HashMap map = testRunner.testCase.getTestStepByName("failedDataPoints").getProperties() 6.6 Get a property value: testRunner.testCase.testSteps["Properties"].getPropertyValue("properNM") testRunner.testCase.getTestStepByName("Properties").getPropertyValue("properNM") testRunner.testCase.getPropertyValue("propertyNM") testRunner.testCase.testSuite.getPropertyValue("propertyNM") 6.7 Get all property names: testRunner.testCase.getTestStepByName("stepNM").getPropertyNames() 6.8 Get cookie: testRunner.testCase.getTestStepByName("login").testRequest.response.responseHeaders["Set-Cookie"] 6.9 向下訪問 testRunner.testCase.testSteps[testStepName] testRunner.testCase.getTestStepByName("新增一個空間") 6.10 向上訪問,用於訪問同一項目中的其餘testSuites 和 testCase下的元素 testRunner.testCase.testSuite.project.testSuites[testSuiteName].testCases[testCaseName].testSteps[testStepName] 6.11 幾乎全部元件都有get 和set屬性的方法 setPropertyValue getPropertyValue //在下面的4,5,6點中,幾乎全部的屬性值均可以和對應的get方法互相替換等價 6.12 獲取響應體 myResponse=testRunner.testCase.getTestStepByName("新增一個空間").testRequest.response myRequest=testRunner.testCase.getTestStepByName("新增一個空間").testRequest 能夠替換使用:getTestRequest(),testSteps[testStepName],getResponse()等。 context.expand('${Groovy2#result}') context.expand('${Request 1#Response}') 比較特殊的2個 獲取響應做爲String myResponse.contentAsString 或者 myRequest.getResponseContentAsString() 獲取響應做爲Xml myResponse.contentAsXml 或者myRequest.getResponseContentAsXml() 6.13 響應頭和請求頭 響應頭: testRunner.testCase.getTestStepByName("新增一個空間").testRequest.response.responseHeaders["Location"] 或者testRunner.testCase.getTestStepByName("查詢空間詳情").testRequest.getResponse().getResponseHeaders("Location") 請求頭: testRunner.testCase.getTestStepByName("查詢空間詳情").testRequest.requestHeaders testRunner.testCase.getTestStepByName("查詢空間詳情").testRequest.getRequestHeaders("Location") 設置請求頭 def headerMap = new StringToStringMap() // headerMap.put("headerKeyName","HeaderKeyWord") //添加到map testRunner.testCase.getTestStepByName("查詢空間詳情").testRequest.setRequestHeaders(headerMap) 6.14 獲取請求地址 testRunner.testCase.getTestStepByName("查詢空間詳情").testRequest.path 6.15 getAt(String) 方法,傳入property名字,檢索出值 針對testRunner下的全部對象,均可以經過此方法直接獲取到 屬性,例如: testRunner.testCase.getTestStepByName("查詢空間詳情").testRequest.getAt("path") 對應:testRunner.testCase.getTestStepByName("查詢空間詳情").testRequest.path testRunner.testCase.getTestStepByName("查詢空間詳情").testRequest.response.getAt("responseHeaders") 對應:testRunner.testCase.getTestStepByName("查詢空間詳情").testRequest.requestHeaders 6.16 獲取所有用例並循環 def testCaseList = testRunner.testCase.testSuite.getTestCaseList() testCaseList.each{ if(it.testSteps["Input"]) it.testSteps["Input"].setPropertyValue("spaceid",uid) } 6.17 相對的獲取用例數,getTestCaseCount() for(int i=0; i 輸出value的類型 log.info value.getClass().name,發現其類型爲:com.eviware.soapui.impl.wsdl.support.XmlBeansPropertiesTestPropertyHolder$PropertiesStepProperty; 2> 幫助文檔http://www.soapui.org/apidocs/com/eviware/soapui/impl/wsdl/panels/support/MockTestRunner.html,選擇All Class, 搜索XmlBeansPropertiesTestPropertyHolder,點擊進入,再找到Class PropertiesStepProperty,而後查看其API,能夠看到有getValue()方法能夠返回String類型 的值。API UIR: http://www.soapui.org/apidocs/com/eviware/soapui/impl/wsdl/support/XmlBeansPropertiesTestPropertyHolder.PropertiesStepProperty.html 13. 收費版script library配置: Preferences -> Ready!API -> Script library 對應的配置在文件".Users\asun\soapui-settings.xml中,對應的node: id: "Script Library" 14. 免費版script library配置: 1> 我的代碼打包成jar,放入路徑\ext中 Netbeans打包Jar,參考: http://www.cnblogs.com/kunnet/archive/2013/02/19/2917471.html 2> 代碼引入: def groovyClasspath = context.expand( '${#Project#groovyClasspath}' ) String[] roots = [groovyClasspath] engine = new GroovyScriptEngine(roots) generateDataClass = engine.loadScriptByName('Test.groovy') def gd = generateDataClass.newInstance() log.info gd.testInfo() 15. Common used please see the GIT Hub: https://github.com/adrcode 16. DataSource(groovy) http://readyapi.smartbear.com/structure/sources/groovy/start http://www.tuicool.com/articles/rqMV7jY 1新建一個DataSource步驟,選擇Groovy方式 2.添加一個名爲dataPointId的Properties 3.groovy編輯框中輸入實現代碼,result["dataPointId"]表示給屬性dataPointId賦值 import groovy.json.JsonSlurper def xresponse = testRunner.testCase.testSteps["getCalendarListByCoid"].testRequest.response.contentAsString def slurper = new JsonSlurper() def re = slurper.parseText(xresponse) def num = json.datapoints.id.size() def i = testRunner.testCase.testSteps["DataSource"].currentRow if(i < num) { result["dataPointId"]=String.valueOf(json.datapoints.id[i]) } 4.新建一個Property Transfer步驟,將DataSource的dataPointId傳遞給當前testCase的變量 5.新建 一個REST請求步驟,將獲得的dataPointId去請求另外一個接口 6.新建一個DataSource Loop步驟,使DataSource與Property Transfer步驟循環,這樣就能夠遍歷數組中的每一個數據了 17. TestSuite -> Setup Script 根據環境的不一樣,設置不一樣的變量: def en = project.getPropertyValue("endpoint") if(en =~ /.api.company.com./) project.setPropertyValue("ApiKey", "111111") else project.setPropertyValue("ApiKey", "222222") 18. Setup Script: 依據環境選擇相應的參數: def url = testCase.getProject().getPropertyValue("endpoint") if(url == "xxx") testCase.setPropertyValue(name, value) 19. Environments: def env = runner.testSuite.project.getActiveEnvironment().getName() switch(env) { case ['DEV', 'QA' , 'STG']: testSuite.getProject().setPropertyValue("ApiKey", "xxxxx1") break case 'PROD': testSuite.getProject().setPropertyValue("ApiKey", "xxxxx2") break } 20. Cases參數化---TestSuite的SetUp Script中進行相關配置,示例以下: enter description here 有2個case分別爲CaseName1和CaseName2,測試邏輯徹底同樣,只是data input不同: 1. [{ 2. "name": "CaseName1", 3. "listjson": "listjson_demo_1", 4. "columnsetjson": "columnsetjson_demo1", 5. "ids": "DP003" 6. }, 7. { 8. "name": "CaseName2", 9. "listjson": "listjson_demo_2", 10. "columnsetjson": "columnsetjson_demo2", 11. "ids": "DP005" 12. }] TestSuite的SetUp中script以下: import groovy.json.JsonSlurper def testCaseParameters = '[{\"name\":\"CaseName1\",\"listjson\":\"listjson_demo_1\",\"columnsetjson\":\"columnsetjson_demo1\",\"ids\":\"DP003\"},{\"name\":\"CaseName2\",\"listjson\":\"listjson_demo_2\",\"columnsetjson\":\"columnsetjson_demo2\",\"ids\":\"DP005\"}]' runner.testSuite.setPropertyValue("tcParameters",testCaseParameters) def tcParameters = runner.testSuite.getPropertyValue("tcParameters") def jsonSlurper = new JsonSlurper() def parameters = jsonSlurper.parseText(tcParameters) def loopNum = 0 parameters.each{ log.info "********* test case name:${it.name}" runner.testSuite.getTestCaseAt(0).setName(it.name) runner.testSuite.getTestCaseAt(0).getTestStepAt(0).setName(it.name) runner.testSuite.getTestCaseAt(0).getTestStepAt(0).setPropertyValue("listjson", it.listjson) runner.testSuite.getTestCaseAt(0).getTestStepAt(0).setPropertyValue("columnsetjson", it.columnsetjson) log.info loopNum if(loopNum++ < 1) runner.testSuite.getTestCaseAt(0).run(null, false) } 常見問題: 1. "Can't get the Connection for specified properties; com.microsoft.sqlserver.jdbc.SQLServerException: This driver is not configured for integrated authentication. ClientConnectionId:ab000642-f920-49da-b0fa-c786f7fb12de" sql windows authentication: 1> sqljdbc_auth.dll拷貝到/soapUI/bin目錄下 2> Driver: com.microsoft.sqlserver.jdbc.SQLServerDriver ConnectionString: jdbc:sqlserver://host:1433;databaseName=dbName;integratedSecurity=true; 參考:https://social.technet.microsoft.com/Forums/zh-CN/d43cc053-fd2a-4e6f-a2fb-d1618bf871f5/integrated-security-with-the-microsoft-jdbc-driver-are-you-getting-the-error-failed-to-load-the?forum=sqldataaccess 官方: https://smartbear-cc.force.com/portal/KbArticleViewer?name=How-to-configure-SoapUI-Pro-JDBC-Datasource-with-SQL-Server-that-uses-windows-authentication 2. Encoding問題 Exected: Alternative Strategies – Diversified Min Initial 50,000 and Above Actually the response in soapUI is: Alternative Strategies 鈥� Diversified Min Initial 50,000 and Above Solution: 1> change the encoding for soapUI, Add the line ‘-Dfile.encoding=UTF8’ into the file \ReadyAPI-1.8.0\bin\ReadyAPI-1.8.0.vmoptions 2> 或者是,直接在request的header中配置參數Encoding=UTF-8 做者:劇毒術什 連接:https://www.jianshu.com/p/01d3b6dc9176
相關文章
相關標籤/搜索