使用 Groovy 实现自动化的 SoapUI

jopen 10年前

介绍

我曾需要捕获来自至少100次对web服务调用的响应. 这是为了能让非IT职务成员对响应进行人工检查,它们需要Excel文件格式的响应记录.

使用一些groovy脚本,我得以利用 SoapUI 4.6.4 的免费版本完成了这项任务. 你可能也会想要下载 Fiddler2 来检查工作成果是否能够运作的.

脚本大部分剪贴了由 M. McDonald http://forum.loadui.org/viewtopic.php?f=5&t=16354#p38935 提供的代码.

如果你对 SoapUI Groovy 和 Java 熟悉,可能会感到疑惑,但请不要绝望!

SoapUI 的设置

下载并安装 SoapUI 的免费版本.

当你第一次运行时,看起来像下面这样:

使用 Groovy 实现自动化的 SoapUI

我创建了一个工作空间存储我的项目,叫做 Automation. 为此,我们要去选择 ‘File’-> ‘New Soap Project’ ,填入项目名称和web服务的.wsdl 文件位置.

使用 Groovy 实现自动化的 SoapUI

请确保你勾选了创建请求 'Create Requests' 和创建测试套件 'Create TestSuite', 然后点击 'OK'.

SoapUI 将会检查web服务,返回你可以在服务上调用的操作/方法. 在我的任务中,只有一个叫做SubmitRequestResponse的操作, 但我还是选择了 'Single TestCase with One Request for Each Operation'.

使用 Groovy 实现自动化的 SoapUI

点击 'OK' 而你将会收到提醒,告知要为Test SuiteMultiple命名.

使用 Groovy 实现自动化的 SoapUI

使用 Groovy 实现自动化的 SoapUI

现在当SoapUI已经设置好了项目, 展开整个项目结构如下:

使用 Groovy 实现自动化的 SoapUI

如果你在 Request 1 上单击, 你可以看到一个基础的请求格式.

使用 Groovy 实现自动化的 SoapUI

我们需要在继续进行之前确保调用从web服务上获得了一个响应,所以我们添加一个soap请求。在我的情况里,web服务需要一个客户号跟着一个地点位置标签跟着一个或多个SalesOrders。所以我在 body 中用我的soap请求替换<part>?</part>标签。

使用 Groovy 实现自动化的 SoapUI

点击绿色箭头(左上方)然后你将获得一个XML响应。

使用 Groovy 实现自动化的 SoapUI

如果你有响应,那么你就在你需要在的地方。

设置 Test 文件,Test 步骤和 Test 脚本

在这一点,我们知道 SoapUI 可以发送请求到我们的web服务并返回一个响应。

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

Test 文件

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

使用 Groovy 实现自动化的 SoapUI

在请求里,我们需要添加请求文件。

该文件必须和你在Request 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 的文件扩展。

Test 步骤

检测项目的结构并确保添加了Test Steps (1)。双击 SubmitRequestResponse 显示一个基础的soap头。我们可以忽略这个。

使用 Groovy 实现自动化的 SoapUI

右击 Test Steps 标题然后选择 'Add Step' 然后选择 'Groovy Script'。

使用 Groovy 实现自动化的 SoapUI

重命名为Step1。

使用 Groovy 实现自动化的 SoapUI

点击 'OK' 然后将出现Groovy 编辑器。

使用 Groovy 实现自动化的 SoapUI在这里我们添加我们的第一个脚本。

Test 脚本

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

脚本 1

第一个脚本是:

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

第一步定义了一个数组。

然后从我们的测试文件目录创建一个文件并将其添加到 fileList 数组中。同时也截断一些字符,检查数组的大小以确保一些文件存在,然后添加数组到 'context object' ,这样我们将要创建的其他测试步骤也可以使用这个数组。

我们需要更改第二行使其映射我们的文件的路径,并添加一个快速检查。

在我的情况中,脚本变成:

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

 'log.info filename ' 行使在请求目录中的文件名打印到脚本日志中。

在Step1 窗口底部点击脚本日志按钮,然后点击左上角的绿色箭头运行该脚本。你应该能看到文件打印输出列表。

使用 Groovy 实现自动化的 SoapUI

好了。我们已经成功的在我们的需求目录中读取了文件名并展示了它们。最好在此时注释掉从数组中打印输出文件名的行。

使用 Groovy 实现自动化的 SoapUI

脚本 2

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

在Soap请求模块中删除 ' <part>?</part>'节点并添加下列:

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

请注意我已经更改目录为请求的目录!!!

使用 Groovy 实现自动化的 SoapUI

现在我们需要在项目结构中将 Step2 拖拽到 Step1 的下面,所以看起来是这样:

使用 Groovy 实现自动化的 SoapUI

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

是时候来设置 Fiddler 了

就是要安装一下 Fiddler Web 调试器.

Fiddler 能让你模拟需要从web服务发送和接收的东西.

当你打开 Fiddler, 需要一点点设置,以便你查看到你的web服务的网络通路. 在任务条上,点击 'Tools' -> Fiddler 选项,打开连接选项卡. Fiddler 一般会在端口8888上监听,如下可以改成8080:

使用 Groovy 实现自动化的 SoapUI

这就是在Fiddler上要做的事情.

回到 SoapUI ,选择 'File'-> 'Preferences'-> 'Proxy Settings'. 我的设置成了 自动'Automatic'. 一开始我使用SSL时,遇到了一些问题.

我的HTTP设置 'HTTP Settings' 被设置成了默认选项. 这里有一个告诉你用SoapUI设置Fiddler的一个不错的网站:

By Dinesh K Mandal, 8 Sep 2011.

为了测试所有的东西是否都正常,回到SoapUI并双击你的测试项。我的测试项被叫做 'BasicHttpBinding_ITwoWayAsync TestSuite'.

会显示出一个测试项窗口:

使用 Groovy 实现自动化的 SoapUI

幸运的话你可能会看到一个会话出现在了Fiddler中:

使用 Groovy 实现自动化的 SoapUI

真很棒. 如果你没有看到会话的显示,那就把SoapUI里面所有的东西都保存一下,然后重启,再重新尝试一下.

回到 SoapUI.

在测试项窗口,单击绿色的箭头,来运行测试的步骤:

使用 Groovy 实现自动化的 SoapUI

看看Fiddler,你将会看到一个会话已经被捕获.

如果你在会话上点击,并以XML形式查看结果,你将会看到向web服务发送的请求显示在顶部的面板,而来自服务的回应显示在底部的面板.

使用 Groovy 实现自动化的 SoapUI

我们已经成功的调用了我们的web服务,并收到了它的响应. 我们现在需要一个将响应保存到文件的步骤.

脚本 3

回到SoapUI并在 'Test Steps (2)‘上右击,选择 Groovy Script. 将其重命名为 'Step3'.

在Groovy窗口中添加如下的脚本 , 修改路径,以匹配你的路径结构.

def fileList = context.get(&apos;fileList&apos;)    def fileName = fileList.pop()  def newname = fileName[0..-5]    def response = context.expand( &apos;${Step2#Response}&apos; )  def f = new File("C:\\GroovyTest\\responses\\${fileName}_Response.xml")  f.write(response, "UTF-8")    if(fileList.size() >0)  {  testRunner.gotoStepByName("Step2")  }

这块代码从上下文(见第一步)处获取数组, 从数组获取到一个文件,获得它的名字,并从名字中移除.xml。然后它会获得从步骤二返回的响应,并将其作为响应”response“存储.

然后他会在响应路径中创建一个新的文件,并将其命名为老的文件名,后面加上  '_Response.xml'’ 。

然后它会将来自web服务的响应写到该文件中。

最有有一节会检查数组的大小,而如果它比0大,那就仍然会有一个测试要运行,如此 gotoStepByName 函数会表示要跳到步骤二 'Step2'。

双击 'Test Steps (3)’ 测试项运行测试套件.

使用 Groovy 实现自动化的 SoapUI

检查 Fiddler,并看看响应文件夹.

使用 Groovy 实现自动化的 SoapUI

这挽救了我悲惨的未来,而这里面真正有用的信息都来 M. McDonald 和 Dinesh K. Mandal.

希望它能对其他人有用.