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 对应的配置在文件".Usersasunsoapui-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.0inReadyAPI-1.8.0.vmoptions 2> 或者是,直接在request的header中配置參數Encoding=UTF-8 作者:剧毒术什 链接:https://www.jianshu.com/p/01d3b6dc9176
原文地址:https://www.cnblogs.com/juanweihu/p/9524769.html