65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Groovy 自动化 SoapUI – 逐步讲解

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2014 年 9 月 18 日

CPOL

6分钟阅读

viewsIcon

132639

downloadIcon

9

如何使用 Groovy 自动化 SoapUI

引言

我有一个需求,需要捕获至少 100 次 Web 服务调用的响应。这是为了让非 IT 人员能够手动检查响应,他们需要将响应整理成 Excel 文件格式。

我能够使用免费版本的 SoapUI 4.6.4 并结合一些 groovy 脚本来完成这个任务。您可能还需要下载 Fiddler2 来检查一切是否正常工作。

大部分脚本都是复制粘贴 M. McDonald 在 http://forum.loadui.org/viewtopic.php?f=5&t=16354#p38935 提供的代码。

如果您不熟悉 SoapUI Groovy 和 Java,可能会感到非常困惑,但不要灰心!

SoapUI 设置

下载免费版本的 SoapUI 并进行安装。

首次运行时,界面大致如下:

我创建了一个名为 Automation 的工作区来存储我的项目。此时,转到“文件”->“新建 Soap 项目”,然后填写项目名称以及 Web 服务的 .wsdl 文件位置。

确保勾选“创建请求”和“创建测试套件”,然后点击“确定”。

SoapUI 将会检查 Web 服务,并返回您可以调用的所有操作/方法。在我的例子中,只有一个名为 SubmitRequestResponse 的操作,但我仍然选择了“为每个操作生成单个测试用例和单个请求”。

点击“确定”,系统会提示您命名测试。

我将其命名为“Multiple Calls TestSuit”。

现在 SoapUI 已经设置好了项目,展开结构,看起来大致如下:

双击“请求 1”,会得到一个基本的请求表单。

我们需要确保在继续之前,调用能够获得 Web 服务的响应。因此,我们添加一个 soap 请求。在我的例子中,Web 服务需要一个客户编号,后跟一个站点位置标签,再后跟一个或多个 SalesOrders。所以我用我的 soap 请求替换了 body 中的 <part>?</part> 标签。

点击绿色的箭头(左上角),您将获得一个 XML 响应。

如果您获得了响应,那么您就走在正确的路上了。

设置测试文件、测试步骤和测试脚本

此时,我们知道 SoapUI 可以向我们的 Web 服务发送请求并返回响应。

现在我们需要设置我们的测试步骤和测试脚本。

测试文件

在您的文件系统中创建一个目录,并添加两个子目录。

在 requests 目录中,我们需要添加请求文件。

文件必须与您在“请求 1”中添加的格式相同,即:

<ns0:CheckGuaranteeRequest xmlns:ns0="http://www.####.com/namespaces/portal/checkguarantee/in/2014.03">
<CustomerNumber>102277</CustomerNumber>
<SiteLocation>COAST</SiteLocation>
<SalesOrders>
<Id>1000495222</Id>
<Id>1000498217</Id>
</SalesOrders>
</ns0:CheckGuaranteeRequest>

它们还必须具有 .xml 文件扩展名。

测试步骤

检查项目结构,并确保“测试步骤 (1)”部分已展开。双击 SubmitRequestResponse 会显示一个基本的 soap 头。目前我们可以忽略它。

右键单击“测试步骤”标题,选择“添加步骤”,然后选择“Groovy Script”。

将其重命名为 Step1

点击“确定”,Groovy 编辑器将会出现。

我们在这里添加我们的第一个脚本。

脚本

测试脚本由 M. McDonald 提供(见上文)。

脚本 1

第一个脚本是:

def fileList = []
new File("C:\\requests").eachFile { f ->
if (f.isFile() && f.name.endsWith('.xml')) {
   def filename = f.name[0..-5]
     fileList.add(filename)
}
}
if (fileList.size() < 1) {
   testRunner.fail("No request files")
}
context.put('fileList', fileList)

第一步定义了一个数组。

接下来是创建文件并将其添加到 fileList 数组的部分,该文件来自我们的测试文件目录。它还会移除一些字符,检查数组大小以确保存在文件,然后将数组添加到“context 对象”中,以便其他测试步骤可以使用该数组。

我们需要修改第二行以反映我们文件的路径,并添加一个快速检查。

在我的例子中,脚本如下:

def fileList = []

new File("C:\\GroovyTest\\requests").eachFile
{ f ->
if (f.isFile()&& f.name.endsWith('.xml'))
{
 def filename = f.name[0..-1]
 fileList.add(filename)
 log.info filename
}
}

if (fileList.size() <1)
{
testRunner.fail("No request files found")
}
context.put('fileList',fileList)

'log.info filename' 这行代码会将请求目录中的文件名打印到脚本日志中。

点击 Step1 窗口底部的“脚本日志”按钮,然后点击左上角的绿色箭头运行脚本。您应该会看到文件列表被打印出来。

到目前为止一切顺利。我们已经成功读取了请求目录中文件的名称并显示了它们。此时,最好注释掉打印数组中文件名的那一行。

脚本 2

我们已经有了步骤 2,它叫做 SubmitRequestResponse。将其重命名为 'Step2'。

删除 Soap 请求正文中的 ' <part>?</part>' 节点,并添加以下内容:

 ${=new File("C:\\GroovyTest\\requests\\" + (context.get('fileList')).last()).text}

请注意,我已更改了请求目录的路径!!!

现在我们需要将 Step2 拖到项目结构中的 Step1 下方,使其看起来像这样:

我们现在可以测试这两个脚本,看看它们是否正常工作。

设置 Fiddler 的时间

只需安装 Fiddler Web Debugger。

Fiddler 允许您监控发送到 Web 服务以及从 Web 服务接收到的内容。

打开 Fiddler 后,需要进行一些配置才能查看 Web 服务的流量。在任务栏中,转到“工具”->“Fiddler 选项”并打开“连接”选项卡。Fiddler 通常监听端口 8888,所以将其更改为 8080,如下所示:

Fiddler 就这样设置好了。

返回 SoapUI,查看“文件”->“首选项”->“代理设置”。我的设置是“自动”。我遇到了一些问题,因为我最初使用的是 SSL。

我的“HTTP 设置”设置为默认选项。一个好的设置 Fiddler 与 SoapUI 的网站是:

作者:Dinesh K Mandal,2011 年 9 月 8 日。

为了测试一切是否正常工作,回到 SoapUI 并双击您的测试用例。在我的例子中,它叫做 'BasicHttpBinding_ITwoWayAsync TestSuite'。

测试用例窗口将出现:

您可能很幸运,在 Fiddler 中会看到一个会话出现,如下所示:

这是好的。如果您没有看到会话出现,请在 SoapUI 中保存所有内容并重新启动,然后重试。

回到 SoapUI。

在测试用例窗口中,点击绿色箭头运行测试步骤。

查看 Fiddler,您会看到一个会话已被捕获。

如果您点击该会话并以 XML 格式查看结果,您将在顶部面板中看到发送到 Web 服务的请求,在底部面板中看到来自 Web 服务的响应。

我们已经成功调用了我们的 Web 服务并获得了响应。现在我们需要一个步骤来将响应保存到文件中。

脚本 3

回到 SoapUI,右键单击“测试步骤 (2)”,选择“添加步骤”->“Groovy Script”。将其重命名为 'Step3'。

将以下脚本添加到 Groovy 窗口,请将目录更改为与您的目录结构匹配。

def fileList = context.get('fileList')

def fileName = fileList.pop()
def newname = fileName[0..-5]

def response = context.expand( '${Step2#Response}' )
def f = new File("C:\\GroovyTest\\responses\\${fileName}_Response.xml")
f.write(response, "UTF-8")

if(fileList.size() >0)
{
testRunner.gotoStepByName("Step2")
}

这段脚本从 context(参见 Step1)中获取数组,从数组中取出一个文件,获取其名称,并从中移除 .xml 后缀。然后获取 Step2 返回的响应,并将其存储为 'response'。

然后它会在 response 目录中创建一个新文件,并将其命名为旧文件名,但同时在文件名后添加 ' _Response.xml'。

然后它会将 Web 服务的响应写入文件。

最后一部分会检查数组的大小,如果大于 0,则表示还有测试需要运行,因此 gotoStepByName 函数会跳转到 'Step2'。

双击“测试步骤 (3)”测试用例并运行测试套件。

检查 Fiddler,并查看 Response 目录。

这可以为我节省未来的麻烦,但真正的信息来自 M. McDonald 和 Dinesh K. Mandal。

希望这对其他人有所帮助。

© . All rights reserved.