BERT: 一個行為迴歸測試工具

BERT: 一個行為迴歸測試工具

引用

Jin, Wei & Orso, Alessandro & Xie, Tao. (2010). BERT: A Tool for Behavioral Regression Testing. Proceedings of the ACM SIGSOFT Symposium on the Foundations of Software Engineering. 361-362. 10.1145/1882291.1882348.

摘要

在維護期間,軟件被修改和發展以增強其功能,消除故障並使其適應已更改或新的平臺。在本次展示中,我們將介紹 BERT,該工具可幫助開發人員識別在修改代碼時可能引入的迴歸錯誤。 BERT 基於行為迴歸測試的概念:給定程序的兩個版本,BERT 通過三個步驟通過動態分析來識別兩個版本之間的行為差異。首先,它生成大量的測試輸入,這些輸入專注於代碼的更改部分。其次,它在新舊版本的代碼上運行生成的測試輸入,並識別測試行為的差異。第三,分析發現的差異並將其呈現給開發人員。通過專注於代碼的子集並利用差異行為,與傳統的迴歸測試方法相比,BERT 可以為開發人員提供更詳細的信息-這種方法完全依賴於現有的測試套件,其範圍可能受到限制並且可能無法充分測試程序中的更改。 BERT 被實現為 Eclipse(一種流行的集成開發環境)的插件,並且可以免費獲得。本次展示演示了 BERT,其基礎技術及其用法示例。

關鍵字:迴歸測試,差異測試

BERT: 一個行為迴歸測試工具

圖 1:方法的高層視圖

1 技術和工具

與傳統迴歸測試相比,圖 1 提供了我們方法的高層視圖。在傳統的迴歸測試中,為程序的舊版本(V0)定義的現有測試套件(T0)將在程序的修改版本(V1)上運行。根據他們的所說,在 V1 上失敗而在 V0 上沒有失敗的非過時測試用例將作為警告顯示給開發人員,這可能表示存在迴歸錯誤。

自動化行為迴歸測試通過在兩個主要方面改進迴歸測試來補充上述傳統方法:(1)生成一組專門針對更改後的代碼的測試輸入;(2)它明確利用了舊的和新的代碼版本。結果是這兩個版本之間存在的一系列行為差異。此信息可以為開發人員提供有關其代碼更改如何影響代碼行為的更多和更細粒度的數據。行為上的意外更改以及有關這些更改的詳細信息,可以幫助開發人員識別和消除迴歸錯誤。我們的技術的使用場景是該方法被集成到開發人員使用的 IDE 中,並在每次成功更新和編譯代碼時被激活。在這種情況下,代碼中的更改量通常會受到限制和本地化。

BERT 當前是針對 Java 語言實現的,已集成到 Eclipse 中,幷包括三個階段:生成更改代碼的測試輸入,原始代碼和更改代碼的行為比較以及差異行為分析和報告。接下來,我們將概述這些階段。有關這些階段的完整詳細信息,請參見描述此方法的論文。

階段 1:生成更改代碼的輸入。

在階段 1 的第一步中,BERT 通過利用變更分析器收集變更信息,變更分析器將所考慮程序的兩個版本 V0 和 V1 作為輸入,並生成兩個版本不同的類的列表。為此,BERT 利用了 Eclipse 的兩個功能:攔截事件以及在項目的兩個版本之間生成更改信息的能力。更準確地說,BERT 會截獲成功的編譯事件,以便能夠在每次修改,保存和編譯項目的某些部分時執行其分析。當一個這樣的事件觸發時,BERT 使用 Eclipse 通過其 API 提供的功能比較項目的先前版本和新版本。此步驟的結果是項目中已修改類的列表。然後,BERT 通過將這些類別中的每個類別饋送到測試生成器,為 V1 中更改的類別生成一組測試輸入。在該工具的當前版本中,我們使用 Randoop 和 JPF 作為測試輸入生成器。我們之所以選擇這些工具,是因為它們可以為單個類生成測試輸入,並且只需進行最小的更改即可構建測試所需的支架(例如驅動程序和存根(即模擬對象))並生成易於運行的 JUnit 測試。

階段 2:更改代碼的行為比較。

在階段 2 中,BERT 首先在其相應的類上運行階段 1 中生成的所有測試。對於每個更改的類 c 和每個 c 的測試 t,測試運行器模塊在 c 的舊版本和新版本 cv0 和 cv1 上運行 t。在由 t 執行的每次調用 m 的 c 方法之後,BERT 記錄以下信息。首先,它記錄由 t,instcv0 和 instcv1 創建和執行的 cv0 和 cv1 實例的狀態。為此,它將在 instcv0 和 instcv1 中檢索每個字段 f 的值,並將它們存儲為元組:seqid 是唯一的(按版本)id,其值在第一次調用時為 1。對於每個後續呼叫增加;msig 是 m 的簽名;name 是 f 的名稱,value 是 f 的值。如果 f 是標量,則記錄的值是 instcv0 和 instcv1 中 f 的實際值。如果 f 是對對象 o 的引用,則 BERT 遞歸記錄每個 o 字段的值,直到遇到標量字段或達到用戶定義的深度為止。其次,BERT 在兩種情況下將 m 返回的返回值存儲為元組,其中 seqid,msig 和 value 的定義與前一種情況相同。如果該方法以異常終止,則將異常的值存儲為返回值。第三,BERT 捕獲通過執行 m 產生的輸出,並將其存儲為的形式,其中 seqid 和 msig 具有通常的含義,destination 是發送輸出的實體(例如 a 文本終端,網絡端口,圖形元素),數據是發送給該實體的原始數據。最後,在調用 m 之後記錄每個值,BERT 還會在 t 引起的動態調用圖中記錄 m 和任何更改的方法之間的最短距離,該距離隨後用於對差異進行排名。為了記錄此信息,BERT 使用 Javassist 對測試和被測代碼進行檢測(http://www.csg.is.titech.ac.jp/~chiba/ javassist),它是一種用 Java 編寫的字節碼重寫庫。

​ 當 t 的執行終止並生成數據日誌時,BERT 的行為比較器將訪問 instcv0 和 instcv1 的日誌,並比較狀態、相應調用的返回值以及為該類的兩個版本收集的輸出。對於發現的每個差異,BERT 都會記錄一個事實,即存在差異,並且針對該類型的差異記錄了一組相關數據。特別得,每個記錄的更改都用一個唯一的 t 標識符標記,這可以將單個更改映射到顯示它們的測試中。對所有更改的類執行階段 1 中生成的所有測試後,結果是每個類的一組零個或多個原始行為差異。 每個行為差異都由狀態、返回值或輸出差異及其上下文信息組成。

階段 3:差異行為分析/報告。

​ 第 3 階段分析並操縱在上一個階段中產生的差異集,以對它們進行分組和排序,使得開發人員可以更好地利用 BERT 產生的信息。為了實現這一目標,BERT 的行為差異分析器首先根據它們代表迴歸錯誤的可能性對它們進行排名或過濾。然後,它提取掉原始差異中包含的某些信息,並減少已識別差異集內的冗餘。首先,BERT 根據其距離值將差異集劃分為多個類別,以使具有相同距離的差異屬於同一類別。然後,它對一個類中涉及相同實體的更改進行分組。例如,對於與狀態相關的差異,分析器將涉及同一方法和字段的所有差異歸為單個行為差異,將其與揭示每個個體差異的一組測試輸入相關聯,並分別存儲各個值差異進一步分析。

此階段的總體結果是 cv0 和 cv1 之間的一組行為差異,其中包括(1)哪些字段可以具有不同的值,(2)哪些方法可以返回不同的值,以及(3)哪些輸出可能在 cv0 中發生差異 和 cv1,以及哪些測試輸入會引起這種差異。 BERT 在 Eclipse 自定義視圖中向開發人員報告這些差異,並按與他們的距離值成反比的順序排列(即差異在排列頂部的距離更大)。BERT 還可以基於報告總數過濾掉給定距離以下的報告。這種排名和過濾背後的直覺和基本原理是,與實際變化相距較遠的行為差異比故意發生變化的行為差異更不可能是故意的,這一直覺已由我們的經驗評估結果證實。

開發人員可以使用此信息來評估哪些差異可能表明存在迴歸錯誤,以及在代碼上執行了更改後會有哪些預期的差異。如果開發人員確定了迴歸錯誤,則他們可以使用與相應行為差異相關的測試輸入來重現和調查錯誤行為,並最終消除錯誤。

2 與現有工具的關係

據我們所知,我們的行為迴歸測試方法是新穎的,並且 BERT 是第一個實現該方法的工具。大多數迴歸測試技術和工具將和 BERT 的相互補充,而非可以替代 BERT。特別得,可以將測試輸入生成和維護工具(如 Parasoft Jtest)與 BERT 集成在一起,以改善其測試生成和執行階段。同樣,可以從系統測試中生成單元測試用例的捕獲和重播工具可以與 BERT 結合使用,以擴展用於測試變更的單元測試集。

3 BERT 的好處

BERT 具有兩個關鍵方面,使其有別於傳統迴歸測試。首先,它專注於代碼的一小部分,這使它可以生成更全面的測試集。其次,它利用差異行為,消除了對開發人員需要耗費大量腦經解決問題的需求。由於這些新穎的方面,與傳統的迴歸測試方法相比,BERT 可以為開發人員提供更多(更詳細)的信息。 我們對 BERT 的評估提供了這種用途的初步證據:對於所考慮的案例,BERT 能夠識別出真正的迴歸錯誤,同時生成可以通過排名而減少的誤報。該演示演示了 BERT,並在實踐中展示了這樣的結果和好處。

致謝

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


分享到:


相關文章: