專利名稱:自動生成可再現(xiàn)運(yùn)行時問題的單元測試用例的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機(jī)程序的測試及調(diào)試領(lǐng)域,更具體地,涉及一種用于 自動生成可再現(xiàn)運(yùn)行時問題的計算機(jī)程序單元測試用例的方法和系統(tǒng)。
背景技術(shù):
軟件產(chǎn)品例如IBM的軟件產(chǎn)品的開發(fā)通常遵循這樣的過程,開發(fā)團(tuán)隊 負(fù)責(zé)產(chǎn)品開發(fā)和單元測試,產(chǎn)品其他的^i測試工作則由專門的測試團(tuán)隊 來負(fù)責(zé),B測試所發(fā)現(xiàn)的缺陷由開發(fā)團(tuán)隊來更正。單元測試是白盒測試, 主要目的是l^i代碼邏輯,而驗證測試則是黑盒測試,用來!Hit軟件功能 和表現(xiàn)。在驗證測試期間,可能會發(fā)現(xiàn)很多運(yùn)行時問題,例如非期望的異常以 及不正確的或不正常的程序行為。由于測試團(tuán)P人和開發(fā)團(tuán)隊是相互獨立的, 驗證測試環(huán)境和開發(fā)環(huán)境也不相同,驗證測試中發(fā)現(xiàn)的缺陷往往只能通過 測試者的文字描述和軟件本身記錄的日志信息反饋給開發(fā)團(tuán)隊。由于測試 環(huán)境缺乏調(diào)試工具,而缺陷描述和日志信息又無法直接調(diào)試,這樣開發(fā)團(tuán) 隊必須先根據(jù)缺陷描述重建測試環(huán)境來進(jìn)行調(diào)試。這通常是非常繁瑣和低 效的過程。并且有時非常難以再現(xiàn)運(yùn)行時問題并發(fā)現(xiàn)它們的原因。而且,當(dāng)開發(fā)團(tuán)隊修正了當(dāng)前發(fā)現(xiàn)的缺陷后或者開發(fā)了軟件新的版本 后,因為加入了新的代碼,測試團(tuán)隊仍然必須確保之前發(fā)現(xiàn)的并已《務(wù)正的 所有缺陷都仍然是被修正的,沒有受到當(dāng)前修改的影響,即進(jìn)行所謂的回 歸測試。雖然測試團(tuán)隊必須進(jìn)行回歸測試,但是如果開發(fā)團(tuán)隊已經(jīng)能夠提 前確?;貧w測試的正確性,那么測試團(tuán)隊則只要再做一次!HiE而已,無疑回歸測試的效率將會大大提高。因為開發(fā)團(tuán)隊驗證工具通常是單元測試用
例,所以就要求開發(fā)團(tuán)隊為每一個已發(fā)現(xiàn)的缺陷開發(fā)出能夠發(fā)逸其是否被 修正的單元測試用例。但是由于前一個問題的原因,調(diào)試工作已然復(fù)雜, 根據(jù)缺陷開發(fā)單元測試用例往往也是很繁瑣的過程,常常被開發(fā)團(tuán)隊所忽 略。目前的測試自動化工具,例如Rational Robot和WinRunner等,僅僅針對測試團(tuán)隊和測試過程,其出發(fā)點是替代測試者重復(fù)的測試動作。它 們致力于通過記錄和回放用戶動作,例如鍵擊和鼠標(biāo)點擊,而不是捕獲內(nèi) 部程序行為。它們生成腳本以模擬來自用戶和運(yùn)行時環(huán)境的輸入。難以確 定必須記錄多少用戶交互以便再現(xiàn)問題。并且由于回放腳本中可能包含一 些不相關(guān)的動作,再現(xiàn)問題所需要的時間可能不是最佳的。單元測試目前已在軟件開發(fā)過程中得到廣泛使用。開發(fā)者可以在將程 序提交測試團(tuán)隊進(jìn)行^^測試之前通過執(zhí)行單元測試套件(test suite)來 迅速和簡單地發(fā)現(xiàn)和消除缺陷。 一般來說,單元測試的成本遠(yuǎn)低于發(fā)江測試的成本。目前也存在幾種技術(shù)和單元測試工具,例如JTest,能夠幫助開發(fā)者生 成單元測試用例。然而,它們只是針對開發(fā)團(tuán)隊和開發(fā)過程,是根據(jù)對代 碼的靜態(tài)分析等手段而不是運(yùn)行時上下文來生成測試用例的。但是單純的 靜態(tài)分析不能確定程序執(zhí)行時各程序單元執(zhí)行的上下文,不能利用運(yùn)行時 上下文和狀態(tài)創(chuàng)建出可再現(xiàn)運(yùn)行時問題的測試用例。因此,它們都不能連 接測試過程和開發(fā)過程,來解決上述問題。因此,如果能夠根據(jù)運(yùn)行時刻的缺陷自動生成單元測試用例,以上兩 個問題將得以有效的解決 一方面開發(fā)團(tuán)隊可以直接使用該測試用例進(jìn)行 調(diào)試,省去重建測試環(huán)境的工作;另一方面開發(fā)團(tuán)隊還可以將此測試用例 加入單元測試過程,以確?;貧w測試的正確性。標(biāo)題為"用于監(jiān)^!^呈序執(zhí)行的方法和裝置"(Method And Apparatus For Monitoring The Execution Of A Program)的美國專利6,738,778 ^>開 了一種跟蹤調(diào)試工具,它可以在程序中被調(diào)用,能夠自動收集并打印程序 運(yùn)行信息(如程序當(dāng)前運(yùn)行在哪個類的哪一行)。然而,此專利只是打印用于調(diào)試的跟蹤信息,而不是生成單元測試用例。也不能主動發(fā)現(xiàn)程序運(yùn) 行中的錯誤和異常,并以此觸發(fā)生成單元測試用例的。標(biāo)題為"用子在軟件開發(fā)中集成自動軟件測試"(Method For Integrating Automated Software Testing With Software Development)的 美國專利6,067,639公開了一種需要集成在開發(fā)過程中的自動化軟件測試 方法。該方法需要軟件開發(fā)者在開發(fā)階段就同時開發(fā)一些測試操作對象 (Test Operation Object), 一個測試操作對象中實現(xiàn)對程序的某種操作 的調(diào)用。這樣在測試時,軟件測試者就可以編寫自動測試程序或腳本,通 過調(diào)用這些被測試程序中的測試操作對象來自動化測試軟件。由于這些對 象提供了統(tǒng)一的接口 (Interface),這樣測試者就不需要為不同的測試環(huán) 境開發(fā)不同的自動測試程序或腳本。然而,該專利需要軟件開發(fā)者才艮據(jù)統(tǒng) 一的接口開發(fā)測試操作對象,實際上相當(dāng)于在開發(fā)測試用例,而不是自動 生成單元測試用例。并且,它要求開發(fā)者在開發(fā)程序時就一起開發(fā)測試操 作對象。從以上所述可見,本領(lǐng)域中顯然需要一種能夠根據(jù)運(yùn)行時刻的缺陷自 動生成單元測試用例的方法和系統(tǒng)。發(fā)明內(nèi)容為解決現(xiàn)有技術(shù)中由于無法在測試環(huán)境中生成單元測試用例而導(dǎo)致的 難以在調(diào)試時再現(xiàn)運(yùn)行時問題及便利于回歸測試的上述問題并帶來其他益 處,而做出了本發(fā)明。才艮據(jù)本發(fā)明的一個方面,提供了一種用于自動生成可再現(xiàn)運(yùn)行時問題 的計算機(jī)程序單元測試用例的方法,該方法包括以下步驟根據(jù)計算;^M呈 序中所關(guān)注的一個或多個目標(biāo)程序單元和可能發(fā)生的運(yùn)行時問題修改該程 序;測試執(zhí)行該修改后的程序;以及根據(jù)在所述所關(guān)注的目標(biāo)程序單元的 執(zhí)行中出現(xiàn)的所述所關(guān)注的運(yùn)行時問題自動生成單元測試用例。才艮據(jù)本發(fā)明的另 一個方面,提供了 一種用于自動生成可再現(xiàn)運(yùn)4亍時問 題的計算機(jī)程序單元測試用例的方法,該包括以下步驟根據(jù)該計算初4呈 序的測試后生成的測試缺陷描述,確定缺陷的性質(zhì);5Ut生缺陷的程序羊元; 根據(jù)所確定的缺陷的性質(zhì);SJL生缺陷的程序單元〗務(wù)改該程序;測試執(zhí)行該下文生成單元測試用例。根據(jù)本發(fā)明的另外一個方面,提供了一種計算機(jī)程序測試方法,該方 法包括以下步驟在所述程序中加入捕獲代碼和問J^檢測代碼,其中所述 捕獲代碼被配置為用于記錄該程序中所關(guān)注的目標(biāo)程序單元的執(zhí)行路徑及 執(zhí)行上下文,而所述問題檢測代碼被配置為用于檢測并記錄該程序中所述 所關(guān)注的程序單元的執(zhí)行所可能拋出的所關(guān)注的非期望異常以及所可能產(chǎn) 生的所關(guān)注的預(yù)定行為規(guī)則的逸良;以及測試執(zhí)行經(jīng)過所述加入的該程序, 以檢測并記錄所述所關(guān)注的非期望異常以及預(yù)定行為規(guī)則的違反。根據(jù)本發(fā)明的進(jìn)一步的方面,還提供了一種用于自動生成可再現(xiàn)運(yùn)行 時問題的計算機(jī)程序單元測試用例的系統(tǒng),該系統(tǒng)包括修改模塊,用于 根據(jù)計算機(jī)程序中所關(guān)注的一個或多個目標(biāo)程序單元和可能發(fā)生的運(yùn)行時 問題修改該程序;測試執(zhí)行模塊,用于測試執(zhí)行所述被修改后的程序;以 及單元測試用例生成模塊,用于根據(jù)在所述所關(guān)注的程序單元的執(zhí)4亍中出 現(xiàn)的所述所關(guān)注的運(yùn)行時問題自動生成單元測試用例。根據(jù)本發(fā)明的再一個方面,提供了一種計算機(jī)程序測試裝置,該裝置 包括修改模塊,用于在所述程序中加入捕獲代碼和問題檢測代碼,所述 捕獲代碼被配置為用于記錄該程序中所關(guān)注的目標(biāo)程序單元的執(zhí)行路徑及 執(zhí)行上下文,而所述問題檢測代碼被配置為用于檢測并記錄該程序中所述 所關(guān)注的程序單元的執(zhí)行所可能拋出的所關(guān)注的非期望異常以及所可能產(chǎn) 生的所關(guān)注的預(yù)定行為規(guī)則的違反;以及測試執(zhí)行模塊,用于測試執(zhí)行經(jīng) 過所述加入的該程序,以檢測并記錄所關(guān)注的目標(biāo)程序單元的執(zhí)行中出現(xiàn) 的所述所關(guān)注的非期望異常以及預(yù)定行為規(guī)則的違反。根據(jù)本發(fā)明的另外一個方面,提供了一種包含計算機(jī)可讀介質(zhì)的計算 ^L^呈序產(chǎn)品,該計算機(jī)可讀介質(zhì)具有包含在其中的用于使得具有數(shù)據(jù)處理 能力的系統(tǒng)執(zhí)行根據(jù)前述方法權(quán)利要求中任何一個的方法的步驟的程序指 令。從以上所述可見,本發(fā)明的主要目是幫助開發(fā)團(tuán)隊修正缺陷以及確保 回歸測試的正確性,以此來提高軟件開發(fā)和測試的效率。同時,由子本發(fā) 明可以定義產(chǎn)生測試用例的行為規(guī)則,因此也有可能在測試過程中發(fā)現(xiàn)尚 未表現(xiàn)出的潛在的缺陷,從而幫助開發(fā)團(tuán)隊或者測試團(tuán)隊發(fā)現(xiàn)缺陷。本發(fā)明所帶來的主要益處包括可根據(jù)運(yùn)行時上下文生成單元測試用例以再現(xiàn)運(yùn)行時問題,這樣,由 于排除了不相關(guān)的操作,再現(xiàn)運(yùn)行時問題所需的執(zhí)行時間大為減少,從而 便利了對程序的調(diào)試;開發(fā)者僅需要圍繞所述單元測試用例工作,而無需創(chuàng)建B測試中的 復(fù)雜環(huán)境,從而大大節(jié)約了時間和努力;當(dāng)施加了新的代碼更新后,開發(fā)者可使用單元測試用例來簡化對舊問 題的發(fā)江;以及有助于發(fā)現(xiàn)潛在的缺陷,即有助于對程序的發(fā)汪測試。
所附權(quán)利要求中闡述了被認(rèn)為是本發(fā)明的特點的新穎特征。但是,通 過在結(jié)合附圖閱讀時參照下面對說明性實施例的詳細(xì)說明將更好地理解發(fā) 明本身以及其優(yōu)選使用模式、另外的目標(biāo)以及優(yōu)點,其中圖1示出了根據(jù)本發(fā)明的實施例用于為計算枳應(yīng)序自動生成可再現(xiàn)運(yùn) 行時問題的單元測試用例的方法的示意性流程圖;圖2示出了根據(jù)本發(fā)明的實施例的用于檢測非期望的異常的過程的示 意性流程圖;圖3示出了根據(jù)本發(fā)明的實施例的用于檢測預(yù)定行為規(guī)則的違反的過程的示意性流程圖;圖4示出了在被測試程序的執(zhí)行過程中一對象的交互過程的示意圖; 圖5示出了根據(jù)本發(fā)明的一個實施例的圖1所示方法中根據(jù)問題列表
圖;圖6示出了根據(jù)本發(fā)明的另一個實施例的用于自動生成可再現(xiàn)運(yùn)行時 問題的計算枳4呈序單元測試用例的方法的流程圖;圖7示出了根據(jù)本發(fā)明的實施例的用于自動生成可再現(xiàn)運(yùn)行時問題的 計算機(jī)程序單元測試用例的系統(tǒng)的框圖;以及圖8示出了根據(jù)本發(fā)明的進(jìn)一步的實施例的單元測試用例生成模塊的 結(jié)構(gòu)示意圖。
具體實施方式
本發(fā)明公開了 一種可自動生成可再現(xiàn)程序運(yùn)行時問題的單元測試用例 的方法和系統(tǒng)。該系統(tǒng)或方法使用加入的檢測代碼來檢測預(yù)先確定的運(yùn)行 時問題,例如非期望的異常和非正常的程序行為。同時,該系統(tǒng)或方法使 用加入的捕獲代碼來收集所確定對象的執(zhí)行上下文和其執(zhí)行路徑。當(dāng)在測 試過程中發(fā)生問題時,該系統(tǒng)或方法可生成該對象的單元測試用例。該單 元測試用例可通過以所記錄的上下文重放該對象的執(zhí)行路徑來再現(xiàn)該問 題。下面參照附圖描述本發(fā)明的實施例。然而,應(yīng)當(dāng)理解的是,本發(fā)明并 不限于所介紹的特定實施例。在附圖及以下描述中所給出的大量細(xì)節(jié)只是 為了說明之用,以便使本領(lǐng)域的技術(shù)人員能充分理解本發(fā)明的基本思想和 實現(xiàn)本發(fā)明,而不構(gòu)成對本發(fā)明的限制。圖l示出了根據(jù)本發(fā)明的實施例用于為計算枳艱序例如Java程序自動 生成可再現(xiàn)運(yùn)行時問題的單元測試用例的方法的一般步驟。在步驟101中,確定所關(guān)注的目標(biāo)程序單元和可能發(fā)生的運(yùn)行時問題。 對于面向?qū)ο蟮某绦蚶鏙ava程序來說,所述目標(biāo)程序單元為目標(biāo)類。步 驟101優(yōu)選地在開發(fā)環(huán)境中執(zhí)行。該步驟既可以在GUI工具中進(jìn)行,即用 戶通過GUI工具確定目標(biāo)類和運(yùn)行時問題,而由GUI工具根據(jù)用戶的確 定生成將提供給下一步驟的包含確定的目標(biāo)類和運(yùn)行時問題的配置信息; 也可以由用戶手工進(jìn)行,即由用戶手工編制將提供給下一步驟的包含確定
的目標(biāo)類和運(yùn)行時問題的配置信息;也可以與將在下面描述的用于修改目 標(biāo)程序的下一個步驟組合在一起,即在修改目標(biāo)程序時確定所關(guān)注的目標(biāo) 類和適衧時問題,也就是所關(guān)注的目標(biāo)類和逸衧時問題休現(xiàn)在如何以及在 何處對目標(biāo)程序進(jìn)行修改中,并且在這種情況下,該方法中可以沒有該確 定步驟101。
目標(biāo)類是需要進(jìn)行單元測試的類。目標(biāo)類的所有對象將被跟蹤以生成 單元測試用例。目標(biāo)類可通過其限定名被確定。
所述運(yùn)行時問題可以是非期望的異常或預(yù)定行為規(guī)則的違反。非期望 的異常是由對象方法拋出的未經(jīng)檢查的運(yùn)行時異常,例如Java程序中的 java.lang.NullPointerExc印tion,即程序某處試圖在一個null對象上調(diào)用 對象方法。它們往往是缺陷產(chǎn)生的原因。非期望的異??梢酝ㄟ^方法的限 定名和異常的類別來確定。預(yù)定的行為規(guī)則描述了所確定對象的正常行為, 包括正確的方法調(diào)用順序、有效的方法參數(shù)和返回值等。
在一優(yōu)選實施例中,在步驟101之前,還包括定義行為規(guī)則的步驟, 以便定義將在步驟101中確定的預(yù)定行為規(guī)則。該定義行為規(guī)則的步驟優(yōu) 選地在開發(fā)環(huán)境中執(zhí)行。 一種定義規(guī)則的方法是通過對每一條規(guī)則確定規(guī) 則模板、目標(biāo)方法以及開發(fā)檢驗代碼。規(guī)則模板是指預(yù)先定義好的一些模 式,例如"Never call <X〉 when <CONDITION>,,, "Never call <X> before <Y> of an object when 〈CONDITION〉,,等等。目標(biāo)方法即是定義模板中的 "<X>" 、 "<Y>"具體是什么類的什么方法,如確定<義>是 java.lang.String.charAt(int),這決定了檢驗代碼插入的位置。檢驗代碼即 是在目標(biāo)方法被調(diào)用的前后對方法的對象、參數(shù)、返回值等等實現(xiàn)模板中 的'^CONDITION〉,,檢驗。在本發(fā)明的一個優(yōu)選實施例中,檢驗代碼通過 繼承一個規(guī)則抽象類來實現(xiàn),如對于上述模板"Never call <X> when 〈CONDITION〉"需要繼承AbstractNeverCallXRule類,并重載其中的 matchedX方法即可針對取得的上下文進(jìn)行檢驗。規(guī)則的抽象類是模板的 一部分,通過它隱藏了模板的具體實現(xiàn),從而開發(fā)規(guī)則時可以只專注于檢 驗代碼的開發(fā)。
應(yīng)指出,通過規(guī)則模板以;sj現(xiàn)則的抽象類來定義待確定的規(guī)則的方法
只是本發(fā)明的定義和確定規(guī)則的一種實現(xiàn)方式,本發(fā)明也可采用其他定義 和確定規(guī)則的古式,例如通過直接插入規(guī)則的拾驗代碼(定義和確定規(guī)則 的步驟隱含在插入檢驗代碼的過程中)等等。
作為規(guī)則的示例,例如,Java全球化功能中可以有碼點處理(Code Point Handling)、字符串處理(String Handling)、編碼(Encoding)等 規(guī)貝'j。作為一個更具體的示例,java.Iang.Strmg.substring(mt beginlndex, int endlndex)方法用于從一個字符串中取出一段子字符串,它簡單地從一 個16位的char類型數(shù)組char[中取出由beginlndex和endlndex限定的子 char[。然而由于有一些Unicode補(bǔ)充字符是由2個16位的char表示的 (Surrogate),比如字符"WD84(MDC00"表示一補(bǔ)充漢字,此外某些文 字中的組合字符,比如字符"入",也可以使用比如'、u004Uu0300"表示(字 符A和組合字符一瞥),所以在使用Strmg.substring時,4艮有可能取出 的子串含有不完整的字符表示。于是可以定義這樣一^L則,在程序中使 用到的所有String.substring之前檢驗傳入的參數(shù)和字符串本身,如果發(fā)現(xiàn) beginlndex和endlndex正位于一個不完整的字符上,則會觸發(fā)一個規(guī)則違 例。這條規(guī)則還可以定義得更寬,規(guī)定只要字符串含有多char表示的字符, 就不食巨直接4吏用substring方法,而不論beginlndex和endlndex是否會取 得不完整字符,因為它可導(dǎo)致潛在的缺陷。
在步驟102,才艮據(jù)確定的目標(biāo)類和運(yùn)行時問題修改目標(biāo)程序,即在目 標(biāo)程序中加入捕獲代碼(圖1中的虛線框部分)和問題檢測代碼(圖2和 圖3中的虛線框部分)。優(yōu)選地,步驟102在開發(fā)環(huán)境中執(zhí)行。
在本發(fā)明的一優(yōu)選實施例中,在編譯后的Java字節(jié)碼程序中,加入所 述捕獲代碼和問Jli檢測代碼??墒褂米止?jié)碼插入工具來修改目標(biāo)程序的類 文件,以加入捕獲代碼和問題檢測代碼。但是在本發(fā)明的其他實施例中, 如下文中所述,提供了可以在源代碼中被調(diào)用的方法,來人工或通過工具 加入所述捕獲代碼和問題檢測代碼以觸發(fā)測試用例的生成。
捕獲代碼主要用于記錄目標(biāo)類對象的每一次外部方法調(diào)用以及所有方
法調(diào)用參數(shù)的值,作為目標(biāo)類對象的執(zhí)行路徑和執(zhí)行上下文。
有^艮多^"改字節(jié)碼的方法可以捕捉方法調(diào)用的^lfc和結(jié)果,不管是插
入在方法調(diào)用的地方還是方法體內(nèi)部。在JVM中,方法調(diào)用只有一個字 節(jié)碼,傳入方法的M就是在執(zhí)行方法調(diào)用的字節(jié)碼之前的JVM參數(shù)棧 中的所有對象,在該方法調(diào)用字節(jié)碼執(zhí)行完成之后,JVM參數(shù)棧會被清空 并填上返回值。因此一種簡單的獲得上下文的方法是替換此方法調(diào)用的字 節(jié)碼,使其調(diào)用另一個對象的靜態(tài)方法,此靜態(tài)方法的參數(shù)和返回值類型 和原有方法基4^目同,只是^ltE多出一個this object。第二種方法是在 此調(diào)用字節(jié)碼之前和之后插入字節(jié)碼以獲取棧中對象(參數(shù))并恢復(fù)棧。 當(dāng)然還有一種方法就是直接^^改目標(biāo)方法本身的字節(jié)碼,只需要修改一處。 使用直接修改目標(biāo)方法時,對于某些沒有辦法靜態(tài)修改的類,如JRE中的 類(String等),必須采用動態(tài)修改的方式,即在JVM栽入后進(jìn)行修改。
此外,在一個完整的單元測試用例中,除被測試的目標(biāo)類對象之外, 還存在著需要模擬的對象(mocked object)和其他無需模擬的對象,這些 是目標(biāo)類對象的方法調(diào)用中的對象M。對于Java程序來說,無需才莫擬的 對象通常是某些Java API中的類,它們可被復(fù)制??梢源_定需要被模擬的 對象,如果沒有確定被模擬的對象類,那么所有不被識別為無需模擬的對 象將會被作為需要被模擬的對象對待。捕獲代碼還將被加入在對需要模擬 的對象的方法的調(diào)用的前后,以記錄需要被模擬的對象在被測試對象的方 法中表現(xiàn)出的行為,即被調(diào)用的方法以及其返回值等數(shù)據(jù)。通過這兩部分 的記錄,可以使用已有的針對Java的模擬技術(shù)(例如JMock)來生成模 擬對象,進(jìn)而生成單元測試用例。 一段實現(xiàn)捕獲代碼的偽碼可以簡單表示 如下
〃用于記錄被測試對象的執(zhí)行路徑和上下文 class Captor一UnitTestObject { 〃該方法將被插入在目標(biāo)對象的方法調(diào)用之前
public static void beforeCall(String className, String methodName, String methodSig, Object thisObject, Object[I args) { 〃記錄執(zhí)行路徑
RuntimeContextRecorder rc = RuntimeContextLogger. getRuntimeContextRecorder(dassName, thisObject);
rc.recordContext(methodName, methodSig, thisObject, args); 〃注冊需要在此方法執(zhí)行中關(guān)注的被模擬的對象 rc.beginMockingMonitor(args);
〃該方法將被插入在目標(biāo)對象的方法調(diào)用之后 public static void afterCall(String dassName, Object thisObject) { 〃取消對,皮模擬對象的關(guān)注
RuntimeContextRecorder rc = RuntimeContextLogger. getCurrentRuntimeContextRecorder(); rc.endMockingMonitor();
〃用于記錄被模擬對象的行為 public class Captor一MockedObject { 〃該方法將被插入在目標(biāo)對象的方法調(diào)用之前
public static void beforeCaH(String className, String methodName, String methodSig, Object thisObject, Object[j args) { 〃記錄調(diào)用的參數(shù)
ObjectMocker om = RuntimeContextLogger. getCurrentRuntimeCoiitextRecorder().getMocker();
om.addRecordBeforeCall(className, methodName, methodSig, thisObject, args);
〃該方法將被插入在目標(biāo)對象的方法調(diào)用之后public static void afterCall(String className, Object thisObject, Object returnedObject, Throwable thrownObject) {
〃記錄調(diào)用的結(jié)果
ObjectMocker om = RuntimeContextLogger. getCurrentRuntimeContextRecorder().getMocker();
om.addRecordAfterCall(className, thisObject, returnedObject, thrownObject);
其中,RuntimeContextLogger是一個負(fù)責(zé)管理執(zhí)行上下文信息的類,它維 護(hù)了所有關(guān)注的對象的上下文信息。RuntimeContextRecorder是一個負(fù)責(zé) 記錄某個關(guān)注對象上下文信息的類,通過調(diào)用RuntimeContextLogger. getRuntimeContextRecorder(Class className, Object thisObject)來獲得, 其recordContext方法即可記錄當(dāng)前的上下文信息。BeginMockingMonitor (Objectargs)方法則啟動對所有args對象的上下文捕獲用來生成mock對 象,endMockingMonitor()方法結(jié)束mock對象的上下文捕獲。 ObjectMocker負(fù)責(zé)記錄捕獲的mock對象的上下文。
應(yīng)指出,上述偽碼和各類只是實現(xiàn)本發(fā)明的捕獲代碼的示例,而不構(gòu) 成對本發(fā)明的限制。本發(fā)明的捕獲代碼也可以多種其他代碼和類來實現(xiàn)。
問題檢測代碼被加入在每個需要檢測的方法的前后。如圖2所示。某 些代碼被加入在方法調(diào)用之后以檢測所關(guān)注的例如在步驟101中確定的非 期望的拋出的異常。如圖3所示,其他代碼^入在方法調(diào)用之前和之后, 以在執(zhí)行上下文例如調(diào)用順序、參數(shù)和返回值中發(fā)現(xiàn)對所關(guān)注的例如在步 驟101中確定的行為規(guī)則的違反,進(jìn)而由此來觸發(fā)單元測試用例的生成。
優(yōu)選地,問題檢測代碼用于當(dāng)發(fā)現(xiàn)問題時,將其記入一問題列表,以便在 測試執(zhí)行結(jié)束后生成測試用例。作為另一種選擇,問題檢測代碼也可用于 每當(dāng)發(fā)現(xiàn)一個問題時,即根據(jù)該問題以及捕獲代碼所記彔的執(zhí)扦路徑和執(zhí)
行上下文生成一測試用例。 一段實現(xiàn)上述substring規(guī)則的檢測代碼的偽碼 可以簡單表示如下
public class Detective一StringSubstring { 〃該方法將被插入在String.subString的方法調(diào)用之前 public static void beforeCallX(String className, String methodName, String methodSig, Object thisObject, Object]args) {
AbstractNeverCallXRule rule = DetectiveManager. loadRule("Globalization.CodePointHandlmg.StringSubString",thisObject); 〃 rule.matchedX中含有檢驗代碼 if (rule.matchedX(thisObject, args)) { DetectiveManager.addViolation(rule); DetectiveManager.generateTestCase();
}
其中,AbstractNeverCallXRule是一種規(guī)則的抽象類,用于隱藏規(guī)則的 具體實現(xiàn)。DetectiveManager用來載入各種規(guī)則類,通it^t規(guī)則類中方法 的調(diào)用來檢驗上下文,然后決定是否出發(fā)generateTestCase()。
應(yīng)指出,上述偽碼和各類只是實現(xiàn)本發(fā)明的檢測代碼的示例,而不構(gòu) 成對本發(fā)明的限制。本發(fā)明的檢測代碼也可以多種其他代碼和類來實現(xiàn)。
優(yōu)選地,將在步驟102修改的目標(biāo)程序提供給測試團(tuán)隊,以在測試環(huán) 境中進(jìn)行測試。
在步驟103中,測試執(zhí)行目標(biāo)程序。優(yōu)選地,步驟103在測試環(huán)境中 執(zhí)行。
在測試執(zhí)行過程中,在目標(biāo)類的每個方法調(diào)用之前,捕獲代碼捕獲該 調(diào)用和該調(diào)用的^lt。然后執(zhí)行原來的方法調(diào)用。在方法調(diào)用的執(zhí)行過程 中,檢測代碼試圖發(fā)現(xiàn)非期望和異常和行為規(guī)則的違反,并優(yōu)選地將其記 入問題列表。
在步驟104中,生成單元測試用例。
在目標(biāo)程序終止后,系統(tǒng)可使用所記錄的執(zhí)行路徑和執(zhí)行上下文以及 問題列表生成單元測試用例。
作為另一種選擇,也可在目標(biāo)程序執(zhí)行過程中,每當(dāng)檢測到一個所關(guān) 注的問題,就根據(jù)該問題以及所記錄的執(zhí)行路徑和執(zhí)行上下文生成一個測 試用例。
對于Java程序,可將單元測試用例形成為包含用于JUnit的測試用例 類的Java源文件。
以及執(zhí)行上下文。執(zhí)行路徑包括該對象的一系列方法調(diào)用,除了由它的其 他方法進(jìn)行的內(nèi)部方法調(diào)用。執(zhí)行上下文包括各方法調(diào)用所需的^值。
例如,名稱為testObj的對象在運(yùn)行時具有如圖4所示的交互。對象 testObj是類ClassTarget的實例。它是通過調(diào)用構(gòu)造器ClassTarget(String) 創(chuàng)建的。在程序運(yùn)行期間的某些時候,方法methodA、 methodB、 methodC 和methodD被依次調(diào)用。當(dāng)methodD被調(diào)用時發(fā)生問題。由于methodC 是由methodB內(nèi)部調(diào)用的,所以對象testObj的執(zhí)行路徑應(yīng)當(dāng)是 ClassTarget-〉methodA-〉methodB->methodD.
測試數(shù)據(jù)。原始類型(例如,int、float和char )的值和可序列化(serializable) 的對象(例如,圖4中的字符串"test")可以被復(fù)制,而其他不可序列化 (即不可被復(fù)制)的對象(例如,圖4中的obj一b)可以被模擬。只有當(dāng) 一個對象的所有字段也是可序列化的或者是原始類型的時候,該對象才是 可序列化的。復(fù)制物或模擬對象在運(yùn)行時可提供與原始的被復(fù)制物或被模 擬對象相同的行為。
當(dāng)修改后的該程序執(zhí)行時或執(zhí)行后,系統(tǒng)可生成如下的測試用例。
String si = "test"; String s2 = "aaa,"
DataObject ol = new Mock一DataObject();
ClassTarget testObj = new ClassTarget(sl); testObj.methodA(s2); testObj.methodB(o2); testOjb.methodD(); 〃發(fā)現(xiàn)問題
圖5示出了根據(jù)本發(fā)明的一個實施例的上述用于生成可再現(xiàn)運(yùn)行時問
元測試用例的步驟104中的子步驟。
如圖所示,在步驟501,遍歷問題列表中所有非期望異?;蝾A(yù)定行為 規(guī)則的違反。
在步驟502,對于所遍歷的每一項非期望異?;蝾A(yù)定行為規(guī)則的違反, 獲得所述捕獲代碼所記錄的相應(yīng)的執(zhí)行路徑和執(zhí)行上下文以及所述不可被 復(fù)制的對象在目標(biāo)類中的被調(diào)用方法、調(diào)用參數(shù)及其返回值。
在步驟503,根據(jù)所訪問的所述不可被復(fù)制的對象在目標(biāo)類中的被調(diào) 用方法、調(diào)用M及其返回值生成所述不可被復(fù)制的對象的模擬對象。優(yōu) 選地,如本領(lǐng)域的技術(shù)人員可理解的,可使用以下方法來生成模擬類。生 成被模擬對象的子類,作為模擬該對象的模擬類。該子類中的模擬方法將 覆蓋被模擬對象中的原始方法并返回與原始方法的返回值相同的值。這說 是說,該子類的實例對象具有與原始對#^目同的行為。如本域的技術(shù)人員 可理解的,還可通過上面提到的插入字節(jié)碼的方法動態(tài)實現(xiàn)模擬。
在步驟504,根據(jù)所述所有相關(guān)的執(zhí)行路徑及執(zhí)行上下文以及所生成 的模塊類生成測試數(shù)據(jù)結(jié)構(gòu)和測試目標(biāo)執(zhí)行路徑,并將它們組合成單元測 試用例,所發(fā)現(xiàn)的問題進(jìn)行調(diào)試,或者便利子在程序被修改后進(jìn)行的回歸測試。以上主要以Java面向?qū)ο蟪绦驗槔枋隽吮景l(fā)明的用于自動生成可 再現(xiàn)運(yùn)行時問題的單元測試用例的方法的實施例,應(yīng)指出的是,本發(fā)明也 適用于其他的面向?qū)ο蟪绦颉6乙驗楸景l(fā)明的核心思想并不依賴面向?qū)?象,所以本發(fā)明也適用于非面向?qū)ο蟮某绦颉1热?,在非面向?qū)ο蟮某绦?中,可以以單個函數(shù)作為進(jìn)行單元測試的程序單元。這樣,根據(jù)本發(fā)明的 捕獲代碼和問題檢測代碼將用于記錄所確定函數(shù)的執(zhí)行路徑和執(zhí)行上下 文,以及檢測在其執(zhí)行過程中所可能發(fā)生的所確定的非期望異?;蝾A(yù)定規(guī) 則的違反,并據(jù)此生成單元測試用例。單元測試用例的方法主要是根據(jù)在tiiL測試之前確定的所關(guān)注的目標(biāo)類及 運(yùn)行時問題修改目標(biāo)程序,然后通#驗證測試過程中執(zhí)行該修改后的目 標(biāo)程序來自動生成可再現(xiàn)運(yùn)行時問題的單元測試用例的。根據(jù)本發(fā)明的用 于自動生成可再現(xiàn)運(yùn)行時問題的單元測試用例的方法另一個實施例,還可 以不是在驗證測試之前確定所關(guān)注的目標(biāo)類和運(yùn)行時問題并修改程序,而 是首先進(jìn)行正常的發(fā)江測試并產(chǎn)生缺陷描述;或者可以在根據(jù)本發(fā)明的上題的單元測試用例之外,生成關(guān)于其他未確定的運(yùn)行時問題的缺陷描述。 開發(fā)者在得到所述缺陷描述后經(jīng)過簡單調(diào)試確定缺陷發(fā)生的代碼位置,然用例的異常代碼,來直接得到測試用例。這些測試用例可以被加入到自動 化的單元測試過程中,避免手工開發(fā)單元測試用例,來降低驗證新代碼變 更的代價。圖6示出了根據(jù)本發(fā)明的該另 一個實施例的用于自動生成可再現(xiàn)運(yùn)行 時問題的計算機(jī)程序單元測試用例的方法的步驟。如圖所示,在步猓601, 根據(jù)該計算機(jī)程序的驗證測試后生成的測試缺陷描述,確定缺陷的性質(zhì)及 發(fā)生缺陷的程序單元。在步驟602,在所述程序中加入捕獲代碼和問題檢 測代碼,所述捕獲代碼被配置為用于記錄該程序中的所述程序單元的執(zhí)行 路徑及執(zhí)衧上下文,而所迷問題檢測代碼4艮據(jù)所確定的缺陷的性質(zhì)被配置 為用于檢測該程序中所述程序單元的執(zhí)行中的所述缺陷。在步驟603,測 試執(zhí)行該程序。最后在步驟604,根據(jù)檢測到的所述缺陷以及所述捕獲代 碼記錄的相關(guān)的執(zhí)行路徑及上下文生成單元測試用例。根據(jù)本發(fā)明的另一個方面,還提供了一種用于對計算機(jī)程序進(jìn)行調(diào)試 的方法。優(yōu)選地,該方法包括以下步驟^使用前述用于自動生成可再現(xiàn)運(yùn)的單元測試用例;以及通過在開發(fā)環(huán)境中運(yùn)行所述單元測試用例來進(jìn)行調(diào) 試。由于所述單元測試用例是在驗證測試期間針對開發(fā)者預(yù)先確定的目標(biāo) 類和可能發(fā)生的運(yùn)行時問題自動生成的,所以在開發(fā)環(huán)境中運(yùn)行所述單元 測試用例將再現(xiàn)在測試環(huán)境中所遇到的運(yùn)行時問題,從而便利了程序的調(diào) 試和問題的解決。根據(jù)本發(fā)明的又一個方面,還提供了一種用于對計算^序進(jìn)行回歸 測試的方法。優(yōu)選地,該方法包括以下步驟使用前述用于自動生成單元 測試用例的方法生成該計算機(jī)程序的單元測試用例;以及在該計算枳4呈序 被修改后,通過在所述修改的計算機(jī)程序上運(yùn)行所述單元測試用例來對該 計算枳^呈序進(jìn)行回歸測試。使用這種方法,可以自動生成可用于回歸測試 的單元測試用例,避免了開發(fā)者進(jìn)伊緊瑣的手工開發(fā)。所自動生成的單元 測試用例既可由開發(fā)者在對程序進(jìn)行修改或升級后用于檢查舊的已被解決 的問M否依然是被解決的,也可由測試者用于進(jìn)行相同的檢查,或由開 發(fā)者和測試者雙方使用。根據(jù)本發(fā)明的再一個方面,還提供了一種計算機(jī)程序測試方法。優(yōu)選 地,該方法包括以下步驟在所述程序中加入捕獲代碼和問題檢測代碼, 其中所述捕獲代碼被配置為用于記錄該程序中所關(guān)注的目標(biāo)程序單元的執(zhí) 行路徑及執(zhí)行上下文,而所述問題檢測代碼被配置為用于檢測并記錄該程 序中所述所關(guān)注的程序單元的執(zhí)行所可能拋出的所關(guān)注的非期望異常以及 所可能產(chǎn)生的所關(guān)注的預(yù)定行為規(guī)則的違反;以及測試執(zhí)行經(jīng)過所述加入 的該程序,以檢測并記錄所述所關(guān)注的非期望異常以及預(yù)定行為規(guī)則的違 反。優(yōu)選地,該方法還包括定義規(guī)則的步驟,以便定義所述所關(guān)注的預(yù)定 行為規(guī)則。 一種定義規(guī)則的方法是通過為每一4H!l則確定規(guī)則模板、目標(biāo) 方法和開發(fā)檢驗代碼。通過這種方法,有可能在測試過程中發(fā)現(xiàn)尚a現(xiàn) 出的潛在的缺陷,以有助于程序測試。以上描述了根據(jù)本發(fā)明的實施例的用于自動生成可再現(xiàn)運(yùn)行時問題的 單元測試用例的方法、以及基于該方法的用于對計算積存呈序進(jìn)行調(diào)試的方 法、用于對計算機(jī)程序進(jìn)行回歸測試的方法、以及計算枳4呈序的測試方法。 相應(yīng)地,本發(fā)明還提供了一種用于自動生成可再現(xiàn)運(yùn)行時問題的計算機(jī)程 序單元測試用例的系統(tǒng)。圖7示出了根據(jù)本發(fā)明的實施例的用于自動生成可再現(xiàn)運(yùn)行時問題的 計算機(jī)程序單元測試用例的系統(tǒng)700的框圖。如圖所示,該系統(tǒng)700包括 修改模塊703,該修改模塊用于根據(jù)計算機(jī)程序中所關(guān)注的一個或多個目 標(biāo)程序單元和運(yùn)行時問題修改該程序;測試執(zhí)行模塊704,該測試執(zhí)行用 于測試執(zhí)行所述被修改后的程序;以及單元測試用例生成模塊705,該單 元測試用例生成模塊用于才艮據(jù)在所述所關(guān)注的程序單元的執(zhí)行中出現(xiàn)的所 述所述所關(guān)注的運(yùn)行時問題自動生成單元測試用例。優(yōu)選地,所述運(yùn)行時問題包括非期望的異常和預(yù)定行為規(guī)則的違反。優(yōu)選地,所述修改模塊703被配置為用于向該程序加入捕獲代碼,所 述捕獲代碼被配置為用于記錄該程序中所述所關(guān)注的程序單元的執(zhí)行i^f圣 和執(zhí)行上下文;以及向該程序加入問題檢測代碼,所述問題檢測代碼被配 置為用于檢測所述程序單元的執(zhí)行所可能拋出的所關(guān)注的非期望異常以及 所可能產(chǎn)生的所關(guān)注的預(yù)定行為規(guī)則的違反。優(yōu)選地,所述問題檢測代碼還被配置為用于每當(dāng)檢測到所述非期望異 ?;蝾A(yù)定行為規(guī)則的M時,就觸發(fā)所述單元測試用例生成模塊705根據(jù) 所述捕獲代碼所記錄的執(zhí)行路徑及執(zhí)行上下文生成單元測試用例。作為另一種選擇,所述問題檢測代碼還被配置為用于每當(dāng)檢測到所述
非期望異?;蝾A(yù)定行為規(guī)則的違反時,將所述非期望異常或預(yù)定行為規(guī)則的違反記入問題列表,并且所述單元測試用例生成模塊705被配置為用于 當(dāng)所迷測試執(zhí)行模塊進(jìn)行的測試執(zhí)行過程結(jié)束后,根據(jù)所述問題列表以及 所述捕獲代碼所記錄的執(zhí)行路徑及執(zhí)行上下文生成單元測試用例。優(yōu)選地,所述計算機(jī)程序為面向?qū)ο蟮某绦?,更具體地例如為Java 字節(jié)碼程序,所述程序單元為類,所述執(zhí)行路徑為所述目標(biāo)類的各實例對 象的每一次外部方法調(diào)用,并且所述執(zhí)行上下文為所述目標(biāo)類的各實例對 象的每一次外部方法調(diào)用的^lt的值。但應(yīng)指出,本發(fā)明也適用于非面向 對象的程序。比如,在非面向?qū)ο蟮某绦蛑?,可以以單個函數(shù)作為進(jìn)行單 元測試的程序單元。這樣,根據(jù)本發(fā)明的捕獲代碼和問題檢測代碼將用于 記錄確定函數(shù)的執(zhí)行路徑和執(zhí)行上下文,以及檢測在其執(zhí)行過程中所可能 發(fā)生的所確定的非期望異?;蝾A(yù)定規(guī)則的違反,并據(jù)此生成單元測試用例。優(yōu)選地,所述捕獲代碼進(jìn)一步被配置為用于記錄所述目標(biāo)類的各實例 對象的調(diào)用參數(shù)中不可被復(fù)制的對象的被調(diào)用方法、調(diào)用^t及其返回值, 并且所述單元測試用例自動生成模塊705被配置為用于根據(jù)所述捕獲代調(diào)用方法、調(diào)用參數(shù)及其返回值生成所述不可被復(fù)制的對象的模擬對象;擬對象生成單元測試用例。修改模塊703的輸入為要對其生成測試用例的目標(biāo)程序以及用戶所確 定的所關(guān)注的目標(biāo)類和運(yùn)行時問題,其輸出為經(jīng)過修改的包含所述捕獲代 碼和問題檢測代碼的目標(biāo)程序。該經(jīng)過修改的目標(biāo)程序?qū)⒈惶峁┙o測試執(zhí) 行模塊704進(jìn)行測試執(zhí)行。在本發(fā)明的一優(yōu)選實施例中,所述修改模塊703是字節(jié)碼插入工具例 如普通的字節(jié)碼插入工具,其通過〗務(wù)改目標(biāo)程序的類文件來加入所述捕獲 代碼和問題檢測代碼。但是,在本發(fā)明的其他實施例中,還提供了可以在 源代碼中被調(diào)用的方法。這樣,修改模塊703可以為用于在源代碼中加入 所述捕獲代碼和問^^測代碼的工具?;蛘?,可以人工加入所述捕獲代碼
和問題檢測代碼以觸發(fā)測試用例的生成,并JL^這種情況下,修改模塊703 可被理解為進(jìn)行人工加入時的編輯工具。在本發(fā)明的一優(yōu)選實施例中,所迷測試執(zhí)行模塊704為普通的測試系 統(tǒng)或其部分。在本發(fā)明的其他實施例中,該測試執(zhí)行模塊704為專用于本 發(fā)明的測試模塊。此外,測試執(zhí)行模塊704與所述單元測試用例生成模塊 705既可以本領(lǐng)域的技術(shù)人員可知的多種方式,例如以插件的方式或者以 包含這兩種功能的單個模塊的方式,集成在一起;也可以作為兩個在物理 上連接在一起的分立的模塊;也可以作為兩個僅僅在邏輯在連接在一起、 在物理上相互分離和獨立的模塊,并且在這種情況下兩個模塊僅僅是依靠 測試執(zhí)行模塊704所輸出的、作為單元測試用例生成模塊705的輸入的執(zhí) 行路徑和執(zhí)行上下文記錄以及運(yùn)行時問題列表形成邏輯上的連接關(guān)系。單元測試用例生成模塊705的輸入為測試執(zhí)行模塊704所輸出的執(zhí)行 路徑和執(zhí)行上下文記錄以;SJL現(xiàn)的問題,其輸出為所生成的單元測試用例。問題進(jìn)行調(diào)試,或者便利于在程序被修改后進(jìn)行的回歸測試。優(yōu)選地,所 述單元測試用例生成模塊705被配置為用于將單元測試用例形成為包含 JUnit的測試用例類的Java源文件。優(yōu)選地,該系統(tǒng)700還包括確定模塊702,該確定模塊用于確定所述 程序中所述所關(guān)注的目標(biāo)程序單元以及所述所關(guān)注的非期望異常和/或預(yù) 定行為規(guī)則的違反。確定模塊702的輸出是包含目標(biāo)類和運(yùn)行時問題的配置信息。確定模 塊702可以是一 GUI工具。該工具除了讓用戶確定關(guān)注的目標(biāo)類以及異 常之外,還會列出所有已定義的規(guī)則樹,讓用戶勾選需要應(yīng)用的規(guī)則。當(dāng) 然,GUI工具實際上只是提供了一個方便的手段來生成這些提供給第二個 步驟的配置信息,用戶完全可以手工編寫這些配置,用于只有命令行可供 使用的場合。此外,確定模塊702的功能也可以隱含在修改模塊703的操 作中,即在通過工具或手工《務(wù)改目標(biāo)程序的過程中在確定在何處修改及如 何修改目標(biāo)程序時體現(xiàn)所關(guān)注的目標(biāo)類和運(yùn)行時問題,并且在這種情況下,
該系統(tǒng)700將沒有確定模塊702。優(yōu)選地,該系統(tǒng)700還包括規(guī)則定義模塊701,該規(guī)則定義模塊用于 定義可由所迷確定模塊702確定的預(yù)定衧為規(guī)則。預(yù)定行為規(guī)則描述了所 確定程序單元在運(yùn)行中所應(yīng)當(dāng)表現(xiàn)出的行為,包括正確的方法調(diào)用順序、 有效的方法參數(shù)和返回值等。定義好的規(guī)則可被存儲在一規(guī)則庫中以便由 確定模塊702從中檢索,也可以被直接提供給確定模塊使用。可以針對每 一待測試的程序或一程序的每一次測試生成一組行為規(guī)則,也可以創(chuàng)建由 多個程序共享的行為規(guī)則庫。該規(guī)則定義模塊701優(yōu)選地被配置為用于通過以下步驟來定義規(guī)則 確定包含目標(biāo)方法和檢驗代碼的占位符的規(guī)則模板;確定目標(biāo)方法;以及 開發(fā)檢驗代碼。規(guī)則^^板是指預(yù)先定義好的一些模式,例如"Never call <X> when <CONDITION〉,,, "Never call <X> before <Y> of an object when 〈CONDITION〉"等等。目標(biāo)方法即是定義模板中的"<乂>"、 "〈Y〉,,具體是 什么類的什么方法,這決定了檢驗代碼插入的位置。檢驗代碼即是在目標(biāo) 方法被調(diào)用的前后對方法的對象、參數(shù)、返回值等等實現(xiàn)模板中的 "〈CONDITION〉,,檢驗。在本發(fā)明的一個優(yōu)選實施例中,檢驗代碼通過繼 承一個規(guī)則抽象類來實現(xiàn),如對于上述模板"Never call <X> when 〈CONDITION〉"需要繼承AbstractNeverCallXRule類,并重載其中的 matchedX方法即可針對取得的上下文進(jìn)行檢驗。規(guī)則的抽象類是模板的 一部分,通過它隱藏了模板的具體實現(xiàn),從而開發(fā)規(guī)則時可以只專注于檢 驗代碼的開發(fā)。應(yīng)指出,通過規(guī)則模板以及規(guī)則的抽象類來定義待確定的規(guī)則的方法 只是本發(fā)明的定義和確定規(guī)則的 一種實現(xiàn)方式,本發(fā)明也可采用其他定義 和確定規(guī)則的方式,例如通過直接插入規(guī)則的檢驗代碼(定義和確定規(guī)則 的步驟隱含在插入檢驗代碼的過程中)等等。優(yōu)選地,所述修改模塊703、確定模塊702、和規(guī)則定義模塊701位于 開發(fā)環(huán)境中,而所述測試執(zhí)行模塊704、和單元測試用例生成模塊705位 于測試環(huán)境中。但其他安置方式也是可能的,例如4務(wù)改模塊703、確定模
塊702、規(guī)則定義模塊701以及測試執(zhí)行模塊704、和單元測試用例生成 模塊705均位于開發(fā)環(huán)境中,或均位于測試環(huán)境中,或同時位于兩個環(huán)境 中,或位千其他環(huán)境中。圖8示出了根據(jù)本發(fā)明的進(jìn)一步的實施例的單元測試用例生成模塊 705的結(jié)構(gòu)示意圖。如圖所示,單元測試用例生成模塊705包括問題列 表訪問模塊801,用于遍歷由測試執(zhí)行模塊704所生成的問題列表中的每 一項非期望異?;蝾A(yù)定行為規(guī)則的il良;執(zhí)行路徑及上下文訪問模塊802, 用于針對所遍歷的每一項非期望異?;蝾A(yù)定行為規(guī)則的違反,訪問所述捕在目標(biāo)類中的被調(diào)用方法、調(diào)用*及其返回值;模擬對象構(gòu)造模塊803, 用于才艮據(jù)所訪問的所述不可被復(fù)制的對象在目標(biāo)類中的被調(diào)用方法、調(diào)用 Wt及其返回值生成調(diào)用參數(shù)中的不可被復(fù)制的對象的模擬對象;以及單 元測試用例構(gòu)造模塊804,用于根據(jù)所訪問的執(zhí)行i^f圣及執(zhí)行上下文以及所生成的模擬對象構(gòu)造單元測試用例。以上描述的本發(fā)明的實施例的用于自動生成可再現(xiàn)運(yùn)行時問題的單元測試用例的系統(tǒng)700主要用于這樣的場景,即根據(jù)在發(fā)汪測試之前確定的 所關(guān)注的目標(biāo)類及運(yùn)行時問題,修改目標(biāo)程序,然后通it^驗證測試過程中然而,根據(jù)本發(fā)明的實施例的該用于自動生成可再現(xiàn)運(yùn)行時問題的單元測 試用例的系統(tǒng)700還可以用于這樣的場景,即不是在!Hi測試之前確定所 關(guān)注的目標(biāo)類和運(yùn)行時問題并修改程序,而是首先進(jìn)行正常的驗證測試并 產(chǎn)生缺陷描述;或者可以在上述在發(fā)汪測試之前確定所關(guān)注的目標(biāo)類及運(yùn) 行時問題的場景中,在測試執(zhí)行步驟中除自動生成可再現(xiàn)所確定的運(yùn)行時 問題的單元測試用例之外,還生成關(guān)于其他未確定的運(yùn)行時問題的缺陷描 述。在這樣的場景中,開發(fā)者在得到所述缺陷描述后經(jīng)過簡單調(diào)試確定缺 陷發(fā)生的代碼位置,然后通過自定義新的規(guī)則或者是直接在代碼中插入能 夠觸發(fā)本發(fā)明生成測試用例的異常代碼,來直接得到測試用例。這些測試 用例可以被加入到自動化的單元測試過程中,避免手工開發(fā)單元測試用例,
來降低驗證新代碼變更的代價。當(dāng)根據(jù)本發(fā)明的實施例的用于自動生成可再現(xiàn)運(yùn)行時問題的計算機(jī)程序單元測試用例的系統(tǒng)用于這樣的場景時,所述規(guī)則模塊701所定義的、 和所述確定模塊702所確定的規(guī)則是4驗證測試后生成的測試缺陷描述 中得出的,所述確定模塊702所確定的所關(guān)注的異常和目標(biāo)類也是從測試 缺陷描述中得出的。然后,在經(jīng)修改模塊703根據(jù)所述得出的目標(biāo)類以及 異常和/或規(guī)則<務(wù)改了目標(biāo)程序之后,優(yōu)選地在開發(fā)環(huán)境中的測試執(zhí)行模塊 704中進(jìn)行測試運(yùn)行,并由單元測試用例生成模塊705根據(jù)在測試執(zhí)行中 所生成的執(zhí)行路徑和執(zhí)行上下文以及運(yùn)行時問題生成單元測試用例。該單 元測試用例將主要用于未來對該目標(biāo)程序進(jìn)行的回歸測試。根據(jù)本發(fā)明的另一個方面,還提供了一種用于對計算機(jī)程序進(jìn)行調(diào)試 的系統(tǒng)。優(yōu)選地,該系統(tǒng)包括前述任何一種用于自動生成可再現(xiàn)運(yùn)行時 問題的單元測試用例的系統(tǒng)700;以及調(diào)試裝置,用于通過運(yùn)行所述用于 自動生成可再現(xiàn)運(yùn)行時問題的計算機(jī)程序單元測試用例的系統(tǒng)700所生成 的單元測試用例來對計算機(jī)程序進(jìn)行調(diào)試。由于所述單元測試用例是在驗 證測試期間針對開發(fā)者預(yù)先確定的目標(biāo)類和可能發(fā)生的運(yùn)行時問題自動生 成的,所以在開發(fā)環(huán)境中運(yùn)行所述單元測試用例將再現(xiàn)在測試環(huán)境中所遇 到的運(yùn)行時問題,從而便利了程序的調(diào)試和問題的解決。根據(jù)本發(fā)明的又一個方面,還提供了一種用于對計算枳艱序進(jìn)行回歸 測試的系統(tǒng)。優(yōu)選地,該系統(tǒng)包括前述任何一種用于自動生成可再現(xiàn)運(yùn) 行時問題的單元測試用例的系統(tǒng)700;以及回歸測試裝置,用于在該計算 機(jī)程序被修改后,通過在所述修改的計算機(jī)程序上運(yùn)行所述用于自動生成 可再現(xiàn)運(yùn)行時問題的計算機(jī)程序單元測試用例的系統(tǒng)700在該計算枳4呈序 被修改之前所生成的單元測試用例來對該計算機(jī)程序進(jìn)行回歸測試。使用 這種方法,可以自動生成可用于回歸測試的單元測試用例,避免了開發(fā)者 進(jìn)行繁瑣的手工開發(fā)。所自動生成的單元測試用例既可由開發(fā)者在對程序 進(jìn)行修改或升級后用于檢查舊的已被解決的問IIA否依然是被解決的,也 可由測試者用于進(jìn)行相同的檢查,或由開發(fā)者和測試者雙方使用。
根據(jù)本發(fā)明的另外一個方面,還提供了一種計算M序測試裝置。優(yōu)選地,該裝置包括修改模塊,用于在所述程序中加入捕獲代碼和問題檢 測代碼,所述捕獲代碼被配置為用于記錄該程序中所關(guān)注的目標(biāo)程序單元 的執(zhí)行路徑及執(zhí)行上下文,而所述問題檢測代碼被配置為用于檢測并記錄 該程序中所述所關(guān)注的程序單元的執(zhí)行所可能拋出的所關(guān)注的非期望異常 以及所可能產(chǎn)生的所關(guān)注的預(yù)定行為規(guī)則的違反;以及測試執(zhí)行模塊,用 于測試執(zhí)行經(jīng)過所述加入的該程序,以檢測并記彔所關(guān)注的目標(biāo)程序單元 的執(zhí)行中出現(xiàn)的所述所關(guān)注的非期望異常以及預(yù)定行為規(guī)則的違反。優(yōu)選 地,該裝置還包括規(guī)則定義模塊,用于定義所述所關(guān)注的預(yù)定行為規(guī)則。 優(yōu)選地,該規(guī)則定義模塊被配置為用于通過為每一^L則確定規(guī)則模板、 目標(biāo)方法以及開發(fā)檢驗代碼來定義規(guī)則。使用這種計算機(jī)程序測試裝置, 有可能發(fā)現(xiàn)尚未表現(xiàn)出的潛在的缺陷,以有助于程序測試。以上參照附圖描述了根據(jù)本發(fā)明的實施例的用于自動生成可再現(xiàn)運(yùn) 行時問題的測試用例的方法和系統(tǒng),用于對計算機(jī)程序進(jìn)行調(diào)試的方法和 系統(tǒng),用于對計算機(jī)程序進(jìn)行回歸測試的方法和系統(tǒng),以及計算M序的 測試方法和系統(tǒng)。應(yīng)理解,附圖僅作說明之用,而不構(gòu)成對本發(fā)明的限制。附圖可以但 不一定示出本發(fā)明的某單個實施例,而可以示出多個實施例的組合。此夕卜, 可以考慮用上文中所述的特征和元素的任意組合來實施和實踐本發(fā)明,而 無論它們是否涉及不同的實施例。相關(guān)領(lǐng)域內(nèi)的技術(shù)人員可認(rèn)識到,可實 現(xiàn)本發(fā)明而沒有特定實施例的一個或多個特定特征或優(yōu)點。在另外的情況 下,可在一些實施例內(nèi)實現(xiàn)另外的特征和優(yōu)點,而它們可能不存在于本發(fā) 明的任何實施例內(nèi)。涉及特征和優(yōu)點的語言應(yīng)被理解為意指與實施例相聯(lián) 系地描述的特定特征、優(yōu)點和特性被包含在本發(fā)明的至少一個實施例內(nèi)。 因此,此整個說明書內(nèi)的對特征和優(yōu)點的討論以及類似語言可以但不必須 指的是相同實施例。另外,在各實施例中,本發(fā)明提供了優(yōu)于現(xiàn)有技術(shù)的大量優(yōu)點。然而, 盡管本發(fā)明的實施例可獲得優(yōu)于其他可能的解決方案和/或優(yōu)于現(xiàn)有技術(shù)
的優(yōu)點,某一具體優(yōu)點是否由給定的實施例獲得并不構(gòu)成對本發(fā)明的限定。 因此,下面的方面、特征、實施例和優(yōu)點僅作說明之用而不應(yīng)被看作是所 附權(quán)利要求的要素或限定,除非權(quán)利要求中明確提出。類似地,談到"本 發(fā)明"不應(yīng)被解釋為對此處所披露的任何發(fā)明主題的概括,也不應(yīng)被看作 是所附權(quán)利要求的要素或限定,除非權(quán)利要求中明確提出。本發(fā)明的這些特征和優(yōu)點可從以上說明以及所附權(quán)利要求內(nèi)完全清楚 地看到,或者可通過如上文所述地實踐本發(fā)明來了解。此說明書內(nèi)所述的許多功能單元已被標(biāo)記為模塊,以便更特別地強(qiáng)調(diào)它們的實現(xiàn)獨立性。例如,模塊可實現(xiàn)為包括定制VLSI電路或門陣列、 現(xiàn)成的半導(dǎo)體例如邏輯芯片、晶體管或其它離散元件的硬件電路。模塊也 可實現(xiàn)為可編程硬件設(shè)備例如現(xiàn)場可編程門陣列、可編程陣列邏輯、可編 程邏輯設(shè)備等。模塊還可實現(xiàn)為可被各種處理器執(zhí)行的軟件??蓤?zhí)行代碼的被標(biāo)識的 模塊可包括例如可被組織成對象、過程或函數(shù)的計算機(jī)指令的一個或多個 物理或邏輯塊。但是,被標(biāo)識的模塊的可執(zhí)行代碼不必在物理上位于一起, 而是可包括存儲在不同位置的不同指令,這些不同指令當(dāng)在邏輯上連接在 一起時構(gòu)成該模塊并實現(xiàn)模塊的規(guī)定目的。實際上,可執(zhí)行代碼的模塊可以是單個指令或許多指令,甚至可分布 在一些不同的代碼段上、不同程序中以及幾個存儲設(shè)備上。類似地,操作 數(shù)據(jù)在這里可在模塊內(nèi)被標(biāo)識和說明,并且可體現(xiàn)為任何合適的形式且組 織成任何合適類型的數(shù)據(jù)結(jié)構(gòu)。操作數(shù)據(jù)可被聚集成單個數(shù)據(jù)集,或者可 分布在不同位置上包括在不同存儲設(shè)備上,并且可至少部分地僅僅作為系 統(tǒng)或網(wǎng)絡(luò)上的電子信號存在。此外,在上面的說明內(nèi),提供了許多特定細(xì)節(jié)例如編程、方法步驟、 用戶選擇、系統(tǒng)模塊等的示例,以便提供對本發(fā)明的實施例的透徹理解。 但是,本領(lǐng)域內(nèi)的技術(shù)人員可認(rèn)識到本發(fā)明可實現(xiàn)為不具有一個或多個所 述特定細(xì)節(jié),或者可實現(xiàn)為具有其它步驟、部件。在另外的實施例內(nèi),沒 有詳細(xì)示出或說明公知的部件或操作以避免掩蓋本發(fā)明的方面。
另外,上文中任何具體的模塊、裝置、系統(tǒng)、方法、步驟的命名僅是 為了方《更而^f吏用的,故而不構(gòu)成對本發(fā)明的限制。一般地給出上文的示例性流程圖,作為邏輯流程圖。因而,所示的順 序和標(biāo)記的操作指示所給出的方法的實施例??稍O(shè)想在功能、邏輯或效果 上與所示方法的一個或多個操作或其部分等效的其它的操作和方法。另外, 特定方法發(fā)生的順序可能或可能不嚴(yán)格遵循所示的對應(yīng)操作的順序。某些 步驟可以合并在一起,或進(jìn)一步劃分了更細(xì)的步驟,或添加一些新步驟, 或去除一些步驟。類似地,所描述的系統(tǒng)和裝置的模塊之間的連接關(guān)系可以改變,它們 可以合并成更大的模塊,或被進(jìn)一步地劃分為更小的模塊,也可以添加某 些新的模塊,或去除某些模塊,只要它們能夠?qū)崿F(xiàn)根據(jù)本發(fā)明的功能,這 些改變都處于本發(fā)明的精神和范圍之內(nèi)。本發(fā)明可以硬件、軟件、或硬件與軟件的結(jié)合的方式實現(xiàn)。本發(fā)明可 以集中的方式在一個計算機(jī)系統(tǒng)中實現(xiàn),或以分布方式實現(xiàn),在這種分布 方式中,不同的部件分布在若干互連的計算機(jī)系統(tǒng)中。適于執(zhí)行本文中描 述的各方法的任何計算機(jī)系統(tǒng)或其它裝置都是合適的。 一種典型的硬件和軟件的組合可以是帶有計算;fc^呈序的通用計算機(jī)系統(tǒng),當(dāng)該計算;bi4呈序被 加栽和執(zhí)行時,控制該計算機(jī)系統(tǒng)而使其執(zhí)行本文中描述的方式。本發(fā)明也可體現(xiàn)在與計算機(jī)系統(tǒng)一起使用的程序產(chǎn)品中。該程序產(chǎn)品 包含使能實現(xiàn)本文中描述的方法的所有特征,并且當(dāng)其#栽到計算機(jī)系 統(tǒng)中時,能夠執(zhí)行這些方法。該程序產(chǎn)品可被包含在多種信號承載介質(zhì)中。 典型的信號承載介質(zhì)包括但不限于(i)永久存儲在不可寫存儲介質(zhì)(例 如計算機(jī)中的只讀存儲器裝置,例如可由CD-ROM驅(qū)動器讀取的 CD-ROM盤)上的信息;(ii)存儲在可寫存儲介質(zhì)(例如軟盤驅(qū)動器中 的軟盤或磁盤驅(qū)動器)上的可更改的信息;以及(iii)通過例如包括無線 通信在內(nèi)的計算機(jī)或電話網(wǎng)絡(luò)等通信介質(zhì)傳送給計算機(jī)的信息。當(dāng)這種信 號承栽介質(zhì)攜帶指導(dǎo)本發(fā)明功能的、計算機(jī)可讀的指令時,其代M發(fā)明 的實施例。
盡管已參照優(yōu)選實施例具體示出和說明了本發(fā)明,但是本領(lǐng)域內(nèi)的那 些技術(shù)人員應(yīng)理解,可在形式和細(xì)節(jié)上對其進(jìn)行各種改變而不會背離本發(fā) 明的精神和范圍,本發(fā)明的范圍由所附權(quán)利要求限定。
權(quán)利要求
1.一種用于自動生成可再現(xiàn)運(yùn)行時問題的計算機(jī)程序單元測試用例的方法,包括以下步驟根據(jù)計算機(jī)程序中所關(guān)注的一個或多個目標(biāo)程序單元和可能發(fā)生的運(yùn)行時問題修改該程序;測試執(zhí)行該修改后的程序;以及根據(jù)在所述所關(guān)注的目標(biāo)程序單元的執(zhí)行中出現(xiàn)的所述所關(guān)注的運(yùn)行時問題自動生成單元測試用例。
2. 根據(jù)權(quán)利要求1的方法,其中所述運(yùn)行時問題包括非期望 的異常和預(yù)定行為規(guī)則的違反。
3. 根據(jù)權(quán)利要求2的方法,還包括確定所迷程序中所迷所關(guān) 注的目標(biāo)程序單元以及所述所關(guān)注的非期望異常和/或預(yù)定行為規(guī) 則的違反的步驟。
4. 根據(jù)權(quán)利要求3的方法,還包括定義行為規(guī)則的步驟。
5. 根據(jù)權(quán)利要求4的方法,其中所迷定義行為規(guī)則的步驟包括確定包含目標(biāo)方法和檢驗代碼的占位符的規(guī)則模板;確定目標(biāo)方法;以及開發(fā)檢驗代碼。
6. 根據(jù)權(quán)利要求1 - 5中任何一個的方法,其中所述修改步 驟包括在所述程序中加入捕獲代碼,所述捕獲代碼被配置為用于記 錄該程序中所述所關(guān)注的目標(biāo)程序單元的執(zhí)行路徑及執(zhí)行上下 文;以及在該程序中加入問題檢測代碼,所述問題檢測代碼被配置為 用于檢測該程序中所述所關(guān)注的目標(biāo)程序單元的的執(zhí)行所可能拋 出的所述所關(guān)注的非期望異常以及所可能產(chǎn)生的所述所關(guān)注的預(yù) 定行為規(guī)則的違反。
7. 根據(jù)權(quán)利要求6的方法,其中所述計算機(jī)程序為面向?qū)ο?的程序,所述程序單元為類,所述執(zhí)行路徑為所述目標(biāo)類的各實 例對象的每一次外部方法調(diào)用的序列,并且所述執(zhí)行上下文為所 述目標(biāo)類的各實例對象的每一次外部方法調(diào)用的參數(shù)的值和返回 值。
8. 根據(jù)權(quán)利要求7的方法,其中所述捕獲代碼進(jìn)一步被配置 為用于記錄所述目標(biāo)類的各實例對象的調(diào)用參數(shù)中不可被復(fù)制的 對象在目標(biāo)類中的被調(diào)用方法、調(diào)用參數(shù)及其返回值,并且所述 自動生成單元測試用例的步驟包括根據(jù)所述捕獲代碼所記錄的所述目標(biāo)類的各實例對象的調(diào)用 參數(shù)中不可被復(fù)制的對象在目標(biāo)類中的被調(diào)用方法、調(diào)用參數(shù)及 其返回值生成所述不可被復(fù)制的對象的模擬對象;以及根據(jù)所述捕獲代碼所記錄的相關(guān)的執(zhí)行路徑及執(zhí)行上下文以 及所述生成的模擬對象生成單元測試用例。
9. 根據(jù)權(quán)利要求7的方法,其中,所述問題檢測代碼還被配 置為用于每當(dāng)檢測到所述所關(guān)注的非期望異?;蝾A(yù)定行為規(guī)則的 違反時,就觸發(fā)所述自動生成單元測試用例的步驟根據(jù)所述捕獲 代碼所記錄的相關(guān)的執(zhí)行路徑及執(zhí)行上下文生成單元測試用例。
10. 根據(jù)權(quán)利要求7的方法,其中,所述問題檢測代碼還被配 置為用于每當(dāng)檢測到所述非期望異?;蝾A(yù)定行為規(guī)則的違反時, 將所述所關(guān)注的非期望異?;蝾A(yù)定行為規(guī)則的違反記入問題列 表,并且所述自動生成單元測試用例的步驟包括當(dāng)所述測試執(zhí)行 過程結(jié)束后,根據(jù)所述問題列表以及所述捕獲代碼所記錄的相關(guān) 的執(zhí)行路徑及執(zhí)行上下文生成單元測試用例。
11. 根據(jù)權(quán)利要求9或10的方法,其中所述生成的單元測試 用例包括所述目標(biāo)類的實例對象從被構(gòu)造到被檢測到所述非期望 異?;蝾A(yù)定行為規(guī)則的違反為止的外部方法調(diào)用的序列,以及每一次外部方法調(diào)用的參數(shù)的值。
12. 根據(jù)權(quán)利要求10的方法,其中所述捕獲代碼進(jìn)一步被配 置為用于記錄所述目標(biāo)類的各實例對象的調(diào)用參數(shù)中不可被復(fù)制 的對象在目標(biāo)類中的被調(diào)用方法、調(diào)用參數(shù)及其返回值,并且其 中所述根據(jù)所述問題列表以及所述捕獲代碼所記錄的相關(guān)的執(zhí)行遍歷所述問題列表中的每一項非期望異常或預(yù)定行為規(guī)則的違反;針對所遍歷的每一項非期望異?;蝾A(yù)定行為規(guī)則的違反,訪 問所述捕獲代碼所記錄的相應(yīng)的執(zhí)行路徑和執(zhí)行上下文以及所述 不可被復(fù)制的對象在目標(biāo)類中的被調(diào)用方法、調(diào)用參數(shù)及其返回 值;根據(jù)所訪問的所述不可被復(fù)制的對象在目標(biāo)類中的被調(diào)用方 法、調(diào)用參數(shù)及其返回值生成所述不可被復(fù)制的對象的模擬對象; 以及根據(jù)所訪問的相應(yīng)的執(zhí)行路徑和執(zhí)行上下文以及所生成的模 擬對象構(gòu)造單元測試用例。
13. —種用于自動生成可再現(xiàn)運(yùn)行時問題的計算機(jī)程序單元 測試用例的方法,包括以下步驟根據(jù)該計算機(jī)程序的測試后生成的測試缺陷描述,確定缺陷 的性質(zhì)及發(fā)生缺陷的程序單元;根據(jù)所確定的缺陷的性質(zhì)及發(fā)生缺陷的程序單元修改該程序;測試執(zhí)行該程序;以及根據(jù)檢測到的所述缺陷以及所述捕獲代碼記錄的相關(guān)的執(zhí)行 路徑及上下文生成單元測試用例。
14. 根據(jù)權(quán)利要求13的方法,其中所述修改步驟包括 在該程序中加入捕獲代碼,所述捕獲代碼被配置為用于記錄 該程序中的所述程序單元的執(zhí)行路徑及執(zhí)行上下文;以及在該程序中加入問題檢測代碼,所述問題檢測代碼根據(jù)所確 定的缺陷的性質(zhì)被配置為用于檢測該程序中所述程序單元的執(zhí)行 中的所述缺陷。
15. —種計算機(jī)程序測試方法,包括以下步驟 在所述程序中加入捕獲代碼和問題檢測代碼,其中所述捕獲代碼被配置為用于記錄該程序中所關(guān)注的目標(biāo)程序單元的執(zhí)行路 徑及執(zhí)行上下文,而所述問題檢測代碼被配置為用于檢測并記錄 該程序中所述所關(guān)注的程序單元的執(zhí)行所可能拋出的所關(guān)注的非 期望異常以及所可能產(chǎn)生的所關(guān)注的預(yù)定行為規(guī)則的違反;以及 測試執(zhí)行經(jīng)過所述加入的該程序,以檢測并記錄所述所關(guān)注 的非期望異常以及預(yù)定行為規(guī)則的違反。
16. 根據(jù)權(quán)利要求15的方法,還包括定義所述預(yù)定行為規(guī)則 的步驟。
17. —種用于自動生成可再現(xiàn)運(yùn)行時問題的計算機(jī)程序單元 測試用例的系統(tǒng),包括修改模塊,用于根據(jù)計算機(jī)程序中所關(guān)注的一個或多個目標(biāo)程序單元和可能發(fā)生的運(yùn)行時問題修改該程序;測試執(zhí)行模塊,用于測試執(zhí)行所述被修改后的程序;以及 單元測試用例生成模塊,用于根據(jù)在所述所關(guān)注的程序單元的執(zhí)行中出現(xiàn)的所述所關(guān)注的運(yùn)行時問題自動生成單元測試用例。
18. 根據(jù)權(quán)利要求17的系統(tǒng),其中所述運(yùn)行時問題包括非期 望的異常和預(yù)定行為規(guī)則的違反。
19. 根據(jù)權(quán)利要求18的系統(tǒng),還包括確定模塊,用于確定所 述程序中所述所關(guān)注的目標(biāo)程序單元以及所述所關(guān)注的非期望異 常和/或預(yù)定行為規(guī)則的違反。
20. 根據(jù)權(quán)利要求19的系統(tǒng),還包括規(guī)則定義模塊,用于定 義可由所迷確定模塊確定的規(guī)則。
21. 根據(jù)權(quán)利要求20的系統(tǒng),其中所述規(guī)則定義模塊被配置 為用于通過以下步驟來定義規(guī)則確定包含目標(biāo)方法和檢驗代碼的占位符的規(guī)則模板;確定目標(biāo)方法;以及開發(fā)檢驗代碼。
22. 根據(jù)權(quán)利要求17-20中任何一個的系統(tǒng),其中所述修改 模塊被配置為用于在該程序中加入捕獲代碼,所述捕獲代碼被配置為用于記錄 該程序中所述所關(guān)注的程序單元的執(zhí)行路徑和執(zhí)行上下文;以及在該程序中加入問題檢測代碼,所述問題檢測代碼被配置為 用于檢測所述程序單元的執(zhí)行所可能拋出的所關(guān)注的非期望異常 以及所可能產(chǎn)生的所關(guān)注的預(yù)定行為規(guī)則的違反。
23. 根據(jù)權(quán)利要求22的系統(tǒng),其中所述計算機(jī)程序為面向?qū)?象的程序,所述程序單元為類,所述執(zhí)行路徑為所述目標(biāo)類的各 實例對象的每一次外部方法調(diào)用的序列,并且所述執(zhí)行上下文為 所述目標(biāo)類的各實例對象的每一次外部方法調(diào)用的參數(shù)的值和返 回值。
24. 根據(jù)權(quán)利要求23的系統(tǒng),其中所述捕獲代碼進(jìn)一步被配 置為用于記錄所述目標(biāo)類的各實例對象的調(diào)用參數(shù)中不可被復(fù)制 的對象在目標(biāo)類中的被調(diào)用方法、調(diào)用參數(shù)及其返回值,并且所 述單元測試用例自動生成模塊被配置為用于根據(jù)所述捕獲代碼所記錄的所述目標(biāo)類的各實例對象的調(diào)用 參數(shù)中不可被復(fù)制的對象在目標(biāo)類中的被調(diào)用方法、調(diào)用參數(shù)及 其返回值生成所述不可被復(fù)制的對象的模擬對象;以及根據(jù)所述捕獲代碼所記錄的相關(guān)的執(zhí)行路徑及執(zhí)行上下文以 及所述生成的模擬對象生成單元測試用例。
25. 根據(jù)權(quán)利要求23的系統(tǒng),其中,所述問題檢測代碼還被 配置為用于每當(dāng)檢測到所述非期望異常或預(yù)定行為規(guī)則的違反 時,就觸發(fā)所述單元測試用例生成模塊根據(jù)所述捕獲代碼所記錄 的相關(guān)的執(zhí)行路徑及執(zhí)行上下文生成單元測試用例。
26. 根據(jù)權(quán)利要求23的系統(tǒng),其中,所述問題檢測代碼還被 配置為用于每當(dāng)檢測到所述非期望異常或預(yù)定行為規(guī)則的違反 時,將所述非期望異?;蝾A(yù)定行為規(guī)則的違反記入問題列表,并 且所述單元測試用例生成模塊被配置為用于當(dāng)所述測試執(zhí)行模塊 進(jìn)行的測試執(zhí)行過程結(jié)束后,根據(jù)所述問題列表以及所述捕獲代 碼所記錄的相關(guān)的執(zhí)行路徑及執(zhí)行上下文生成單元測試用例。
27. 根據(jù)權(quán)利要求25或26的系統(tǒng),其中所述生成的單元測試 用例包括目標(biāo)類的實例對象從被構(gòu)造到被檢測到所述非期望異常 或預(yù)定行為規(guī)則的違反為止的外部方法調(diào)用的序列,以及每一次 外部方法調(diào)用的參數(shù)的值。
28. 根據(jù)權(quán)利要求26的系統(tǒng),其中所述捕獲代碼進(jìn)一步被配 置為用于記錄所述目標(biāo)類的各實例對象的調(diào)用參數(shù)中不可被復(fù)制 的對象在目標(biāo)類中的被調(diào)用方法、調(diào)用參數(shù)及其返回值,并且其 中所述單元測試用例生成模塊還包括問題列表訪問模塊,用于遍歷所述問題列表中的每一項非期 望異?;蝾A(yù)定行為規(guī)則的違反;執(zhí)行路徑及上下文訪問模塊,用于針對所遍歷的每一項非期 望異?;蝾A(yù)定行為規(guī)則的違反,訪問所述捕獲代碼所記錄的相應(yīng)的被調(diào)用方法、調(diào)用參數(shù)及其返回值;模擬對象構(gòu)造模塊,用于根據(jù)所訪問的所述不可被復(fù)制的對 象在目標(biāo)類中的被調(diào)用方法、調(diào)用參數(shù)及其返回值生成所述不可 被復(fù)制的對象的模擬對象;以及單元測試用例構(gòu)造模塊,用于根據(jù)所訪問的相應(yīng)的執(zhí)行路徑 和執(zhí)行上下文以及所生成的模擬對象構(gòu)造單元測試用例。
29. —種計算機(jī)程序測試裝置,包括修改模塊,用于在所述程序中加入捕獲代碼和問題檢測代碼, 所述捕獲代碼被配置為用于記錄該程序中所關(guān)注的目標(biāo)程序單元 的執(zhí)行路徑及執(zhí)行上下文,而所述問題檢測代碼被配置為用于檢 測并記錄該程序中所述所關(guān)注的程序單元的執(zhí)行所可能拋出的所 關(guān)注的非期望異常以及所可能產(chǎn)生的所關(guān)注的預(yù)定行為規(guī)則的違 反;以及測試執(zhí)行模塊,用于測試執(zhí)行經(jīng)過所述加入的該程序,以檢 測并記錄所關(guān)注的目標(biāo)程序單元的執(zhí)行中出現(xiàn)的所述所關(guān)注的非 期望異常以及預(yù)定行為規(guī)則的違反。
30. 根據(jù)權(quán)利要求29的裝置,還包括用于定義所述預(yù)定行為 規(guī)則的規(guī)則定義模板。
31. —種包含計算機(jī)可讀介質(zhì)的計算機(jī)程序產(chǎn)品,該計算機(jī)可 讀介質(zhì)具有包含在其中的用于使得具有數(shù)據(jù)處理能力的系統(tǒng)執(zhí)行 根據(jù)前述方法權(quán)利要求中任何一個的方法的步驟的程序指令。
全文摘要
本發(fā)明公開了一種用于自動生成可再現(xiàn)運(yùn)行時問題的計算機(jī)程序單元測試用例的方法和系統(tǒng)。該方法包括根據(jù)計算機(jī)程序中所關(guān)注的一個或多個目標(biāo)程序單元和可能發(fā)生的運(yùn)行時問題修改該程序;測試執(zhí)行該修改后的程序;以及根據(jù)在所關(guān)注的目標(biāo)程序單元的執(zhí)行中出現(xiàn)的所關(guān)注的運(yùn)行時問題自動生成單元測試用例。其中所述修改步驟在程序中加入捕獲代碼和問題檢測代碼,捕獲代碼被配置為用于記錄該程序中所關(guān)注的目標(biāo)程序單元的執(zhí)行路徑及執(zhí)行上下文,而問題檢測代碼被配置為用于檢測該程序中所關(guān)注的目標(biāo)程序單元的執(zhí)行所可能發(fā)生的運(yùn)行時問題。本發(fā)明還提供了使用上述方法及系統(tǒng)進(jìn)行調(diào)試和回歸測試的方法及系統(tǒng),以及計算機(jī)程序測試方法及系統(tǒng)。
文檔編號G06F11/36GK101165658SQ20061013553
公開日2008年4月23日 申請日期2006年10月18日 優(yōu)先權(quán)日2006年10月18日
發(fā)明者史蒂文·阿特金, 俊 尹, 黃省江 申請人:國際商業(yè)機(jī)器公司