ProCrawl:從多用戶 Web 應用程序中挖掘測試模型

ProCrawl:從多用戶 Web 應用程序中挖掘測試模型

引用

M. Schur, A. Roth, and A. Zeller, ‘ProCrawl: mining test models from multi-user web applications’, in Proceedings of the 2014 International Symposium on Software Testing and Analysis - ISSTA 2014, San Jose, CA, USA, 2014, pp. 413–416, doi: 10.1145/2610384.2628051.

摘要

現在的 Web 應用程序往往都需要很長的發佈週期,因此需要進行頻繁的測試。自動化測試通常需要一個行為模型:對應用程序可能處於的狀態的描述、狀態之間轉換的描述以及預期的結果的描述。此外,還需要通過腳本將模型中的抽象動作轉換為可執行的動作。但是,指定此類行為模型並手動編寫腳本是一項艱鉅的任務。我們提出了 ProCrawl,該工具可從多用戶 Web 應用程序中自動挖掘出有限狀態機並生成可執行的測試腳本。ProCrawl 通過生成、運行程序並觀察應用程序用戶界面上的更改來探索應用程序的行為。生成的模型可以直接用於基於模型的測試,尤其是迴歸測試。

1 介紹

現在的 web 應用程序更新頻率非常高。為了防止更新破壞 web 應用的功能,必須進行測試。因此頻繁的更新要求進行頻繁的測試。自動生成測試腳本需要一個描述可能的和預期的應用程序行為的模型。但是,通常 Web 應用程序沒有這樣的模型,因此需要手動創建模型,這導致了測試的效率變低,並增加理解和維護應用程序的 困難程度。

規範挖掘領域旨在通過挖掘程序執行中的行為模型來促進測試。規範挖掘已被成功地用來從程序中導出公理規範,例如函數和數據常量,或者描述各個類的狀態和轉換的有限狀態機。對於這些小規模的場景,驗證規 範相當容易,因為程序代碼和程序狀態都是可訪問的,並且可以進行符號推理和測試。

在系統級別提取模型則變得困難得多。例如,程序代碼和程序狀態可能無法用於分析或應用程序可能分佈在多個站點上。通常,唯一可以做的假設是存在一些用戶界面(UI),例如允許人機交互的 Web 界面。

2 用於 Web 應用程序的模型挖掘器

ProCrawl 是一款用於挖掘 Web 應用程序行為模型並生成可執行的測試腳本的全自動工具。之前我們已經討論並評估了我們的方法,因此本篇文章我們主要介紹我們的工具。第 2.1 節介紹了行為模型,並介紹了 ProCrawl 實現的測試過程。模型的質量很大程度上取決於所應用的抽象機制和要執行的操作選擇(在 2.2 和 2.3 節中進

行了描述)以及解決不確定性的能力(在 2.4 中進行了討論)。

2.1 使用 ProCrawl 測試 Web 應用程序

為了挖掘用戶交互的流程,ProCrawl 會通過 Web 瀏覽器實例化出多個被測系統的參與者。ProCrawl 是一種黑盒方法,即,它無需訪問被測系統的源代碼即可挖掘應用程序行為。

ProCrawl:從多用戶 Web 應用程序中挖掘測試模型

Figure 1: OXID eShop 中訂購過程的 ProCrawl 模型。轉換定義了導致狀態改變的動作以及在何種條件下啟用該轉換。例如,如果付款 ID 為“default”或者付款 ID 為“Cash in advance”,則啟用轉換(1a);如果 Paymentid 為“COD(貨到付款)”,則啟用轉換(1b)。

ProCrawl:從多用戶 Web 應用程序中挖掘測試模型

Figure 2: ProCrawl 的測試過程。(1)給定配置(2)自動探索應用程序行為(3)生成可執行的測試腳本和行為模型,並進行人工審核(4)這些測試腳本和測試模型將作為生成迴歸測試的標準。

通過挖掘程序獲得的行為模型是一個擴展的有限狀態機,其中的節點表示 Web 應用程序的抽象狀態,並按 ProCrawl 挖掘到的順序編號,而轉換則表示為更改狀態的一系列 UI 交互操作。例如,圖 1 顯示了 ProCrawl 提取的擴展有限狀態機,該有限狀態機對 OXID eShop(一種流行的開源電子商務平臺)中的訂購過程進行建模:客戶可以添加商品、刪除商品、選擇付款方式或提交訂單。零售商可以通過軟件後端進行發貨、取消訂單或刪除訂單。

圖 2 說明了 ProCrawl 的測試過程,其詳細過程如下。

2.1.1 整體配置

為了挖掘圖 1 所示的模型,ProCrawl 需要一個整體配置,其中包括:

  • 參與者:在我們的示例中,客戶可以訪問商店前端頁面,而零售商可以訪問商店的後臺管理界面。
  • 由參與者執行的開始動作。
  • 每個參與者的訪問範圍:在我們的示例中,具體表現為訪問購物車的 URL、訪問客戶訂購歷史的 URL

以及到達訂單列表的一系列操作。如果未提供範圍定義,則 ProCrawl 只會在執行操作之前和之後檢查在瀏覽器中呈現的頁面。

  • 一個可選的測試設置:該設置定義了被測系統的初始狀態。當需要在不可逆的操作後繼續挖掘時,可以通過該設置對被測系統進行初始化操作。

通過指定瀏覽器的類型和數量、最大點擊深度、需要考慮或忽略的 HTML 元素,可以為每個參與者調整默認配置。抽象狀態可以通過 DOM 篩選器來進行更改,並且測試腳本可以在行為挖掘期間檢查被測系統中存在的錯誤。

2.1.2 自動化的行為挖掘

ProCrawl 的挖掘過程完全自動化,無需用戶干預。ProCrawl 可以為實際的 Web 應用程序挖掘行為模型,可以實時觀察挖掘過程:對於每個參與者,啟動一個或多個 Web 瀏覽器,並在其中執行 UI 交互。當 ProCrawl 檢測到新的轉換時,執行的操作將作為 Selenium 腳本導出。導出的腳本可以使用 Selenium IDE 執行。挖掘獲得的行為模型以 GraphML 格式導出,可以在圖形編輯器中顯示(參見圖 1)。另外,ProCrawl 還將以文本的格式導出狀態,以便可以使用文本比較工具比較它們。

2.1.3 模型驗證

ProCrawl 通過觀察 Web 應用程序的行為來挖掘模型。此模型將作為自動生成可執行系統測試的標準。自動生成的測試可以檢測迴歸,從而消除從應用程序的一個版本到另一個版本的行為。但是,在沒有配置測試的情況 下,ProCrawl 不知道觀察到的行為是否正確。因此,在將該模型用於迴歸測試之前必須對其進行驗證。

2.1.4 迴歸測試生成

ProCrawl 挖掘的行為模型可以直接用於迴歸測試,通過自動生成的 Selenium 腳本執行該測試。測試失敗可能意味著被測系統的行為被改變或者 UI 界面發生了改變。在這種情況下,必須手動重新生成或更新腳本。在我們對三個實際 Web 應用程序的評估中,生成的測試不僅檢測到了行為的改變,也檢測到了 UI 界面的改變。

2.2 狀態和事件抽象

Web 應用程序通常將不同的功能分離到不同的視圖中。為了提取描述被測系統業務邏輯的模型,ProCrawl 對可見的 UI 元素進行抽象,從而其識別相似的狀態。如果沒有適當的抽象,UI 中每個元素的更改都會導致不同的狀態。

2.2.1 狀態抽象

ProCrawl 假設被測系統的當前狀態全部反映在 UI 中,其中每個參與者和每個視圖的關係都暴露了應用程序狀態的特定部分。ProCrawl 使用抽象函數對文檔對象模型(DOM)進行抽象,從而區分被測系統的不同狀態。具體的 DOM 狀態通過特定的 UI 元素進行區分。通過這種方式,ProCrawl 可以確定應用程序狀態,而無需訪問被測系統的源代碼。ProCrawl 並行訪問這些視圖,提取 DOM 並通過過濾器來計算其狀態。在默認配置中,ProCrawl 將從 DOM 中提取可見的超鏈接、按鈕和文本進行抽象。但是,可以通過提供 XPath 表達式或 CSS 選擇器來更改提取的元素類型。

2.2.2 行為抽象

ProCrawl 將那些不會改變被測系統狀態的操作歸類為導航。這些操作只適用於被測系統的特定界面,因此在整個應用程序生命週期中都是不穩定的。但是,由於操作集合通常跨越多個視圖,因此 ProCrawl 需要執行導航操作才能激活相應的 HTML 元素。ProCrawl 通過引入兩個抽象層來解決此問題:獨立於導航動作的模型層以及將導航操作綁定到特定行為的可執行腳本。通過這種方法,當被測系統的 UI 發生更改時,只需要更新腳本中的導航操作,模型層本身不需要改變。

2.3 因果驅動的行為挖掘

ProCrawl:從多用戶 Web 應用程序中挖掘測試模型

2.4 轉換保護條件

通過上述過程,ProCrawl 已經可以導出合適的行為模型。但是有時提取的狀態機是不確定的,因為僅部分系統狀態反映在 UI 中,雖然這很正常,但不確定的轉換會在測試生成期間導致問題。例如,在圖 1 中選擇“貨到付款”作為付款方式時會增加附加費。訂購後,所選付款方式不再反映在用戶界面中。從購物車中刪除產品 或刪除訂單後,將商品重新添加到購物車中,會記住之前的付款方式,從而導致錯誤。如果在執行操作後未能 在模型中很好地定義被測系統的狀態,則基於模型的測試通常會失敗。因此,ProCrawl 希望通過在行為探索過程中推斷擴展狀態的互斥保護條件來解決不確定性問題。

只有在保護條件為真時,才能啟用轉換。例如,僅當選擇了貨到付款作為付款方式時,才啟用添加到購物車的轉換。非確定性轉換將使用推斷的保護條件進行註釋,從而生成擴展的有限狀態機。ProCrawl 通過在非確定性轉換的路徑上創建分類問題來推斷這些保護條件,然後迭代生成用於決策樹分類器學習的樣本,然後將 其轉換為圖 1 所示的保護條件。

3 實現

ProCrawl 使用 Java 實現,使用 Selenium 進行 Web 端的自動化操作。為了構建用於推斷轉換保護條件的分類器,我們使用了 Weka 提供的 C.4.5 算法的一種變體來實現。為了增加用於構建分類器的樣本數量,我們使用 ProB 模型檢查器生成具有未經測試的輸入值的路徑。

4 相關工作

目前,已有多種方法可以將程序行為捕獲為事件的執行順序,其中大多數方法都是對象級別的。ProCrawl 與他們的主要區別是通過生成挖掘程序學習應用程序的行為,而大多數方法都依賴於一組給定的程序。

ProCrawl 與 Crawljax 類似,Crawljax 是針對 AJAX 網站的最先進的網絡爬蟲。Crawljax 提取的狀態流圖描述了 AJAX 站點內的各種導航路徑和 UI/DOM 狀態。狀態流圖中的節點元素表示 AJAX 站點的單個

DOM 狀態,而轉換表示為單個 UI 事件。但是,將抽象狀態限制為單個用戶的單個 DOM 狀態,會限制搜尋器能檢測到的操作數,從而限制基於模型的測試。在 ProCrawl 挖掘到的模型中,一個節點表示為多個用戶的多個抽象 DOM 狀態,並且轉換表示為生成的腳本,這些腳本封裝了 UI 特定的導航路徑和行為。此外, ProCrawl 還通過推斷輸入數據的轉換保護條件,消除轉換的不確定性。

5 結論

ProCrawl 是一種用於挖掘行為模型的全自動工具,該模型包括來自多用戶 Web 應用程序的用於迴歸測試和系統驗證的可執行測試腳本。模型中的抽象狀態非常具體,可以捕獲必要的過程步驟,同時,其通用性又足以 適用於各種 Web 應用程序。

致謝

本文由南京大學軟件學院 2020 級碩士張松濤轉述

感謝國家重點研發計劃(2018YFB1003900)和國家自然科學基金(61832009,61932012)支持!


分享到:


相關文章: