我使用SoapUI的开源版本来做一些SOAP Web服务负载测试。
我希望每个请求尽可能与以前的请求不同,我不希望进行具有相同属性的负载测试。
我有一个属性文件,它有几个属性,每个属性值都是调用一个groovy脚本从文件中读取一个随机值并将其分配给测试用例属性,即在值字段中:
${=(DynamicPropertyScript)}
脚本:
// Load property from file
def file = new File('path')
// Create empty list for file contents
def list = [];
// Populate list with file contents
addURLstoList = {list.add(it)};
file.eachLine(addURLstoList);
// Pick a random item from list
def randomIndex = (int)Math.random()*list.size;
def randomValue = list.get(randomIndex);
// Assign random value to property
def tc = testRunner.testCase;
tc.setPropertyValue('property', randomValue);
log.info(randomValue)
如果我在测试用例开始时调用它,这个脚本工作正常,我关心的是在启动时生成的属性对于每个后续请求都是相同的,这就是我想要避免的
我尝试了几件事,但最终失败了(由于我缺乏Groovy和SoapUI的经验)。
我在请求中试过的一些事情
<inc:ID>${Properties#property}</inc:ID>
<inc:ID>${=(DynamicPropertyScript)}</inc:ID>
我遇到的错误:
<inc:ID>No such property: DynamicPropertyScript for class: Script4</inc:>
如果有其他方法可以提供帮助,我将非常感谢任何帮助(我知道每次发送大量请求和从磁盘读取都不理想)。
谢谢:)
答案 0 :(得分:2)
我希望将数据列表加载到内存中一次以避免重复IO,然后在测试步骤中从列表中选择随机项,这需要使用Groovy表达式。您可以使用上下文变量将数据保存在内存中。
以下Groovy脚本将读取位于Project根目录中名为data1.txt
的数据文件的内容,并将其加载到上下文变量中。 context.data变量将数据项保存为列表,context.dataCount保存项目数。
您可能希望将其添加为安装脚本(针对TestSuite或TestCase),而不是在Groovy测试步骤中,以便它只运行一次。上下文变量保留在相应的Suite / Case运行器的范围内,因此可以在任何后续步骤中引用。
def projectDir = context.expand('${projectDir}') + File.separator
def dataFile = "data1.txt"
try
{
File file = new File(projectDir + dataFile)
context.data = file.readLines()
context.dataCount = context.data.size
}
catch (Exception e)
{
testRunner.fail("Failed to load " + dataFile + " from project directory.")
return
}
然后,要从context.data变量中获取随机数据项,请根据需要输入以下表达式作为参数值或嵌入在请求正文中。
${=context.data.get((int)(Math.random()*context.dataCount))}