如何在SOAP UI的Setup Script中执行测试用例并传递REST响应值?
刚好我之前处理过类似的SOAP UI/LoadUI跨用例传值场景,来帮你一步步解决这两个问题:
要实现这个需求,你可以用Groovy脚本在Setup Script里调用目标测试用例,提取响应值后存到当前用例可访问的属性中,具体步骤如下:
定位并执行目标测试用例
先获取目标测试用例的对象,然后同步执行它(确保它跑完再继续当前脚本):// 获取当前测试套件 def testSuite = context.testCase.testSuite // 替换成你要调用的测试用例名称 def targetTestCase = testSuite.getTestCaseByName("Test case 1") // 执行目标测试用例(同步执行,等待完成) targetTestCase.run(null, false)提取目标请求的响应内容
找到目标测试用例里的具体请求,获取它的响应字符串:// 替换成目标测试用例里的REST请求名称 def targetRequest = targetTestCase.getTestStepByName("启动会话请求") def responseContent = targetRequest.response.contentAsString解析响应并存储值到当前用例
用Groovy的JsonSlurper解析JSON响应,把需要的值存到当前测试用例的属性中,方便后续请求引用:def jsonSlurper = new groovy.json.JsonSlurper() def responseJson = jsonSlurper.parseText(responseContent) // 示例:提取VotingSessionID并存储 def sessionId = responseJson.VotingSessionID context.testCase.setPropertyValue("VotingSessionID", sessionId.toString())之后当前测试用例的请求就能用
${#TestCase#VotingSessionID}来引用这个值了。
针对你的场景(Test case1禁用,通过负载测试的Setup Script调用,需传递VotingOptionID),可以按以下步骤操作:
在Setup Script中执行Test case1并解析响应
先执行Test case1,然后从JSON响应里提取指定的VotingOptionID(比如第一个问题下的第一个选项ID):def testSuite = context.testCase.testSuite def testCase1 = testSuite.getTestCaseByName("Test case 1") // 执行Test case1 testCase1.run(null, false) // 获取Test case1里的REST请求响应 def startRequest = testCase1.getTestStepByName("你的REST请求名称") // 先判断请求是否成功,避免解析失败 if (!startRequest.response || startRequest.response.status != 200) { throw new Exception("Test case1的启动请求执行失败,无法获取VotingOptionID") } def responseJson = new groovy.json.JsonSlurper().parseText(startRequest.response.contentAsString) // 提取第一个Question下第一个Option的VotingOptionID def targetOptionId = responseJson.Questions[0].Options[0].VotingOptionID将值存储到全局可访问的属性中
因为是负载测试,建议把值存到测试套件属性里,这样负载测试的所有线程都能访问:testSuite.setPropertyValue("TargetVotingOptionID", targetOptionId.toString())在Test case2的REST请求中引用该值
打开Test case2的REST请求,在需要传入VotingOptionID的位置(比如请求体或参数),用${#TestSuite#TargetVotingOptionID}来引用:// 示例请求体 { "SelectedOptionID": ${#TestSuite#TargetVotingOptionID} }额外提示
如果你需要分配不同的VotingOptionID给负载测试的不同线程,可以把所有选项ID存成数组,然后结合线程号来取对应的值,比如:// 提取所有VotingOptionID并存成数组 def allOptionIds = responseJson.Questions[0].Options.collect { it.VotingOptionID } // 存到测试套件属性(转成字符串) testSuite.setPropertyValue("AllOptionIDs", allOptionIds.toString()) // 在负载测试的请求脚本里,根据线程号取对应ID def optionIds = context.testCase.testSuite.getPropertyValue("AllOptionIDs").tokenize(",").collect { it.trim() as Integer } def currentOptionId = optionIds[context.currentThreadIndex % optionIds.size()]
内容的提问来源于stack exchange,提问作者Ruwi

