SoapUI是支持groovy脚本,因此我们可以自定义groovy脚本,用来从数据库中获取数据库,并在发送之前修改请求XML结点的值,以达到随机获取数据进行压力测试的目的,这样可以让测试结果更加真实。
SoapUI本身没有带数据库相关驱动的JAR包的,根据它的要求,我们将数据库相关的驱动放到$SOAPUI_HOME/bin/ext目录下,并在loadrunner.bat中set CLASSPATH那么行加上ext目录,修改过来看起来应该是这样的:
set CLASSPATH=%SOAPUI_HOME%soapui-3.6.1.jar;%SOAPUI_HOME%..\lib\*;%SOAPUI_HOME%..\bin\ext\*;
驱动准备好了,现在我们可以写获取数据的groovy脚本了,打开你的loadtest(在公司不可以上传图片,如果不知道我也帮不了你了),在"setup script"中写入自己的获取数据的脚本,大致如下:
import groovy.sql.Sql
Properties properties = new Properties();
properties.load(new FileInputStream("somedirecotry/home/dataSource.properties"));
config = new ConfigSlurper().parse(properties);
Sql sql=Sql.newInstance(config.url,config.username,config.password,config.driverClassName);
List<String> someDataList = new ArrayList<String>();
sql.eachRow("select somecolumn from sometable"){row ->
someDataList.add(row.somecolumn);
}
context.setProperty("someDataList",someDataList);
println "****************************************setup end**********************************************";
之所以将数据写在Load Test里,是因为每一次压力测试执行之前,这个会被执行一次,并且只会执行一次,类似于单元测试的beforeClass方法,我们在Test Step里面就直接使用这里取出来的数据就好了;如果是将这一段获取数据的脚本放在每一个Test Step里,就表示每一个测试都需要从数据库中获取数据,类似于单元测试的before方法,每个测试都会执行一遍,这会非常影响测试结果的。
数据已经取好了,那么就可以在Test Step里面使用了,记得获取数据是在LoadTestContext中获取,然后在Test Step的最前面加上一个"Groovy Script Test Step",在这里使用Load Test中获取的数据:
//记住数据一定是从LoadTestContext中获取
List<String> someDataList = context.getProperty("LoadTestContext").getProperty("someDataList");
Random r = new Random();
String someData = "";
//每次随机获取
if(ptflNos!=null&&!ptflNos.isEmpty()){
int index = r.nextInt(someDataList.size()-1);
someData = someDataList.get(index);
}
println someData;
def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);
def holder = groovyUtils.getXmlHolder("Request1#Request");
//将值写到请求的xml中
holder.setNodeValue("//soapenv:Body/saes:SomeDataRequest/saes:SOME_FIELD", someData);
groovyUtils.setPropertyValue( "Request1", "Request", holder.prettyXml );
当然不要忘上在Test Step里面加上要测试的步骤了,要不然测试什么呢。