使用groovy的每个SoapUI请求的唯一属性

时间:2014-12-11 14:07:49

标签: groovy soapui

我使用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:>

如果有其他方法可以提供帮助,我将非常感谢任何帮助(我知道每次发送大量请求和从磁盘读取都不理想)。

谢谢:)

1 个答案:

答案 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))}