使用 Groovy 实现自动化的 SoapUI
介绍
我曾需要捕获来自至少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 的免费版本.
当你第一次运行时,看起来像下面这样:
我创建了一个工作空间存储我的项目,叫做 Automation. 为此,我们要去选择 ‘File’-> ‘New Soap Project’ ,填入项目名称和web服务的.wsdl 文件位置.
请确保你勾选了创建请求 'Create Requests' 和创建测试套件 'Create TestSuite', 然后点击 'OK'.
SoapUI 将会检查web服务,返回你可以在服务上调用的操作/方法. 在我的任务中,只有一个叫做SubmitRequestResponse的操作, 但我还是选择了 'Single TestCase with One Request for Each Operation'.
点击 'OK' 而你将会收到提醒,告知要为Test SuiteMultiple命名.
现在当SoapUI已经设置好了项目, 展开整个项目结构如下:
如果你在 Request 1 上单击, 你可以看到一个基础的请求格式.
我们需要在继续进行之前确保调用从web服务上获得了一个响应,所以我们添加一个soap请求。在我的情况里,web服务需要一个客户号跟着一个地点位置标签跟着一个或多个SalesOrders。所以我在 body 中用我的soap请求替换<part>?</part>标签。
点击绿色箭头(左上方)然后你将获得一个XML响应。
如果你有响应,那么你就在你需要在的地方。
设置 Test 文件,Test 步骤和 Test 脚本
在这一点,我们知道 SoapUI 可以发送请求到我们的web服务并返回一个响应。
现在我们需要设置我们的Test步骤和Test脚本。
Test 文件
在你的文件系统中创建一个目录并添加两个子目录。
在请求里,我们需要添加请求文件。
该文件必须和你在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头。我们可以忽略这个。
右击 Test Steps 标题然后选择 'Add Step' 然后选择 'Groovy Script'。
重命名为Step1。
点击 'OK' 然后将出现Groovy 编辑器。
在这里我们添加我们的第一个脚本。
Test 脚本
测试脚本由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 object' ,这样我们将要创建的其他测试步骤也可以使用这个数组。
我们需要更改第二行使其映射我们的文件的路径,并添加一个快速检查。
在我的情况中,脚本变成:
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 调试器.
Fiddler 能让你模拟需要从web服务发送和接收的东西.
当你打开 Fiddler, 需要一点点设置,以便你查看到你的web服务的网络通路. 在任务条上,点击 'Tools' -> Fiddler 选项,打开连接选项卡. Fiddler 一般会在端口8888上监听,如下可以改成8080:
这就是在Fiddler上要做的事情.
回到 SoapUI ,选择 'File'-> 'Preferences'-> 'Proxy Settings'. 我的设置成了 自动'Automatic'. 一开始我使用SSL时,遇到了一些问题.
我的HTTP设置 'HTTP Settings' 被设置成了默认选项. 这里有一个告诉你用SoapUI设置Fiddler的一个不错的网站:
By Dinesh K Mandal, 8 Sep 2011.
为了测试所有的东西是否都正常,回到SoapUI并双击你的测试项。我的测试项被叫做 'BasicHttpBinding_ITwoWayAsync TestSuite'.
会显示出一个测试项窗口:
幸运的话你可能会看到一个会话出现在了Fiddler中:
真很棒. 如果你没有看到会话的显示,那就把SoapUI里面所有的东西都保存一下,然后重启,再重新尝试一下.
回到 SoapUI.
在测试项窗口,单击绿色的箭头,来运行测试的步骤:
看看Fiddler,你将会看到一个会话已经被捕获.
如果你在会话上点击,并以XML形式查看结果,你将会看到向web服务发送的请求显示在顶部的面板,而来自服务的回应显示在底部的面板.
我们已经成功的调用了我们的web服务,并收到了它的响应. 我们现在需要一个将响应保存到文件的步骤.
脚本 3
回到SoapUI并在 'Test Steps (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") }
这块代码从上下文(见第一步)处获取数组, 从数组获取到一个文件,获得它的名字,并从名字中移除.xml。然后它会获得从步骤二返回的响应,并将其作为响应”response“存储.
然后他会在响应路径中创建一个新的文件,并将其命名为老的文件名,后面加上 '_Response.xml'’ 。
然后它会将来自web服务的响应写到该文件中。
最有有一节会检查数组的大小,而如果它比0大,那就仍然会有一个测试要运行,如此 gotoStepByName 函数会表示要跳到步骤二 'Step2'。
双击 'Test Steps (3)’ 测试项运行测试套件.
检查 Fiddler,并看看响应文件夹.
这挽救了我悲惨的未来,而这里面真正有用的信息都来 M. McDonald 和 Dinesh K. Mandal.
希望它能对其他人有用.