使用 Groovy 自动化 SoapUI – 逐步讲解
如何使用 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。
希望这对其他人有所帮助。