使用 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)</pre>
'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") }</pre>
這塊代碼從上下文(見第一步)處獲取數組, 從數組獲取到一個文件,獲得它的名字,并從名字中移除.xml。然后它會獲得從步驟二返回的響應,并將其作為響應”response“存儲.
然后他會在響應路徑中創建一個新的文件,并將其命名為老的文件名,后面加上 '_Response.xml'’ 。
然后它會將來自web服務的響應寫到該文件中。
最有有一節會檢查數組的大小,而如果它比0大,那就仍然會有一個測試要運行,如此 gotoStepByName 函數會表示要跳到步驟二 'Step2'。
雙擊 'Test Steps (3)’ 測試項運行測試套件.
![]()
檢查 Fiddler,并看看響應文件夾.
![]()
這挽救了我悲慘的未來,而這里面真正有用的信息都來 M. McDonald 和 Dinesh K. Mandal.
希望它能對其他人有用.