專利名稱:測試覆蓋分析方法和裝置的制作方法
技術領域:
本發(fā)明涉及計算機領域,具體涉及軟件測試領域,更具體涉及一種測 試覆蓋分析方法和裝置。
背景技術:
對于大的軟件廠商來說,測試用例或測試程序的數(shù)量通常是很大的,
并且會隨著每一個產品版本的升級發(fā)布而遞增。例如,IBM Content Manager具有在6年多的時間里陸續(xù)開發(fā)的超過2000個Java函數(shù)測試用 例。了解這些測試用例的覆蓋性,即被測軟件的哪些函數(shù)已被這些測試用 例調用,對于保證測試質量和設計新的測試用例來說是非常重要的。然而, 由于測試用例的巨大數(shù)量,這種覆蓋性分析是很繁重的工作。
目前存在幾種能夠進行覆蓋性分析的工具,但這些工具都具有其各自 的缺點。
現(xiàn)有的堆分析工具主要致力于分析內存使用,而不是用于進行覆蓋性 分析。盡管也有可能從這類工具中獲得函數(shù)覆蓋信息,但這類工具并不直 接報告這種信息。而且,使用這種工具, 一次只能分析一個堆轉儲 (heapdump),而不能同時分析由多個測試用例產生的多個堆轉儲。
現(xiàn)有的一些測試分析工具具有專用于覆蓋性分析的功能,然而這種功 能通常是通過插裝(instrumentation)來實現(xiàn)的,這就需要獲得并修改被 測試程序的源代碼,并需要被測試程序在工具本身的運行環(huán)境中執(zhí)行,從 而帶來額外的購買、安裝、學習和使用成本。此外,這類工具也只能一次 分析一個測試用例,而不能在運行多個測試用例之后,集中地對這些測試 用例的運行結果進行覆蓋性分析。顯然,本領域中需要這樣一種有效的覆蓋分析解決方案,它能夠對多 個測試用例的運4于結果一次性的進行覆蓋性分析、而不需要測試用例在特 定工具的執(zhí)行環(huán)境中運行。
發(fā)明內容
根據本發(fā)明的一個方面,提供了一種測試覆蓋分析方法,包括通過 使用一個或多個測試用例運行被測試程序,生成包含凈皮測試程序調用棧信 息的一個或多個堆轉儲文件;以及對所述一個或多個堆轉儲文件中的調用 棧信息進行分析,以獲得所述一個或多個測試用例對于所述被測試程序的 函數(shù)的覆蓋性。
根據本發(fā)明的另一個方面,提供了一種測試覆蓋分析裝置,包括堆 轉儲生成模塊,被配置為通過使用一個或多個測試用例運行被測試程序, 生成包含被測試程序調用棧信息的一個或多個堆轉儲文件;以及分析;漠塊, 被配置為對所述一個或多個堆轉儲文件中的調用棧信息進行分析,以獲得 所述一個或多個測試用例對于所述被測試程序的函數(shù)的覆蓋性。
本發(fā)明的解決方案不僅能夠有效地實現(xiàn)對測試用例的覆蓋性的分析, 而且不需要被測試程序的源代碼,不需要在特殊的環(huán)境中運行被測試程序, 而只需要利用被測試程序在測試環(huán)境中的運行結果來進行分析。此外,本 發(fā)明的4支術方案能夠實現(xiàn)一次性地對包含大量測試用例的測試用例集的覆 蓋性進行分析。
所附權利要求中闡述了被認為是本發(fā)明的特點的創(chuàng)造性特征。但是, 通過參照附圖閱讀下面對說明性實施例的詳細說明可更好地理解發(fā)明本身 以及其優(yōu)選使用模式、目標、特征以及優(yōu)點,在附圖中 圖1示出了根據本發(fā)明的實施例的測試覆蓋分析方法; 圖2示出了才艮據本發(fā)明的實施例對過濾后的調用棧信息中的函數(shù)調用 條目進行分析以獲得一個或多個測試用例對被測試程序中函數(shù)的覆蓋性的具體實現(xiàn)方式;
圖3示出了根據本發(fā)明的實施例的測試覆蓋分析裝置;以及 圖4示出了根據本發(fā)明的實施例的分析模塊中包含的各子模塊。
具體實施例方式
下面參照附圖來說明本發(fā)明的實施例。在下面的說明中,闡述了許多 具體細節(jié)以便更全面地了解本發(fā)明。但是,對于本技術領域內的技術人員 明顯的是,本發(fā)明的實現(xiàn)可不具有這些具體細節(jié)中的一些。此外,應當理 解的是,本發(fā)明并不限于所介紹的特定實施例。相反,可以考慮用下面的 特征和元素的任意組合來實施本發(fā)明,而無論它們是否涉及不同的實施例。 因此,下面的方面、特征、實施例和優(yōu)點僅作說明之用而不應被看作是所 附權利要求的要素或限定,除非權利要求中明確提出。
下面以Java環(huán)境為例來說明本發(fā)明的技術方案,然而,應指出的是, 本發(fā)明不僅限于Java環(huán)境,而是適合于所有能夠在程序運行中產生包含調 用棧(call stack)信息的堆轉儲文件的執(zhí)行環(huán)境。
調用棧是指在計算機程序的運行過程中用M儲程序運行中的活動子 程序(即函數(shù))的信息的棧,所述活動子程序是指那些已,皮調用但尚未完 成執(zhí)行并返回的子程序。程序的每一個執(zhí)行線程具有一個調用棧。調用棧 由棧幀組成,每一個棧幀對應于一個被調用的子程序。每一個棧幀中存儲 有被調用子程序的返回地址,以使被調用子程序執(zhí)行完成后能返回調用子 程序,并通常還存儲有調用子程序傳遞給被調用子程序的參數(shù)值,以及被 調用子程序的本地變量。每當一個子程序被調用,在調用棧中形成該子程 序的棧幀;當該子程序在運行過程中調用其他子程序時,在調用棧中在該 子程序的棧幀之上形成該其他子程序的棧幀;而當當前子程序(其幀棧位 于調用棧的最頂端)執(zhí)行完成后,從調用棧中將其棧幀出棧。因此,在程 序執(zhí)行過程中任一時刻的調用棧反映了程序執(zhí)行到該時刻的子程序調用路 徑。通過獲取和分析程序執(zhí)行過程中各時刻的調用棧,就可以了解程序的 整個執(zhí)行歷史和調用歷史。Java環(huán)境中內置了一個稱為Hprof的簡單的命令行概要分析工具, 其用于進行堆和CPU概要分析(profiling) 。 Hprof實際上是一種JAVA 虛擬機本機代理庫,其可通過一命令行選項 "-Xrunhrof 在JAVA虛 擬機啟動時被動態(tài)加載。例如,使用如下命令行命令
Java —Xrunhprof: cpu=samples, depth=15 Testcasel, 可啟動Hprof工具,該工具將在Testcasel程序運行結束后,生成一堆轉 儲文件,該堆轉儲文件中除了包含Java堆中的對象動態(tài)分配信息外,還包 含程序在執(zhí)行過程中所產生的所有調用棧信息。例如,下面示出了堆轉儲 文件中包含的一個調用棧信息的示例 TRACE 300649:
java.net.Inet4AddressImpUook叩A膽ostAddr(Inet4AddressImpl.jav a:Unknown line)
java.net.InetAddress$l.lookupAllHostAddr(InetAddress.java:873) java.net.InetAddress.getAddressFromNameService(InetAddress.java: 1211)
java.net.InetAddress.getLocalHost(InetAddress.java:1342) com.abc.mm.sdk.server.DKDatastoreICM.logon(DKDatastoreICM.ja va:2299)
com.abc.mm.sdk.server.DKDatastoreICM.connect(DKDatastoreICM. java:2076)
com.abc.mm.qa.cm.Connect.test(Connect.java:63)
com.abc.mm.qa.common.TestRunner.runTest(TestRunner.java:27)
com.abc.mm.qa.common.VU.run(VU.java:35)
java.lang.Thread.run(Thread.java:799), 其中,300649是該調用棧信息的編號,并可作為該調用棧的唯一標識。上 述調用棧信息中列出了該調用棧中按調用順序排列的各函數(shù)調用的信息, 其中每個函數(shù)調用條目包括該函數(shù)的完整名稱(類名和方法名)、位于括
號中的該函數(shù)所處的源文件以及被調用時所處的行號。由于堆轉儲文件的調用棧信息都包含了測試用例運行過程中每個所調 用的函數(shù),因此所述調用棧信息可用來分析所述一個或多個測試用例對于 -陂測試程序中函數(shù)的覆蓋性。
以上簡要說明了本發(fā)明的原理,下面參照附圖描述本發(fā)明的測試覆蓋 分析方法。
圖1示出了根據本發(fā)明的實施例的測試覆蓋分析方法。如圖所示,該 方法包括以下步驟。
在步驟101,通過針對被測試程序運行一個或多個測試用例,生成包
含被測試程序運行過程中產生的調用棧信息的一個或多個堆轉儲文件。
根據本發(fā)明的實施例,所述被測試程序在Java環(huán)境中運行,并且所述 堆轉儲文件是使用Java虛擬機中內置的hprof工具生成的。這樣,就可以 在Java程序測試環(huán)境中直接生成所述堆轉儲文件,而不需要使用專用的工具。
前文中示出了該步驟中生成的堆轉儲文件中包含的一個調用棧信息 的示例。
根據本發(fā)明的實施例,該測試覆蓋分析方法包括一可選步驟102,其
留對測試用例的函數(shù)覆蓋分析有意義的函數(shù)調用條目,而濾除那些無意義 的函數(shù)調用條目。
根據本發(fā)明的實施例,所述過濾規(guī)則可包含被測試程序包的名稱的部 分或全部,其用于將不包含所述包的名稱的部分或全部的函數(shù)調用條目濾 除。例如,如果過濾規(guī)則指定了被測試程序的包名稱"com.abc.mm.sdk", 則函數(shù)調用棧信息中所有不包含"com.abc.mm.sdk"的函數(shù)調用條目將被 濾除,而函數(shù)調用棧信息中所有包含"com.abc.mm.sdk"的函數(shù)調用條目 將被保留,用于進行覆蓋性分析。這些被保留的函數(shù)調用條目表明測試用 例對被測試程序包"com.abc.mm.sdk"中的函數(shù)調用。
此外,所述過濾規(guī)則還可包含對于測試覆蓋分析不重要的類或方法的 名稱,其用于將包含所述類或方法的函數(shù)調用條目濾除。例如,由于方法"com.abc.mm.sdk.server.DKDatastoreICM.connect"和"com.abc.mm.skd. server.DKDatastoreICM.logon"總是被所有測試用例所執(zhí)行,因此它們對 于分析測試用例對于被測試程序中函數(shù)的覆蓋性沒有幫助,可以將調用棧 信息中包含這些方法的條目濾除。
在本發(fā)明中,可以使用以上兩種過濾規(guī)則中的任何一個或同時使用兩 者來對調用棧信息中的函數(shù)調用條目進行過濾。
在步驟103,對所述一個或多個堆轉儲文件中的調用棧信息進行分析, 以獲得所述一個或多個測試用例對于所述被測試程序中函數(shù)的覆蓋性信 息。也就是說,通過分析由測試用例生成的調用棧信息中的各個函數(shù)調用 條目,判斷測試用例調用了被測試程序的哪些函數(shù),從而得到測試用例對 于被測試程序中函數(shù)的覆蓋性信息。在本發(fā)明的包含所述過濾步驟102的 實施例中,所述對調用棧信息進行分析包括對過濾后的所述調用棧信息中 的函數(shù)調用條目進行分析,以獲得所述一個或多個測試用例對于所述被測 試程序中函數(shù)的覆蓋性。
圖2示出了根據本發(fā)明的實施例對調用棧信息中的函數(shù)調用條目進行 分析以獲得一個或多個測試用例對被測試程序中函數(shù)的覆蓋性的具體實現(xiàn) 方式,即根據本發(fā)明的實施例的上述步驟103中包括的具體實現(xiàn)步驟。應 指出的是,該具體實現(xiàn)方式僅為示例,而不是對本發(fā)明的限制。本發(fā)明可 使用任何其他方式對調用棧信息中的函數(shù)調用的條目進行分析來獲得測試 用例對被測試程序中函數(shù)的覆蓋性信息。
如圖2所示,根據本發(fā)明的實施例,所述對調用棧信息中的函數(shù)調用 條目進行分析的步驟102包括以下步驟
在步驟201,對每個函數(shù)調用條目執(zhí)行散列運算,并將所獲得散列碼 作為該函數(shù)調用條目的標識??墒褂帽绢I域中已知的很多散列算法中的任 何一個散列算法來執(zhí)行所述散列運算,且所述散列碼的位數(shù)可以不同。優(yōu) 選地,所述散列算法和散列碼的位數(shù)應盡可能保證使不同的函數(shù)調用條目 能產生不同的散列碼。如下示出了一示例性調用棧信息
TRACE 300586java.net.SocketlnputStream.socketReadO(SocketlnputStream.java:U nknown line)
java.netSocketlnputStream.read(Socketl叩utStream.java:155) java.net.SocketlnputStream.read(SocketlnputStream.java:211) com.abc.min.sdk.internal.PH付pRespoiise.readResponseHeaders(PHt
tpResponse.java:247)
com.abc.mm.sdk.internal.PHttpResponse.retrieveHeadersFromResp
onse(PHttpResponse. j ava :202)
com.abc.mm.sdk.internal.PHttpResponse.getStatusCode(PHttpRespo
nse.java:113)
com.abc.mm.sdk.internal.PHttpURLConnection.getResponseCode(P HttpURLCo隱ction.java:248)
com.abc.mm.sdk.internal.PHttpPut.getHTTPResponse(PHttpPut.jav a:913)
com.abc.mm.sdk.common.DKLobICM.storeOnObjectServer(DKLob ICM.java:3115)
com.abc.mm.sdk.common.DKLobICM.validatePrimaryRMForStore OrReplace(DKLoblCM.java:2916)
其中,"com.abc.mm.sdk.internal.PHttpResponse.retrieveHeadersFrom Response(PHttpResponse.java:202)"是一個函數(shù)調用條目,由該函數(shù)調用 條目所生成的作為其標識的散列碼為-2042986671。
在步驟202,將所獲得的各個函數(shù)調用條目的標識進行排序,并去除 重復的標識,從而形成包含一組唯一標識的標識列表。
在步驟203,記錄所述標識列表中每個標識與相應的函數(shù)、調用棧和 測試用例之間的關聯(lián)。例如,對于標識列表中包含的上述示例性標識-2042986671,可記錄該標識-2042986671與函數(shù)"com.abc.mm.sdk. internal.PHttpResponse.retrieveHeadersFroinResponse"、 該調用棧的標 識300586以及產生該調用棧信息的測試用例Testcasel之間的關聯(lián)??梢詫⑺鲫P聯(lián)存儲在存儲器或數(shù)據庫中。在本發(fā)明的一實施例中,標識列表 中的每個標識與相應的函數(shù)、調用棧和測試用例之間的關聯(lián)可通過針對標 識列表中的每個標識,遍歷所有測試用例所產生的所有堆轉儲文件中調用 棧信息,并使用與生成所述標識列表中的標識相同的散列算法生成每個調 用棧信息中的每個函數(shù)調用的條目的散列值,然后將該散列值與該標識比 較來獲得。當然,標識列表中的每個標識與相應的函數(shù)、調用棧和測試用 例之間的關聯(lián)也在生成標識列表中的每個標識時直接獲得并記錄下來。
在步驟204,使用所述標識列表以及所述關聯(lián)獲得所述一個或多個測 試用例對于所述被測試程序中的函數(shù)的覆蓋性信息。
通過獲得每個測試用例產生的調用棧信息中每個函數(shù)調用條目的散列 值,并將這些散列值排序,可以更迅速地判斷每個測試用例的調用了被測 試程序中的哪些函數(shù),從而可以更迅速有效地進行測試用例的覆蓋性分析。
根據本發(fā)明的實施例,所述覆蓋性可包括以下各項中的任何一個或多 個所述凈皮測試程序中的特定函數(shù)由所述一個或多個測試用例中的哪一個 或一些測試用例所覆蓋;所述一個或多個測試用例中的特定測試用例覆蓋 了所述被測試程序中的哪些函數(shù);以及所述被測試程序中的哪一個或一些 函數(shù)未被所述一個或多個測試用例所覆蓋。
例如,可才艮據所述標識列表以及所述關聯(lián)判斷 一 特定函數(shù) "com.abc.mm.sdk.common.DKLobICM.storeOnObjectServer" 由效'J試用 例Testcasel和Testcase2所覆蓋,并包含在Testcasel和Testcase2所分別 產生的標識分別為300654和300661的調用棧信息中。
再例如,可4艮據所述標識列表以及所述關聯(lián)判斷一特定測試用例在由 其產生的調用棧信息中覆蓋了 "com.abc.mm.sdk.internal.PHttpSocket Handler.connect,, 、 "com.abc.mm.sdk.internal.PHttpURLConnection. connect" 、"com.abc.mm.sdk.internal.PHttpURLConnection.<init>,,、
"com.abc.mm.sdk.internal.PHttpPut.createConnection,, 、 "com.abc.mm. sdk.internal.PHttpPut.openCoimection,,等函數(shù)。
又例如,可通過將被測試程序中所有函數(shù)的列表與由所有測試用例產生的所有調用棧信息中包含的所有函數(shù)調用條目中的函數(shù)進行比較來判斷 被測試程序中的哪些函數(shù)沒有被這些測試用例所覆蓋。
此外,可將所獲得的有關覆蓋性的結果保存以l更進一步處理和顯示。 以上描述了根據本發(fā)明的實施例的測試覆蓋分析方法,應指出的是, 以上描述僅為示例性說明,而不是對本發(fā)明的限制。在本發(fā)明的其他實施 例中,該方法可具有更多、更少或不同的步驟,且各步驟之間的關系可以 與所描述的不同。此外, 一些步驟可以被劃分為更小的步驟, 一些步驟可 以凈皮合并為更大的步驟。例如,在本發(fā)明的一些實施例中,可以沒有所述
過濾步驟102、排序子步驟中的任何一個或兩者,等等。所有這些變化都 處于本發(fā)明的范圍之內。
下面參照附圖3描述根據本發(fā)明的實施例的測試覆蓋分析裝置。為簡 明起見,在以下描述中省略了與以上描述重復的部分內容,因此可參見以 上描述獲得對本發(fā)明的測試覆蓋分析裝置的更詳細的了解。
如圖所示,根據本發(fā)明的實施例的測試覆蓋分析裝置包括堆轉儲生 成模塊301,其被配置為通過使用一個或多個測試用例運行被測試程序, 生成包含被測試程序運行過程中產生的調用棧信息的 一個或多個堆轉儲文 件;以及分析模塊302,其被配置為對所述一個或多個堆轉儲文件中的調 用棧信息進行分4斤,以獲得所述一個或多個測試用例對于所述被測試程序 中函數(shù)的覆蓋性。
根據本發(fā)明的實施例,所述被測試程序在Java環(huán)境中運行,并且堆轉 儲生成模塊301為Java虛擬機中內置的hprof工具。這樣,就可以通過在 Java程序測試環(huán)境中直接生成堆轉儲文件,而不需要4吏用專用的工具。
根據本發(fā)明的實施例,所述測試覆蓋分析裝置還包括過濾模塊303, 該過濾模塊被配置為使用過濾規(guī)則對所述調用棧信息中的函數(shù)調用條目進 行過濾,且所述分析才莫塊302進一步被配置為對過濾后的所述調用棧信息 中的函數(shù)調用條目進行分析。
根據本發(fā)明的進一步的實施例,所述過濾規(guī)則包括以下各項中的任何 一個或多個所述被測試程序所在的包的名稱的部分或全部,其用于將不包含所述包的名稱的部分或全部的函數(shù)調用條目濾除;以及對于測試覆蓋 分析不重要的類或方法的名稱,其用于將包含所述類或方法的函數(shù)調用條
目濾除。
圖4示出了根據本發(fā)明的實施例所述凈皮配置為對過濾后的所述調用棧 信息中的函數(shù)調用條目進行分析的分析模塊302中包含的各子模塊。如圖 所示,該分析模塊302包括
散列子模塊401,其被配置為對所述過濾后的每個函數(shù)調用條目執(zhí)行 散列運算,并將所獲得散列碼作為該函數(shù)調用條目的標識;
標識列表形成子模塊402,其被配置為將所獲得的各個函數(shù)調用條目 的標識進行排序,去除重復的標識,從而形成標識列表;
關聯(lián)記錄子模塊403,其被配置為記錄標識列表中每個標識與相應的 函數(shù)、調用棧信息和測試用例之間的關聯(lián);以及
覆蓋性獲得子模塊404,其被配置為使用所述標識列表以及所述關聯(lián) 獲得所述一個或多個測試用例對于所述被測試程序中的函數(shù)的覆蓋性。
根據本發(fā)明的實施例,所述覆蓋性包括以下各項中的任何一個或多個 所述被測試程序中的特定函數(shù)由所述一個或多個測試用例中的哪一個或一 些測試用例所覆蓋;所述一個或多個測試用例中的特定測試用例覆蓋了所 述被測試程序中的哪些函數(shù);以及所述被測試程序中的哪一個或一些函數(shù) 未被所述一個或多個測試用例所覆蓋。
以上描述了根據本發(fā)明的實施例的測試覆蓋分析裝置,應指出的是, 以上描述僅為示例性說明,而不是對本發(fā)明的限制。在本發(fā)明的其他實施 例中,該裝置可具有更多、更少或不同的模塊,且各模塊之間的連接和包 含關系可以與所描述的不同。此外, 一些模塊可以被劃分為更小的模塊, 一些模塊可以被合并為更大的模塊。例如,在本發(fā)明的一些實施例中,可 以沒有所述過濾模塊302,且所述標識列表形成子模塊304可不包括排序 功能,等等。所有這些變化都處于本發(fā)明的范圍之內。
本發(fā)明可以硬件、軟件、或硬件與軟件的結合的方式實現(xiàn)。本發(fā)明可 以集中的方式在一個計算機系統(tǒng)中實現(xiàn),或以分布方式實現(xiàn),在這種分布方式中,不同的部件分布在若干互連的計算機系統(tǒng)中。適于執(zhí)行本文中描
述的方法的任何計算;f幾系統(tǒng)或其它裝置都是合適的。 一種典型的硬件和軟 件的組合可以是帶有計算機程序的通用計算機系統(tǒng),當該計算機程序 栽和執(zhí)行時,控制該計算機系統(tǒng)而使其執(zhí)行本發(fā)明的方法,并構成本發(fā)明 的裝置。
本發(fā)明也可體現(xiàn)在計算機程序產品中,該程序產品包含使能實現(xiàn)本文 中描述的方法的所有特征,并且當其凈iLi口載到計算機系統(tǒng)中時,能夠執(zhí)行 所述方法。
盡管已參照優(yōu)選實施例具體示出和說明了本發(fā)明,但是本領域內的那 些技術人員應理解,可在形式和細節(jié)上對其進行各種改變而不會背離本發(fā) 明的精神和范圍。
權利要求
1.一種測試覆蓋分析方法,包括通過使用一個或多個測試用例運行被測試程序,生成包含被測試程序的調用棧信息的一個或多個堆轉儲文件;以及對所述一個或多個堆轉儲文件中的調用棧信息進行分析,以獲得所述一個或多個測試用例對于所述被測試程序的函數(shù)的覆蓋性信息。
2. 根據權利要求1的方法,其中,所述覆蓋性包括以下各項 中的4壬何一個或多個所述被測試程序中的特定函數(shù)由所述一個或多個測試用例中 的哪一個或一些測試用例所覆蓋;所述一個或多個測試用例中的特定測試用例覆蓋了所述被測 試程序中的哪些函數(shù);以及所述被測試程序中的哪一個或一些函數(shù)未被所述一個或多個 測試用例所覆蓋。
3. 根據權利要求1的方法,還包括使用過濾規(guī)則對所述調用 棧信息中的函數(shù)調用條目進行過濾,且其中,所述對調用棧信息 進行分析包括對過濾后的所述調用棧信息中的函數(shù)調用條目進行分析。
4. 根據權利要求3的方法,其中,所述過濾規(guī)則包含以下各 項中的任何一個或多個所述被測試程序所在的包的名稱的部分或全部,其用于將不 包含所述包的名稱的部分或全部的函數(shù)調用條目濾除;以及對于測試覆蓋分析不重要的類或方法的名稱,其用于將包含 所述類或方法的函數(shù)調用條目濾除。
5. 根據權利要求3的方法,其中,所述對過濾后的所述調用 棧信息中的函數(shù)調用條目進行分析包括對所述過濾后的每個函數(shù)調用條目執(zhí)行散列運算,并將所獲得散列碼作為該函數(shù)調用條目的標識;將所獲得的各個函數(shù)調用條目的標識進行排序,去除重復的 標識,從而形成標識列表;記錄所述標識列表中每個標識與相應的函數(shù)、調用棧和測試 用例之間的關聯(lián);以及使用所述標識列表以及所述關聯(lián)獲得所述一個或多個測試用 例對于所述被測試程序中的函數(shù)的覆蓋性信息。
6. 根據權利要求1的方法,其中,所述被測試程序在Java 環(huán)境中運行,并且所述堆轉儲文件是使用Java虛擬機中內置的 hprof工具生成的。
7. —種測試覆蓋分析裝置,包括堆轉儲生成模塊,被配置為通過使用一個或多個測試用例運 行被測試程序,生成包含被測試程序的調用棧信息的 一個或多個 堆轉儲文件;以及分析模塊,被配置為對所述一個或多個堆轉儲文件中的調用 棧信息進行分析,以獲得所述一 個或多個測試用例對于所述被測 試程序中函數(shù)的覆蓋性信息。
8. 根據權利要求7的裝置,其中,所述覆蓋性信息包括以下 各項中的任何一個或多個所述被測試程序中的特定函數(shù)由所述一個或多個測試用例中 的哪一個或一些測試用例所覆蓋;所述一個或多個測試用例中的特定測試用例覆蓋了所述被測 試程序中的哪些函數(shù);以及所述被測試程序中的哪一個或一些函數(shù)未被所述一個或多個 測試用例所覆蓋。
9. 根據權利要求7的裝置,還包括過濾模塊,該過濾模塊被 配置為使用過濾規(guī)則對所述調用棧信息中的函數(shù)調用條目進行過濾,且所述分析模塊進一步被配置為對過濾后的所述調用棧信息 中的函數(shù)調用條目進行分析。
10. 根據權利要求9的裝置,其中,所述過濾規(guī)則包含以下各 項中的任何一個或多個所述被測試程序所在的包的名稱的部分或全部,其用于將不 包含所述包的名稱的部分或全部的函數(shù)調用條目濾除;以及對于測試覆蓋分析不重要的類或方法的名稱,其用于將包含 所述類或方法的函數(shù)調用條目濾除。
11. 根據權利要求9的裝置,其中,所述被配置為對過濾后的 所述調用棧信息中的函數(shù)調用條目進行分析的分析模塊包括散列模塊,其被配置為對所述過濾后的每個函數(shù)調用條目執(zhí) 行散列運算,并將所獲得散列碼作為該函數(shù)調用條目的標識;標識列表形成模塊,其被配置為將所獲得的各個函數(shù)調用條 目的標識進行排序,去除重復的標識,從而形成標識列表;記錄才莫塊,其#皮配置為記錄標識列表中每個標識與相應的函 數(shù)、調用棧和測試用例之間的關聯(lián);以及覆蓋性獲得模塊,其被配置為使用所述標識列表以及所迷關 聯(lián)獲得所述一個或多個測試用例對于所述被測試程序中的函數(shù)的 覆蓋性信息。
12. 根據權利要求7的裝置,其中,所述被測試程序在Java 環(huán)境中運行,并且所述堆轉儲生成模塊為Java虛擬機中內置的 hprof工具。
全文摘要
公開了一種測試覆蓋分析方法和相應的裝置,該方法包括通過使用一個或多個測試用例運行被測試程序,生成包含被測試程序的調用棧信息的一個或多個堆轉儲文件;以及對所述一個或多個堆轉儲文件中的調用棧信息進行分析,以獲得所述一個或多個測試用例對于所述被測試程序中函數(shù)的覆蓋性信息。
文檔編號G06F11/36GK101661425SQ20081021244
公開日2010年3月3日 申請日期2008年8月26日 優(yōu)先權日2008年8月26日
發(fā)明者志 張, 曾春光 申請人:國際商業(yè)機器公司