soapui groovy脚本汇总
出处:https://www.jianshu.com/p/ce6f8a1f66f4
一、一些内部元件的访问
testRunner.testCase开头
1、向下访问
testRunner.testCase.testSteps[testStepName]
testRunner.testCase.getTestStepByName("新增一个空间")
2、向上访问,用于访问同一项目中的其他testSuites 和 testCase下的元素
testRunner.testCase.testSuite.project.testSuites[testSuiteName].testCases[testCaseName].testSteps[testStepName]
3、几乎所有元件都有get 和set属性的方法
setPropertyValue getPropertyValue
//在下面的4,5,6点中,几乎所有的属性值都可以和对应的get方法互相替换等价
4、获取响应体
myResponse=testRunner.testCase.getTestStepByName("新增一个空间").testRequest.response
myRequest=testRunner.testCase.getTestStepByName("新增一个空间").testRequest
可以替换使用:getTestRequest(),testSteps[testStepName],getResponse()等。
比较特殊的2个
获取响应作为String
myResponse.contentAsString 或者 myRequest.getResponseContentAsString()
获取响应作为Xml
myResponse.contentAsXml 或者myRequest.getResponseContentAsXml()
5、响应头和请求头
响应头:
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、获取请求地址
testRunner.testCase.getTestStepByName("查询空间详情").testRequest.path
7、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
8、获取全部用例并循环
def testCaseList = testRunner.testCase.testSuite.getTestCaseList()
testCaseList.each{
if(it.testSteps["Input"])
it.testSteps["Input"].setPropertyValue("spaceid",uid)
}
9、相对的获取用例数,getTestCaseCount()
for(int i=0; i<testSuite.getTestCaseCount(); i++) {
if (!testSuite.getTestCaseAt(i).isDisabled()) {
if (!(testSuite.getTestCaseAt(i).getTestStepByName("stepName")).equals()){
.....
}
}
}
10、获取getTestSuiteCount()
testRunner.testCase.testSuite.project.getTestSuiteCount()
11、获取名称
部分元件只有Label和Name中的一个,测试一下就知道了。
getLabel() 和getName()大多数情况是等价的
a. 取test case的名称
def tc = testRunner.testCase;
log.info (tc.getLabel());
b. 取test suite的名称
def ts = testRunner.testCase.testSuite;
log.info (ts.getLabel());
getName()
取project 名称
def tp = testRunner.testCase.testSuite.project;
log.info (tp.getName());
12、在断言中需要使用用例对象的话
messageExchange.modelItem.testCase.testSteps["Properties"].getPropertyValue("userId")
13、全局属性变量访问
对于项目中的属性可分为这么几个级别Global, Project,TestSuite, TestCase
即全局变量、项目级别、用例集级别、单个用例级别
要获得如项目级别的属性变量的话,可以用以下方法
def time_num=context.expand('${#Project#time_num}') //##号内为定义哪个级别的属性变量,后面为属性名
二、json操作
1、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
2、json 解析
如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
def xresponse = testRunner.testCase.testSteps["getCalendarListByCoid"].testRequest.response.contentAsString
def slurper = new JsonSlurper()
def re = slurper.parseText(xresponse)
//访问顶级元素,返回的是一个列表使用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元素
三、XML操作(解析)
ef groovyUtils = new com.eviware.soapui.support.GroovyUtils(context )
//获取上下文对象,转化成groovyUtils对象
defwsdlResponse=testRunner.testCase.testSteps["发贴"].getTestRequest().getResponseContentAsXml()
log.info("wsdlResponse==="+wsdlResponse)
//获取指定步骤的返回信息并转化成xml
holder = groovyUtils.getXmlHolder(wsdlResponse)
//获取指定节点的值
defmessage=holder.getNodeValue("//ns1:Response[1]/ns1:response[1]/ns1:e[1]/ns1:message[1]")
log.info("获得节点对应的值是"+message)
deffandom_creator_sn=holder.getNodeValue("//ns1:fandom_creator_sn")
log.info("获得节点对应的值是"+fandom_creator_sn)
四、文件操作
直接百度groovy文件操作就好了,用得少不收集了
五、各级别的集合操作
1、TestSteps的操作
testRunner.testCase.testSuite.project.testSuites["互动空间测试用例"].testCases["空间管理测试"].testSteps
=getTestSteps()。都是获取用例下的testStep列表,返回的是 key=object 形式的字典map
getTestStepList() 获取用例下的testStep列表,纯列表
getTestStepCount() 获取数量
getTestStepAt(int) getTestStepById(java.util.UUID) 通过位置和UUID 查找step
getTestStepsOfType(com.eviware.soapui.impl.wsdl.teststeps.RestTestRequestStep.class) 通过类型过滤查找得到 testSteps列表。
2、testCases操作
testRunner.testCase.testSuite.project.testSuites["互动空间测试用例"].testCases=getTestCases()
返回的是 key=object 形式的字典map
getTestCaseList(), 获取的列表,纯列表
getTestCaseCount(), 获取数量
getTestCaseAt(int), getTestCaseById(java.util.UUID) 通过位置和UUID
3、testSuites操作
testRunner.testCase.testSuite.project.testSuites=getTestSuites()
返回的是 key=object 形式的字典map
getTestSuiteList(),获取的列表,纯列表
getTestSuiteCount() 获取数量
,getTestSuiteAt(int), getTestSuiteById(java.util.UUID) 通过位置和UUID
4、返回是list时操作
testCaseList=testRunner.testCase.testSuite.project.testSuites["互动空间测试用例"].getTestCaseList()
log.info testCaseList[0] //使用 index访问
//each循环
testCaseList.each{
it.xxxxx
}
5、返回是map时操作
testStepsMap=testRunner.testCase.testSuite.project.testSuites["互动空间测试用例"].testCases["空间管理测试"].testSteps
//使用名称key访问
log.info testStepsMap["新增一个空间"]
log.info testStepsMap.get("新增一个空间")
//遍历 使用默认闭包it
testStepsMap.each{
log.info it.key+" "+it.value
}
//使用自定义闭包名称遍历
testStepsMap.each{myp->
log.info myp.key+" "+myp.value
}
六、数据库操作
1、普通的jdbc编程
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCExample1 {
public static void main(String[] args) {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try{
Class.forName("org.gjt.mm.mysql.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/words",
"words", "words");
stmt = con.createStatement();
rs = stmt.executeQuery("select * from word");
while (rs.next()) {
System.out.println("word id: " + rs.getLong(1) +
" spelling: " + rs.getString(2) +
" part of speech: " + rs.getString(3));
}
}catch(SQLException e){
e.printStackTrace();
}catch(ClassNotFoundException e){
e.printStackTrace();
}finally{
try{rs.close();}catch(Exception e){}
try{stmt.close();}catch(Exception e){}
try{con.close();}catch(Exception e){}
}
}
}
2、grrovy sql
import groovy.sql.Sql
sql = Sql.newInstance("jdbc:mysql://localhost:3306/words", "words",
"words", "org.gjt.mm.mysql.Driver")
查出所有行
sql.eachRow("select * from word"){ row |
println row.word_id + " " + row.spelling + " " + row.part_of_speech
}
执行插入操作
wid = 999
spelling = "Nefarious"
pospeech = "Adjective"
sql.execute("insert into word (word_id, spelling, part_of_speech)
values (${wid}, ${spelling}, ${pospeech})")
使用位置参数
val = sql.execute("select * from word where word_id = ?", [5])
更新
nid = 5
spelling = "Nefarious"
sql.executeUpdate("update word set word_id = ? where spelling = ?", [nid, spelling])
删除
sql.execute("delete from word where word_id = ?" , [5])
创建数据集
sql = Sql.newInstance("jdbc:mysql://localhost:3306/words", "words",
"words", "org.gjt.mm.mysql.Driver")
words = sql.dataSet("word")
words.each{ word |
println word.word_id + " " + word.spelling
}
words.add(word_id:"9999", spelling:"clerisy", part_of_speech:"Noun")
查询结果集的访问
sql.eachRow("select * from word"){ grs |
println "-1 = " + grs.getAt(-1) //使用索引访问最后一个
println "2 = " + grs.getAt(2) //使用索引访问第三个
grs.columName //通过列名访问
}
七、流程控制方面
testRunner.testCase //可以访问和操作项目中的所有对象
testRunner.fail(....) testRunner.cancel,结束测试执行
testRunner.gotoTestStepByname("Groovy Script") // goto 表示跳转到哪一步开始执行,会等待当前脚本执行完成再跳转到对应步骤执行
testRunner.runTestStepByname("Groovy Script") //脚本会先去执行这个步骤,然后继续执行当前脚本
context.myProperty="aaaa" //会在上下文中创建一个名为myProperty的属性,赋值为aaa
八、脚本返回值和引用
return UUID.randomUUID() \\return 返回数据
${Groovy Script#result} \\引用
def result = context.expand( '${Groovy Script#result}' ) \\引用
九、抄的两个实例之一----为所有RestTestRequestStep设置请求头(Cookie,session),以及编码
import com.eviware.soapui.support.types.StringToStringMap
def cookiesList = testRunner.testCase.getTestStepByName("登录").testRequest.response.responseHeaders["Set-Cookie"] //获得登陆后返回响应中的set-cookie
log.info "cookiesList:" + cookiesList
def cookieNew =""
cookiesList.each{
cookieNew = cookieNew+it.split(";")[0]+";"; //拆分得到 SESSION
}
log.info "Cookie:"+cookieNew
def cookieMap = new StringToStringMap() //cookiemap
cookieMap.put("Cookie",cookieNew) //添加到map
//Pass cookie to all testSteps of the project
//将cookieMap设置到项目中的所有RestTestRequestStep,顺带设置编码
def testSuiteList = testRunner.testCase.testSuite.project.getTestSuiteList()
def testCaseList
def testStepList
testSuiteList.each{
testCaseList = it.getTestCaseList()
testCaseList.each{
//获得RestTestRequestStep类型的testStepList
testStepList = it.getTestStepsOfType(com.eviware.soapui.impl.wsdl.teststeps.RestTestRequestStep.class)
testStepList.each{
if(it.name!="登录"){
it.testRequest.setRequestHeaders(cookieMap)
it.testRequest.setEncoding("UTF-8")
}
}
}
}
log.info "==========Cookie:"+ cookieMap.get("Cookie");
十、抄的两个实例之二----数据库验证
import com.eviware.soapui.support.types.StringToStringMap
def Location= testRunner.testCase.getTestStepByName("新增一个教材册次").testRequest.response.responseHeaders["Location"]
log.info "Location:" + Location[0]
def uid = Location[0].split("/")[-1]
testRunner.testCase.testSteps["Input"].setPropertyValue("uid",uid)
log.info "uid:" + uid
import groovy.sql.Sql
//获取testSuite对象,以获取其中参数
def DBProperties = testRunner.testCase.testSuite
//获取数据库对象
def sql = Sql.newInstance(DBProperties.getPropertyValue( "connection-url" ),DBProperties.getPropertyValue( "sysdb-user-name" ),
DBProperties.getPropertyValue( "sysdb-password" ),DBProperties.getPropertyValue( "driver-class" ))
def query = "Select * From inf_book_second Where inf_book_second.uid = '"+ uid +"'"
def raw = sql.firstRow(query )
log.info query
def expect_name = testRunner.testCase.getTestStepByName( "Properties" ).getPropertyValue('name')
log.info "expect_name: "+expect_name
def actual_name = raw.name
log.info "actual_name: "+actual_name
//断言
assert actual_name ==expect_name
soapui groovy脚本汇总的更多相关文章
- [SoapUI] Post请求Body里面限制特殊字符(&、%),Groovy脚本里特殊字符需要添加“\”转义($)。
SoapUI的Post请求,在body里面不能包含(&.%),如果含有这些特殊字符,请求会报错:在添加的Groovy脚本里有些特殊字符需要使用“\”转义($),不然也会报错.
- soapUI参数中文乱码问题解决方法 (groovy脚本中文乱码)
soapUI参数中文乱码问题解决方法 可能方案1: 字体不支持中文,将字体修改即可: file-preferences-editor settings-select font 修改字体,改成能显示中文 ...
- excel文件的groovy脚本在SoapUI中进行数据驱动测试
SoapUI Pro具有从外部文件读取数据的功能,例如:excel,csv等.但SoapUI不提供从excel文件读取数据的功能.因此,为了从SoapUI中的excel文件中读取数据,我们需要在gro ...
- soapUI系列之—-03 Groovy脚本常用方法2
------Groovy脚本常用方法 1.解析Json数据脚本 //groovy读取json的方式很简单,re.body.businessinfo.c2rate读取c2rate对应的值 import ...
- soapUI系列之—-02 Groovy脚本常用方法
------Groovy脚本常用方法 1. 设置参数值:setPropertyValuea. 设置 project level property//set to project level prope ...
- 手把手教你接口自动化测试 – SoapUI & Groovy
手把手教你接口自动化测试 – SoapUI & Groovy http://www.cnblogs.com/wade-xu/p/4236295.html 关键词:SoapUI接口测试,接口自动 ...
- 手把手教你接口自动化测试 – SoapUI & Groovy【转】
手把手教你接口自动化测试 – SoapUI & Groovy Posted on 2015-01-21 09:38 WadeXu 阅读(12741) 评论(10) 编辑 收藏 手把手教你接口自 ...
- jenkins2 groovy脚本参考
使用plugin生成groovy脚本,或者参考已有的groovy脚本. 文章来自:http://www.ciandcd.com文中的代码来自可以从github下载: https://github.co ...
- ODI 12c中使用Groovy脚本创建工程
本文主要介绍在ODI中使用groovy创建工程,并添加一个表转换的映射.要创建groovy脚本,可以从ODI Studio的菜单:工具->Groovy->新脚本 打开一个编辑窗口.在执行下 ...
随机推荐
- RGB图片取大于阈值部分
#include<opencv2\opencv.hpp> #include <iostream> using namespace cv; using namespace std ...
- SpringMVC Shiro与filterChainDefinitions
SpringMVC整合Shiro,Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能. 第一步:配置web.xml <!-- 配置Shiro过滤器,先让Shiro ...
- AutoIncrement无法设置的问题
[AutoIncrement无法设置的问题] 下图红色处始终无法勾选Auto_Increment 解决方法是在详细列表里勾选. 链接:http://stackoverflow.com/question ...
- substring 比较(c#和Java)
Java中 string str = "123456"; str .substring(5); 结果:6 Substring(A)表示从原字符串的指定索引号A开始截取直到原字符串的 ...
- CSS:opacity:0,visibility:hidden,display:none的区别
CSS中opacity=0,visibility=hidden,display=none的时候,三者有什么区别呢?? 参考了stackoverflow的博客,才发现区别如下所示: Here is a ...
- vue通过ID(参数)修改URL复用同一个页面(组件)不重新加载的问题
项目中经常会用到同一个页面,结构是相同的,我只是在vue-router中通过添加参数的方式来区分状态,参数可以在页面跳转时带上params,或者query,但是有一个问题,即使我们修改了参数,URL也 ...
- 使用phpStudy运行伊人集项目
1.首次运行时,需要把system/config/install.look.php以及system/config/database.php(后面这个文件可以先不删除,若是安装过程中数据库报错,再来删除 ...
- mysql中创建event定时任务
从网上借鉴大神的. use onlinexam; -- 查看event事件是否开启 show variables like '%sche%'; -- 开启event事件 (非常重要) set glo ...
- springMVC数据交互
控制器 作为控制器,大体的作用是作为V端的数据接收并且交给M层去处理,然后负责管理V的跳转.SpringMVC的作用不外乎就是如此,主要分为:接收表单或者请求的值,定义过滤器,跳转页面:其实就是ser ...
- Node使用 Express框架,实现文件上传
一 安装依赖包 npm install multer --save 二 客户端上传文件 <!DOCTYPE html> <html> <head> <meta ...