LAND:適用於 Android 應用的用戶友好且可自定義的測試生成工具

LAND:適用於 Android 應用的用戶友好且可自定義的測試生成工具

摘要:

基於模型的 GUI 探索技術被廣泛用於為事件驅動程序(例如 Android 應用)生成測試用例。這些技術在用戶交互過程中遍歷屏幕元素,並同時構建 GUI 模型。儘管有許多基於模型的自動探索工具,但是與模型重用相比,大多數工具更關注探索過程。本文介紹了 LAND,這是一種基於 Android 應用的 GUI 探索的有效且用戶友好的測試生成工具,它構建了精心設計的窗口轉換模型“ LATTE”,該模型考慮了更多 Android 特定特性,並通過重用該模型提供了可定製的測試生成界面。我們在 20 個真實的 Android 應用程序上進行了實驗,以構建其模型和測試用例。實驗結果表明,LAND 可以實現更高的代碼覆蓋率並以較短的序列觸發異常。還證明了 LATTE 在生成測試套件的不同要求下可以很好地重用。可以在以下網站上找到我們工具的演示視頻:https://www.youtube.com/watch?v=iqtr12eiJ_0

關鍵詞:Android GUI 模型; 有針對性的測試生成; 動態建模

1. 引言

測試用例是測試領域中必不可少的元素。對於事件驅動程序,例如 Android 應用程序,測試用例是無限長度的事件序列,由任意順序的事件(例如點擊、滾動、輸入)組成。 Android 應用程序可以視為小部件的集合,每個小部件都在 Android 系統提供的與用戶交互的 Activity 類中定義。小部件上的用戶操作將觸發相應的事件,並驅動該應用程序從一個窗口轉移到另一個窗口。 GUI 測試的主要挑戰在於如何生成有效的測試用例,以實現更高的代碼覆蓋率和更強的故障檢測能力。為了實現這一目標,GUI 探索技術,特別是基於模型的 GUI 探索技術,以動態信息獲取和事件選擇而被廣泛採用。

近年來,已經提出了幾種基於模型的 Android 應用 GUI 探索方法[5-7]。他們中的大多數專注於在探索過程中生成測試用例,而忽略了對生成的模型進行進一步測試的重用。模型構建的系統探索過程通常很耗時。然而,所獲得的模型很少或僅用於生成小型測試套件,導致測試能力的浪費和測試生成效率的降低。

因此,我們提出了 LAND(一種適用於 Android 應用程序的用戶友好且可自定義的測試生成工具),以提高基於模型的 GUI 測試的效率。我們的工具可以在沒有被測應用程序(AUT)源代碼的情況下使用。它在探索過程中構造了設計的模型,可以重複使用以滿足不同的測試要求。為了設計精緻的 AUT 模型,需要考慮更多 Android 特定的特性,例如後堆棧[1],Activity 啟動模式以及動態窗口小部件狀態信息。除了 GUI 信息之外,我們還通過標籤機制將此模型中的轉換鏈接到相應的已執行代碼段。 此外,提出了一種名為“狀態相似性”的度量,以平衡分析期間的準確性和成本。 最後,用戶可以在測試生成的多種需求下使用構建的模型,包括活動導向、小部件導向、標籤導向、圖形遍歷和記錄和重放。 生成的測試用例採用可運行、可讀和可編輯的測試腳本的形式。

2. LAND

在本節中,我們介紹工具 LAND 的系統架構和使用的技術。

2.1 系統總覽

LAND 將 Android 應用程序作為輸入,並輸出構建的 LATTE 模型以及生成的測試用例。 圖 1 概述了 LAND,它包含四個模塊:預處理,GUI 探索,測試生成和報告生成。

l 預處理模塊在 Dalvik 字節碼上對 AUT 進行檢測,以進行目標標記和覆蓋範圍計算,並且它將根據 AUT 的功能自動生成探測配置文件。

l GUI 探索模塊在執行三個子模塊的循環中迭代更新構造的 LATTE 模型,包括事件選擇和觸發(事件執行器),信息監視(監視器)以及狀態抽象和模型構造(模型構造器)。

l 測試生成模塊可以利用 LATTE 中的嵌入式信息,重用已構建的模型來生成滿足多個需求的測試用例。

l 報告生成模塊提供了詳細的代碼覆蓋範圍和崩潰報告,以進行相應的探索。

LAND:適用於 Android 應用的用戶友好且可自定義的測試生成工具

2.2 GUI 探索

我們的 GUI 探索方法將已檢測的 Android apk 文件及其配置文件作為輸入,並輸出相應的 LATTE 模型。 LATTE 是一個窗口過渡圖,它根據小部件和後堆棧將每個活動劃分為一個或多個狀態,並記錄窗口之間的過渡信息。 LATTE 模型的詳細信息可以從我們以前的工作中獲得[9]。這種方法的基本工作流程是 GUI 探索和模型構建的自動迭代操作。

我們用空狀態和空過渡集初始化 LATTE 模型。事件執行器自動執行的第一個事件是應用程序啟動,此後,應用程序將被驅動到其第一個狀態(通常與 MainActivity 相對應)。在事件執行期間,子模塊 Monitor 將通過 Robotium[4]腳本記錄 GUI 窗口小部件信息,並獲取要執行的事件列表。我們還通過 Android Debug Bridge 獲取了與儀器相關的日誌。然後,模型構造器將使用收集的信息來更新模型。為了避免探究太多狀態並獲得可接受的模型大小,我們定義了一個度量標準來度量兩個狀態的相似性。如果兩個狀態的相似度大於預定義的閾值,則將合併這兩個狀態。除了程序包,活動和基本窗口小部件信息外,還根據窗口小部件狀態和反向堆棧來衡量狀態相似性。之後,根據當前模型,將使用深度優先搜索(DFS)或廣度優先搜索(BFS)遍歷策略來選擇第一個未訪問狀態,即仍包含未訪問事件的第一個狀態。該狀態下的第一個未訪問事件(根據佈局)將是下一個要執行的事件。觸發新事件後,該應用可能會被驅動到新窗口,然後我們重複上述過程,直到遍歷所有事件。

2.3 測試生成

探索之後,可以使用構建的 LATTE 模型來生成幾種類型的測試用例,以進行進一步的測試。 對於一個應用程序,LAND 可以構建 LATTE 模型並提供五種策略來生成不同的測試用例,包括活動導向、組件導向、標籤導向、圖遍歷以及記錄與回放。

活動導向。 如果測試目標是特定活動,則 LAND 將使用相應的活動名稱來檢索 LATTE 模型中的狀態,並返回一組測試用例以達到這些狀態。 生成的測試用例以 Robotium 可運行腳本的形式出現,如圖 2 所示。

LAND:適用於 Android 應用的用戶友好且可自定義的測試生成工具

組件導向。 當需要對一種類型的組件(例如按鈕)進行全面測試時,LAND 在 LATTE 模型中檢索這些組件,並生成測試用例以達到要求。 對於特定類型的組件,例如 EditText,它接受用戶的字符串輸入,LAND 將到達這些組件,然後基於黑盒(例如邊界值分析)和具有某些用戶特定特徵的模糊測試技術生成各種字符串(例如星號)進行徹底測試。

標籤導向。 在實踐中,測試人員通常會更加註意代碼的某些特定部分,例如與他們要分析的功能相關的方法。 要將代碼信息嵌入到我們的模型中,我們引入了一個標籤集。通常,集合中的每個元素都對應一個代碼段。例如,我們可以將每個標籤設置為代表應用程序的不同方法(方法標籤)、類中的所有方法(類標籤)或帶有特定關鍵字的指令(關鍵字標籤)。標籤和代碼段的映射規則是根據實際測試或分析要求設計的。使用映射規則,我們的方法通過代碼檢測來實現標記過程。例如,關鍵字標籤 Camera 表示所有包含關鍵字“ Camera”的代碼指令,例如,代碼指令 Landroid / hardware / Camera;-> open(。

對於標籤定向測試生成,我們提取出標籤集合與目標標籤集合的交集非空的過渡集合,然後在 LATTE 模型上利用幾種圖形算法來提取狀態和過渡之間的依賴關係,最後,我們嘗試找到一些啟發式的事件序列來覆蓋這些過渡。

圖遍歷以及記錄與回放:LAND 還提供了另外兩種針對整個應用程序生成測試用例的策略:對於圖遍歷生成,LAND 將遍歷 LATTE 模型以生成可以覆蓋所有過渡的測試用例。對於記錄與回放策略,將記錄在 GUI 探索期間執行的所有操作並將其傳輸到一組測試腳本以進行回放。

2.4 用法

在本節中,我們將介紹如何使用 LAND 構造 LATTE 模型併為 Android 應用生成測試用例。 LAND 中的主要配置項目如圖 3 所示。

LAND:適用於 Android 應用的用戶友好且可自定義的測試生成工具

啟動 LAND 時,用戶首先選擇要測試的 apk。 然後 LAND 通過反編譯和檢測將其重新打包為新的 apk 文件 apk1。 使用 Robotium 實現的自動探索腳本也將打包為 apk 文件 apk2。 單擊“安裝”按鈕後,apk1 和 apk2 都將安裝在設備(或仿真器)上。 然後,用戶可以通過單擊“開始探索”來開始探索。 用戶可以使用一組可編輯的項目來配置儀器和勘探程序。 在瀏覽過程中,當前模型將轉換為點格式,並使用軟件 graphviz 可視化,該軟件將實時顯示在窗口上。

LAND:適用於 Android 應用的用戶友好且可自定義的測試生成工具

完成後,用戶可以獲得覆蓋率報告和崩潰報告。 圖 4 以不同的粒度顯示了一份覆蓋率報告,包括應用程序級別、程序包級別和類級別。 應用執行期間涵蓋的方法以綠色標記,未發現的方法以紅色標記。 它還顯示一個崩潰報告,其中包含異常的名稱和相應的腳本。 對於 LATTE 模型中的每個狀態,LAND 將記錄一個屏幕截圖,以便測試人員可以直觀地查看和理解模型。

最後,測試人員可以生成定製的測試用例以滿足他們的需求。 也可以通過單擊標籤為“ Run Testcase”的按鈕來執行這些生成的測試用例。

3. 評估

為了評估我們工具的有效性,我們收集了 20 個現實應用程序來構建 LATTE 模型併為其生成測試用例。 在這些應用程序中,有十個是從 F-droid [2]下載的開源程序,其餘的是從商業市場下載的(沒有源代碼)。 由於篇幅所限,我們僅顯示這些應用程序的摘要信息。 它們的大小從 0.14MB 到 14.86MB 不等,其功能也各不相同(例如瀏覽器,媒體和財務)。 類和方法的最大數量分別為 3752 和 25461。 我們所有的實驗都是在具有 1.82GHz CPU 和 3GB RAM 的移動智能手機上進行的。

3.1 代碼覆蓋率

AUT 的代碼覆蓋率被視為重要的測量指標,並且可以通過分析基本字節代碼信息和運行時執行的代碼信息來計算。為了評估我們方法的有效性,我們選擇了兩個流行的自動測試工具 Monkey[3]和 Dynodroid[8]以及兩個著名的基於模型的遍歷工具 A3E[6]和 PUMA[7]進行比較。

在探索期間,某些工具無法報告某些實例的測試結果。如圖 5 所示,我們給出了可以在基準測試中成功執行的應用程序的數量。 對於 Dynodroid,它無法瀏覽不受支持的應用程序或應用程序版本不一致(無法在 SDK 2.3 上執行)。 對於 PUMA 而言,一方面,某些應用程序不受支持,這導致該工具在運行時引發異常。另一方面,啟動時間太短會導致某些商業應用程序的模型錯誤並導致覆蓋率低。

LAND:適用於 Android 應用的用戶友好且可自定義的測試生成工具

LAND:適用於 Android 應用的用戶友好且可自定義的測試生成工具

圖 6 顯示了有關類和方法覆蓋結果的詳細信息。 LAND、Monkey 和 A3E 在所有 20 種應用程序中均能很好地工作,其中 A3E 在測試某些商業應用程序時可能會停在第一個窗口,因此覆蓋率較低。 在 LAND 的探索中,我們採用兩種遍歷算法 DFS 和 BFS。 結果表明,LAND 可以應用於更多應用,並且在大多數情況下可以達到更高的覆蓋率。

我們還記錄了 Monkey、Dynodroid 和 LAND 檢測到的異常數,分別為 14、5 和 22。 結果表明,與我們的基準下的其他 GUI 遍歷工具相比,更高的覆蓋率有助於 LAND 查找更多的崩潰。 我們還發現,由 LAND 生成的觸發異常的事件序列的平均長度小於 10,這意味著我們可以使用較短的事件序列來觸發異常。

3.2 目標定向測試生成

首先,我們使用組件定向測試生成來測試 EditText 組件。 通過測試,我們觀察到某些應用程序會因拋出異常而崩潰,例如,當輸入字符串太大而無法轉換為數字時,app Budget 將引發 NumberFormatException,而當輸入文本為以“ *”開頭的正則表達式時,app aGrep 將引發 PatternSyntaxException。 此外,某些應用程序顯示不友好的界面,包括空的項目名稱、混亂的字符串顯示以及字體大小設置異常導致的空白窗口。 其中一些異常顯示如圖 7 所示。

LAND:適用於 Android 應用的用戶友好且可自定義的測試生成工具

然後,我們使用標籤指導的測試生成,以使用隨機選擇的標籤測試與標籤相關的過渡。 在 LAND 和 Monkey 之間進行了實驗,以比較它們覆蓋給定目標所需的最小序列長度。 為了獲得 Monkey 的最小序列長度,我們實現了一個腳本來重複運行 Monkey,並在每次迭代中將事件限制增加 1000,直到覆蓋給定的目標為止。 結果表明,LAND 和 Monkey 均可觸發覆蓋所有標籤的所有過渡。 但是,由 LAND 生成的覆蓋所有標籤的測試用例的平均長度為 5,而 Monkey 的數量為 11000,這表明使用 LATTE 可以為用戶指定的測試生成有效而緊湊的測試用例。

4. 結論

本文介紹了一種適用於 Android 應用程序的用戶友好的測試生成工具,該工具考慮了更多 Android 特定的特徵,構建了精心設計的 LATTE 模型,並且可以針對用戶自定義的測試生成進行配置。 將來,我們將通過斷言工具支持非崩潰故障檢測,從而豐富 LATTE 模型並增強方法。

致謝

本文由南京大學軟件學院 2020 級碩士生惲葉霄翻譯轉述。 感謝國家重點研發計劃(2018YFB1003900)和國家自然科學基金(61832009,61932012)支持!


分享到:


相關文章: