本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,尤其涉及一種基于代碼變更分析的測試方法及裝置。
背景技術(shù):
隨著市場競爭的日趨激烈,對產(chǎn)品開發(fā)的速度要求越來越高。產(chǎn)品在開發(fā)過程中,往往需要經(jīng)過各種各樣的測試。針對產(chǎn)品的測試,開發(fā)人員一般會開發(fā)很多的測試用例,以覆蓋盡可能多的場景。產(chǎn)品在開發(fā)過程中,可能會涉及到源代碼文件的變更,此時(shí)需要對該變更進(jìn)行分析,然后基于分析結(jié)果選擇測試用例進(jìn)行針對性的測試。
目前,測試方法可以包括:自動監(jiān)控源代碼文件,如果源代碼文件發(fā)生變更,如源代碼文件的時(shí)間戳發(fā)生了變更,則認(rèn)為該源代碼文件對應(yīng)的類發(fā)生變化,然后針對該類進(jìn)行測試,即從測試用例庫中篩選出該類對應(yīng)的所有測試用例,并執(zhí)行這些測試用例以完成測試。其中,類是指由該源代碼文件編譯生成的文件。
在實(shí)現(xiàn)本發(fā)明的過程中,發(fā)明人發(fā)現(xiàn)現(xiàn)有技術(shù)至少存在以下問題:
上述技術(shù)通過監(jiān)控源代碼文件的方式來進(jìn)行代碼變更分析,可以監(jiān)控的粒度局限在類的級別上,只能分析出類發(fā)生了變更,不能精確地反映出該類中的哪些代碼發(fā)生了變更,基于類選取的測試用例針對性差,導(dǎo)致測試效率低。
技術(shù)實(shí)現(xiàn)要素:
為了解決現(xiàn)有技術(shù)的問題,本發(fā)明實(shí)施例提供了一種基于代碼變更分析的測試方法及裝置。所述技術(shù)方案如下:
第一方面,提供了一種基于代碼變更分析的測試方法,所述方法包括:
根據(jù)當(dāng)前編譯生成的多個類class文件和當(dāng)前編譯之前任一次編譯生成的多個class文件,分部生成樹狀結(jié)構(gòu)的第一元數(shù)據(jù)集和第二元數(shù)據(jù)集,該兩個元數(shù)據(jù)集均包括多個class節(jié)點(diǎn),及所述多個class節(jié)點(diǎn)下的多個method節(jié)點(diǎn),每個class節(jié)點(diǎn)對應(yīng)一個class文件,每個method節(jié)點(diǎn)對應(yīng)一個成員函數(shù);
以所述第一元數(shù)據(jù)集和所述第二元數(shù)據(jù)集的差異分析,獲取代碼發(fā)生變更的多個成員函數(shù);
基于與所述多個成員函數(shù)一一對應(yīng)的測試用例生成的測試用例集進(jìn)行測試。
在第一方面的第一種實(shí)現(xiàn)方式中,對于所述第一元數(shù)據(jù)集和所述第二元數(shù)據(jù)集中,任一元數(shù)據(jù)集的生成過程包括:
解析編譯生成的多個class文件,得到所述多個class文件的名稱和摘要信息、以及每個class文件包含的多個成員函數(shù)的名稱和字節(jié)碼序列;
基于所述多個class文件的名稱和摘要信息,構(gòu)成多個class節(jié)點(diǎn),對于每個class文件,基于所述class文件包含的多個成員函數(shù)的名稱和字節(jié)碼序列,構(gòu)成多個method節(jié)點(diǎn),并將所述多個method節(jié)點(diǎn)作為所述class文件對應(yīng)的class節(jié)點(diǎn)的子節(jié)點(diǎn)。
在第一方面的第二種實(shí)現(xiàn)方式中,所述以所述第一元數(shù)據(jù)集和所述第二元數(shù)據(jù)集的差異分析,具體包括:
對于所述第一元數(shù)據(jù)集中的任一class節(jié)點(diǎn),讀取所述class節(jié)點(diǎn)的名稱,在所述第二元數(shù)據(jù)集中查找目標(biāo)class節(jié)點(diǎn),所述目標(biāo)class節(jié)點(diǎn)與所述class節(jié)點(diǎn)的名稱相同;
如果查找不到所述目標(biāo)class節(jié)點(diǎn),則將所述class節(jié)點(diǎn)下所有成員函數(shù)的變更屬性標(biāo)記為第一屬性,所述第一屬性用于指示發(fā)生代碼變更。
在第一方面的第三種實(shí)現(xiàn)方式中,所述在所述第二元數(shù)據(jù)集中查找目標(biāo)class節(jié)點(diǎn)之后,所述方法還包括:
如果查找到所述目標(biāo)class節(jié)點(diǎn),則比較所述class節(jié)點(diǎn)的摘要信息和所述目標(biāo)class節(jié)點(diǎn)的摘要信息是否相同;
如果相同,將所述class節(jié)點(diǎn)下所有成員函數(shù)的變更屬性標(biāo)記為第二屬性,所述第二屬性用于指示未發(fā)生代碼變更;
如果不同,則對所述class節(jié)點(diǎn)下的method節(jié)點(diǎn)和所述目標(biāo)class節(jié)點(diǎn)下的method節(jié)點(diǎn)進(jìn)行差異分析。
在第一方面的第四種實(shí)現(xiàn)方式中,所述對所述class節(jié)點(diǎn)下的method節(jié)點(diǎn)和所述目標(biāo)class節(jié)點(diǎn)下的method節(jié)點(diǎn)進(jìn)行差異分析包括:
對于所述class節(jié)點(diǎn)下的每個method節(jié)點(diǎn),讀取所述method節(jié)點(diǎn)的名稱,在所述第二元數(shù)據(jù)集中查找目標(biāo)method節(jié)點(diǎn),所述目標(biāo)method節(jié)點(diǎn)與所述method節(jié)點(diǎn)的名稱相同;
如果查找不到所述目標(biāo)method節(jié)點(diǎn),則將所述method節(jié)點(diǎn)對應(yīng)的成員函數(shù)的變更屬性標(biāo)記為所述第一屬性。
在第一方面的第五種實(shí)現(xiàn)方式中,所述在所述第二元數(shù)據(jù)集中查找目標(biāo)method節(jié)點(diǎn)之后,所述方法還包括:
如果查找到所述目標(biāo)method節(jié)點(diǎn),則根據(jù)所述method節(jié)點(diǎn)的字節(jié)碼序列和所述目標(biāo)method節(jié)點(diǎn)的字節(jié)碼序列,計(jì)算萊文斯坦距離;
如果所述萊文斯坦距離大于或者等于預(yù)設(shè)門限值,則將所述method節(jié)點(diǎn)對應(yīng)的成員函數(shù)的變更屬性標(biāo)記為所述第一屬性;
如果所述萊文斯坦距離小于預(yù)設(shè)門限值,則將所述method節(jié)點(diǎn)對應(yīng)的成員函數(shù)的變更屬性標(biāo)記為所述第二屬性。
第二方面,提供了一種基于代碼變更分析的測試裝置,所述裝置包括:
生成模塊,用于根據(jù)當(dāng)前編譯生成的多個類class文件和當(dāng)前編譯之前任一次編譯生成的多個class文件,分別生成樹狀結(jié)構(gòu)的第一元數(shù)據(jù)集和第二元數(shù)據(jù)集,該兩個元數(shù)據(jù)集均包括多個class節(jié)點(diǎn),及所述多個class節(jié)點(diǎn)下的多個method節(jié)點(diǎn),每個method節(jié)點(diǎn)對應(yīng)一個成員函數(shù);
分析模塊,用于以所述第一元數(shù)據(jù)集和所述第二元數(shù)據(jù)集的差異分析,獲取代碼發(fā)生變更的多個成員函數(shù);
測試模塊,用于基于與所述多個成員函數(shù)一一對應(yīng)的測試用例生成的測試用例集進(jìn)行測試。
在第二方面的第一種實(shí)現(xiàn)方式中,所述分析模塊包括:
查找子模塊,用于對于所述第一元數(shù)據(jù)集中的任一class節(jié)點(diǎn),讀取所述class節(jié)點(diǎn)的名稱,在所述第二元數(shù)據(jù)集中查找目標(biāo)class節(jié)點(diǎn),所述目標(biāo)class節(jié)點(diǎn)與所述class節(jié)點(diǎn)的名稱相同;
標(biāo)記子模塊,用于如果查找不到所述目標(biāo)class節(jié)點(diǎn),則將所述class節(jié)點(diǎn)下所有成員函數(shù)的變更屬性標(biāo)記為第一屬性,所述第一屬性用于指示發(fā)生代碼變更。
在第二方面的第二種實(shí)現(xiàn)方式中,所述查找子模塊,還用于如果查找到所述目標(biāo)class節(jié)點(diǎn),且所述class節(jié)點(diǎn)的摘要信息和所述目標(biāo)class節(jié)點(diǎn)的摘要信息相同,則對于所述class節(jié)點(diǎn)下的每個method節(jié)點(diǎn),讀取所述method節(jié)點(diǎn)的名稱,在所述第二元數(shù)據(jù)集中查找目標(biāo)method節(jié)點(diǎn),所述目標(biāo)method節(jié)點(diǎn)與所述method節(jié)點(diǎn)的名稱相同;
標(biāo)記子模塊,還用于如果查找不到所述目標(biāo)method節(jié)點(diǎn),則將所述method節(jié)點(diǎn)對應(yīng)的成員函數(shù)的變更屬性標(biāo)記為所述第一屬性。
在第二方面的第三種實(shí)現(xiàn)方式中,所述分析模塊還包括計(jì)算子模塊:
所述計(jì)算子模塊,用于如果查找到所述目標(biāo)method節(jié)點(diǎn),則根據(jù)所述method節(jié)點(diǎn)的字節(jié)碼序列和所述目標(biāo)method節(jié)點(diǎn)的字節(jié)碼序列,計(jì)算萊文斯坦距離;
所述標(biāo)記子模塊,還用于如果所述萊文斯坦距離大于或者等于預(yù)設(shè)門限值,則將所述method節(jié)點(diǎn)對應(yīng)的成員函數(shù)的變更屬性標(biāo)記為所述第一屬性;
所述標(biāo)記子模塊,還用于如果所述萊文斯坦距離小于預(yù)設(shè)門限值,則將所述method節(jié)點(diǎn)對應(yīng)的成員函數(shù)的變更屬性標(biāo)記為所述第二屬性。
本發(fā)明實(shí)施例提供的技術(shù)方案帶來的有益效果是:
通過對第一元數(shù)據(jù)集中的class節(jié)點(diǎn)和第二元數(shù)據(jù)集中的class節(jié)點(diǎn)進(jìn)行差異分析,來獲取代碼發(fā)生變更的多個成員函數(shù),進(jìn)而針對該多個成員函數(shù),獲取與該多個成員函數(shù)一一對應(yīng)的測試用例,并根據(jù)這些測試用例生成測試用例集進(jìn)行測試。上述技術(shù)方案可以精確地反映出哪些成員函數(shù)發(fā)生了代碼變更,根據(jù)這些成員函數(shù)選取的測試用例針對性強(qiáng),可以實(shí)現(xiàn)成員函數(shù)級別的針對性測試,提高了測試效率。
附圖說明
為了更清楚地說明本發(fā)明實(shí)施例中的技術(shù)方案,下面將對實(shí)施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1是本發(fā)明實(shí)施例提供的一種測試系統(tǒng)的結(jié)構(gòu)示意圖;
圖2是本發(fā)明實(shí)施例提供的一種基于代碼變更分析的測試方法的流程圖;
圖3是本發(fā)明實(shí)施例提供的一種基于代碼變更分析的測試方法的流程圖;
圖4是本發(fā)明實(shí)施例提供的一種樹狀結(jié)構(gòu)的元數(shù)據(jù)集的示意圖;
圖5是本發(fā)明實(shí)施例提供的一種基于代碼變更分析的測試方法的流程圖;
圖6是本發(fā)明實(shí)施例提供的一種基于代碼變更分析的測試裝置的結(jié)構(gòu)示意圖;
圖7是本發(fā)明實(shí)施例提供的一種分析模塊602的結(jié)構(gòu)示意圖;
圖8是本發(fā)明實(shí)施例提供的又一種分析模塊602的結(jié)構(gòu)示意圖;
圖9是本發(fā)明實(shí)施例提供的一種基于代碼變更分析的測試置的框圖。
具體實(shí)施方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對本發(fā)明實(shí)施方式作進(jìn)一步地詳細(xì)描述。
圖1是本發(fā)明實(shí)施例提供的一種測試系統(tǒng)的結(jié)構(gòu)示意圖。該測試系統(tǒng)包括代碼編譯單元101、class文件存儲單元102、class文件庫103、class文件讀取單元104、class文件解析單元105、測試用例篩選單元106和測試用例庫107。
其中,該代碼編譯單元101負(fù)責(zé)每次編譯工作,包括將java文件編譯生成對應(yīng)的class文件;class文件存儲單元102負(fù)責(zé)將代碼編譯單元101生成的class文件存儲至class文件庫103的指定目錄;class文件讀取單元104負(fù)責(zé)從指定目錄讀取編譯生成的class文件,供class文件解析單元104進(jìn)行處理;class文件解析單元105負(fù)責(zé)按照java虛擬機(jī)的規(guī)范,解析class文件,得到該class文件的相關(guān)信息,并基于該相關(guān)信息,生成樹狀結(jié)構(gòu)的元數(shù)據(jù)集;測試用例篩選單元106負(fù)責(zé)對樹狀結(jié)構(gòu)元數(shù)據(jù)集進(jìn)行差異分析,獲取代碼發(fā)生變更的成員函數(shù),然后根據(jù)這些成員函數(shù),從測試用例庫中篩選出這些成員函數(shù)對應(yīng)的測試用例;測試用例庫107用于提供多個測試用例。
在下述的本發(fā)明實(shí)施例中,各個步驟實(shí)際上可能是由該測試系統(tǒng)的某個或多個單元協(xié)作完成,具體情況將在后續(xù)實(shí)施例的步驟中進(jìn)行說明。
圖2是本發(fā)明實(shí)施例提供的一種基于代碼變更分析的測試方法的流程圖。參見圖2,該方法包括:
201、根據(jù)當(dāng)前編譯生成的多個類class文件和當(dāng)前編譯之前任一次編譯生成的多個class文件,分別生成樹狀結(jié)構(gòu)的第一元數(shù)據(jù)集和第二元數(shù)據(jù)集,該兩個元數(shù)據(jù)集均包括多個class節(jié)點(diǎn),及所述多個class節(jié)點(diǎn)下的多個method節(jié)點(diǎn),每個class節(jié)點(diǎn)對應(yīng)一個class文件,每個method節(jié)點(diǎn)對應(yīng)一個成員函數(shù)。
202、以該第一元數(shù)據(jù)集和該第二元數(shù)據(jù)集的差異分析,獲取代碼發(fā)生變更的多個成員函數(shù)。
203、基于與該多個成員函數(shù)一一對應(yīng)的測試用例生成的測試用例集進(jìn)行測試。
本發(fā)明實(shí)施例提供的方法,通過對第一元數(shù)據(jù)集中的class節(jié)點(diǎn)和第二元數(shù)據(jù)集中的class節(jié)點(diǎn)進(jìn)行差異分析,來獲取代碼發(fā)生變更的多個成員函數(shù),進(jìn)而針對該多個成員函數(shù),獲取與該多個成員函數(shù)一一對應(yīng)的測試用例,并根據(jù)這些測試用例生成測試用例集進(jìn)行測試。上述技術(shù)方案可以精確地反映出哪些成員函數(shù)發(fā)生了代碼變更,根據(jù)這些成員函數(shù)選取的測試用例針對性強(qiáng),可以實(shí)現(xiàn)成員函數(shù)級別的針對性測試,提高了測試效率。
可選地,對于該第一元數(shù)據(jù)集和該第二元數(shù)據(jù)集中,任一元數(shù)據(jù)集的生成過程集包括:
解析編譯生成的多個class文件,得到該多個class文件的名稱和摘要信息、以及每個class文件包含的多個成員函數(shù)的名稱和字節(jié)碼序列;
基于該多個class文件的名稱和摘要信息,構(gòu)成多個class節(jié)點(diǎn),對于每個class文件,基于該class文件包含的多個成員函數(shù)的名稱和字節(jié)碼序列,構(gòu)成當(dāng)前編譯生成的多個method節(jié)點(diǎn),并將該多個method節(jié)點(diǎn)作為該class文件對應(yīng)的class節(jié)點(diǎn)的子節(jié)點(diǎn);
可選地,該以該第一元數(shù)據(jù)集和該第二元數(shù)據(jù)集的差異分析,具體包括:
對于該第一元數(shù)據(jù)集中的任一class節(jié)點(diǎn),讀取該class節(jié)點(diǎn)的名稱,在該第二元數(shù)據(jù)集中查找目標(biāo)class節(jié)點(diǎn),該目標(biāo)class節(jié)點(diǎn)與該class節(jié)點(diǎn)的名稱相同;
如果查找不到該目標(biāo)class節(jié)點(diǎn),則將該class節(jié)點(diǎn)下所有成員函數(shù)的變更屬性標(biāo)記為第一屬性,該第一屬性用于指示發(fā)生代碼變更。
可選地,該在該第二元數(shù)據(jù)集中查找目標(biāo)class節(jié)點(diǎn)之后,該方法還包括:
如果查找到該目標(biāo)class節(jié)點(diǎn),則比較該class節(jié)點(diǎn)的摘要信息和該目標(biāo)class節(jié)點(diǎn)的摘要信息是否相同;
如果相同,將該class節(jié)點(diǎn)下所有方法的變更屬性標(biāo)記為第二屬性,該第二屬性用于指示未發(fā)生代碼變更;
如果不同,則對該class節(jié)點(diǎn)下的method節(jié)點(diǎn)和該目標(biāo)class節(jié)點(diǎn)下的method節(jié)點(diǎn)進(jìn)行差異分析。
可選地,對該class節(jié)點(diǎn)下的method節(jié)點(diǎn)和該目標(biāo)class節(jié)點(diǎn)下的method節(jié)點(diǎn)進(jìn)行差異分析包括:
對于該class節(jié)點(diǎn)下的每個method節(jié)點(diǎn),讀取該method節(jié)點(diǎn)的名稱,在該第二元數(shù)據(jù)集中查找目標(biāo)method節(jié)點(diǎn),該目標(biāo)method節(jié)點(diǎn)與該method節(jié)點(diǎn)的名稱相同;
如果查找不到該目標(biāo)method節(jié)點(diǎn),則將該method節(jié)點(diǎn)對應(yīng)的成員函數(shù)的變更屬性標(biāo)記為該第一屬性。
可選地,該在該第二元數(shù)據(jù)集中查找目標(biāo)method節(jié)點(diǎn)之后,該方法還包括:
如果查找到該目標(biāo)method節(jié)點(diǎn),則根據(jù)該method節(jié)點(diǎn)的字節(jié)碼序列和該目標(biāo)method節(jié)點(diǎn)的字節(jié)碼序列,計(jì)算萊文斯坦距離;
如果該萊文斯坦距離大于或者等于預(yù)設(shè)門限值,則將該method節(jié)點(diǎn)對應(yīng)的成員函數(shù)的變更屬性標(biāo)記為該第一屬性;
如果該萊文斯坦距離小于預(yù)設(shè)門限值,則將該method節(jié)點(diǎn)對應(yīng)的成員函數(shù)的變更屬性標(biāo)記為該第二屬性。
上述所有可選技術(shù)方案,可以采用任意結(jié)合形成本發(fā)明的可選實(shí)施例,在此不再一一贅述。
圖3是本發(fā)明實(shí)施例提供的一種基于代碼變更分析的測試方法的流程圖。本發(fā)明實(shí)施例可以應(yīng)用于圖1所示的測試系統(tǒng)中,本發(fā)明實(shí)施例中的各個步驟可以由圖1所示的測試系統(tǒng)中的某個或多個單元協(xié)作完成。參見圖3,該方法包括:
301、對java文件進(jìn)行編譯,生成多個class(類)文件,并將當(dāng)前編譯生成的多個class文件存儲至指定目錄。
本發(fā)明實(shí)施例中,java文件為源代碼文件,class文件為可執(zhí)行文件。代碼編譯單元可以通過執(zhí)行預(yù)先配置的編譯腳本,將java文件編譯生成多個class文件。每次編譯完成后,class文件存儲單元可以將當(dāng)前編譯生成的該多個class文件存儲至class文件庫的指定目錄,并將該指定目錄作為當(dāng)前編譯生成的指定目錄,該指定目錄的名稱可以按照當(dāng)前編譯時(shí)間來進(jìn)行標(biāo)記。通過編譯時(shí)間對每次編譯生成的指定目錄進(jìn)行標(biāo)記,可以便于確認(rèn)每個指定目錄中存儲的是哪一次編譯生成的class文件,從而方便對這些class文件進(jìn)行相應(yīng)操作,包括查詢或處理class文件。
302、根據(jù)當(dāng)前編譯生成的多個class文件和當(dāng)前編譯之前任一次編譯生成的多個class文件,分別生成樹狀結(jié)構(gòu)的第一元數(shù)據(jù)集和第二元數(shù)據(jù)集,該兩個元數(shù)據(jù)集均包括多個class節(jié)點(diǎn),及所述多個class節(jié)點(diǎn)下的多個method節(jié)點(diǎn),每個class節(jié)點(diǎn)對應(yīng)一個class文件,每個method節(jié)點(diǎn)對應(yīng)一個成員函數(shù)。
本發(fā)明實(shí)施例中,由于每次編譯生成的class文件所存儲的指定目錄的名稱均按照編譯時(shí)間進(jìn)行了標(biāo)記,因此,class文件讀取單元可以通過比較每個指定目錄所指示的編譯時(shí)間,將編譯時(shí)間最晚的指定目錄確定為當(dāng)前編譯生成的指定目錄。進(jìn)而class文件讀取單元可以根據(jù)當(dāng)前編譯生成的指定目錄所指示的編譯時(shí)間,查找目標(biāo)指定目錄,并讀取得到該目標(biāo)指定目錄中存儲的多個class文件,該多個class文件即為當(dāng)前編譯之前任一次編譯生成的多個class文件,該目標(biāo)指定目錄的名稱所指示的編譯時(shí)間在當(dāng)前編譯時(shí)間之前。
本發(fā)明實(shí)施例中,為了確定當(dāng)前編譯生成的多個class文件中哪些成員函數(shù)發(fā)生了代碼變更,可以對當(dāng)前編譯生成的多個class文件和當(dāng)前編譯之前任一次編譯生成的多個class文件進(jìn)行差異分析。而為了便于該差異分析,可以分別根據(jù)當(dāng)前編譯生成的多個class文件和當(dāng)前編譯之前任一次編譯生成的多個class文件,生成樹狀結(jié)構(gòu)的第一元數(shù)據(jù)集和第二元數(shù)據(jù)集。參見圖4,圖4是本發(fā)明實(shí)施例提供的一種樹狀結(jié)構(gòu)的元數(shù)據(jù)集的示意圖,該元數(shù)據(jù)集的最上一層是目錄節(jié)點(diǎn),下一層是多個class節(jié)點(diǎn),再下一層是每個class節(jié)點(diǎn)包括的多個method節(jié)點(diǎn)。
其中,第一元數(shù)據(jù)集中的每個class節(jié)點(diǎn)對應(yīng)當(dāng)前編譯生成的一個class文件,第二元數(shù)據(jù)集中的每個class節(jié)點(diǎn)對應(yīng)當(dāng)前編譯之前任一次編譯生成的一個class文件。由于元數(shù)據(jù)集為樹狀結(jié)構(gòu)的組織形式,可以清楚地區(qū)分每個class節(jié)點(diǎn)以及每個class節(jié)點(diǎn)下的method節(jié)點(diǎn),因而通過該第一元數(shù)據(jù)集和第二元數(shù)據(jù)集,可以方便測試用例篩選單元對當(dāng)前編譯生成的多個class節(jié)點(diǎn)和當(dāng)前編譯之前任一次編譯生成的多個class節(jié)點(diǎn)進(jìn)行差異分析,也即對當(dāng)前編譯生成的多個class文件和當(dāng)前編譯之前任一次編譯生成的多個class文件進(jìn)行差異分析。
本發(fā)明實(shí)施例中,該第一元數(shù)據(jù)集和第二元數(shù)據(jù)集的生成過程可以包括以下步驟a至d:
a、解析當(dāng)前編譯生成的多個class文件,得到當(dāng)前編譯生成的多個class文件的名稱和摘要信息、以及每個class文件包含的多個成員函數(shù)的名稱和字節(jié)碼序列。
本發(fā)明實(shí)施例中,由于每次編譯生成的class文件分別存儲在各個指定目錄中,因此,class文件讀取單元可以讀取當(dāng)前編譯生成的指定目錄,得到當(dāng)前編譯生成的多個class文件,再由class文件解析單元按照java虛擬機(jī)的規(guī)范,解析該多個class文件,得到該多個class文件的相關(guān)信息,包括該多個class文件的名稱和摘要信息、以及每個class文件包含的多個成員函數(shù)的名稱和字節(jié)碼序列。
需要說明的是,class文件讀取單元讀取當(dāng)前編譯生成的指定目錄,還可以得到當(dāng)前編譯生成的指定目錄的名稱。
b、基于當(dāng)前編譯生成的多個class文件的名稱和摘要信息,構(gòu)成當(dāng)前編譯生成的多個class節(jié)點(diǎn),對于當(dāng)前編譯生成的每個class文件,基于該class文件包含的多個成員函數(shù)的名稱和字節(jié)碼序列,構(gòu)成當(dāng)前編譯生成的多個method節(jié)點(diǎn),并將該多個method節(jié)點(diǎn)作為該class文件對應(yīng)的class節(jié)點(diǎn)的子節(jié)點(diǎn),每個class節(jié)點(diǎn)對應(yīng)一個class文件,每個method節(jié)點(diǎn)對應(yīng)一個成員函數(shù)。
本發(fā)明實(shí)施例中,class文件解析單元通過上述步驟a解析得到當(dāng)前編譯生成的多個class文件的名稱和摘要信息等文件信息后,可以基于該文件信息,構(gòu)成第一元數(shù)據(jù)集中的多個class節(jié)點(diǎn)。當(dāng)然,class文件解析單元通過上述步驟a解析得到每個class文件包含的多個成員函數(shù)的名稱和字節(jié)碼序列等成員函數(shù)信息后,可以基于該成員函數(shù)信息,構(gòu)成每個class節(jié)點(diǎn)下的多個method節(jié)點(diǎn)。
其中,每個class節(jié)點(diǎn)包含該class節(jié)點(diǎn)的名稱(即該class節(jié)點(diǎn)對應(yīng)的class文件的名稱)、摘要信息(如md5信息)以及該class節(jié)點(diǎn)下的多個成員函數(shù)(即該class節(jié)點(diǎn)下的多個method節(jié)點(diǎn)對應(yīng)的成員函數(shù))。每個method節(jié)點(diǎn)包含該method節(jié)點(diǎn)的名稱(即該method節(jié)點(diǎn)對應(yīng)的成員函數(shù)的名稱)和字節(jié)碼序列(如code屬性的字節(jié)碼序列code[code_length])。
需要說明的是,class文件解析單元還可以基于步驟a得到的當(dāng)前編譯生成的指定目錄的名稱,構(gòu)成第一元數(shù)據(jù)集中的目錄節(jié)點(diǎn),該目錄節(jié)點(diǎn)包括目錄節(jié)點(diǎn)的名稱(即當(dāng)前編譯生成的指定目錄的名稱)。
為了提高查詢效率,上述圖4中樹狀結(jié)構(gòu)的元數(shù)據(jù)集可以采用hashmap進(jìn)行存儲,格式如下:
通過步驟a至步驟b可以得到當(dāng)前編譯生成的多個class節(jié)點(diǎn)以及每個class節(jié)點(diǎn)下的多個method節(jié)點(diǎn),即生成第一元數(shù)據(jù)集。
c、解析當(dāng)前編譯之前任一次編譯生成的多個class文件,得到當(dāng)前編譯之前任一次編譯生成的多個class文件的名稱和摘要信息、以及每個class文件包含的多個成員函數(shù)的名稱和字節(jié)碼序列。
d、基于當(dāng)前編譯之前任一次編譯生成的多個class文件的名稱和摘要信息,構(gòu)成當(dāng)前編譯之前任一次編譯生成的多個class節(jié)點(diǎn),對于當(dāng)前編譯之前任一次編譯生成的每個class文件,基于該class文件包含的多個成員函數(shù)的名稱和字節(jié)碼序列,構(gòu)成當(dāng)前編譯之前任一次編譯生成的多個method節(jié)點(diǎn),并將當(dāng)前編譯之前任一次編譯生成的多個method節(jié)點(diǎn)作為該class文件對應(yīng)的class節(jié)點(diǎn)的子節(jié)點(diǎn)。
與步驟a至步驟b同理,通過步驟c至步驟d可以得到當(dāng)前編譯之前任一次編譯生成的多個class節(jié)點(diǎn)以及每個class節(jié)點(diǎn)下的多個method節(jié)點(diǎn),即生成第二元數(shù)據(jù)集。
需要說明的是,本發(fā)明實(shí)施例是以先生成第一元數(shù)據(jù)集(即執(zhí)行步驟a至步驟b),再生成第二元數(shù)據(jù)集(即執(zhí)行步驟c至步驟d)為例進(jìn)行說明,實(shí)際上,也可以先生成第二元數(shù)據(jù)集,再生成第一元數(shù)據(jù)集,本發(fā)明實(shí)施例對此不做限定。
通過步驟301至步驟302生成第一元數(shù)據(jù)集和第二元數(shù)據(jù)集后,測試用例篩選單元可以對樹狀結(jié)構(gòu)的第一元數(shù)據(jù)集和第二元數(shù)據(jù)集進(jìn)行差異分析,即對第一元數(shù)據(jù)集中的多個class節(jié)點(diǎn)和第二元數(shù)據(jù)集中的多個class節(jié)點(diǎn)進(jìn)行差異分析,以獲取代碼發(fā)生變更的成員函數(shù)。該差異分析的過程將在后續(xù)步驟303至步驟304中進(jìn)行說明。
303、對于第一元數(shù)據(jù)集中的每個class節(jié)點(diǎn),讀取該class節(jié)點(diǎn)的名稱,在第二元數(shù)據(jù)集中查找目標(biāo)class節(jié)點(diǎn),目標(biāo)class節(jié)點(diǎn)與該class節(jié)點(diǎn)的名稱相同,如果查找不到目標(biāo)class節(jié)點(diǎn),則將該class節(jié)點(diǎn)下所有成員函數(shù)的變更屬性標(biāo)記為第一屬性,該第一屬性用于指示發(fā)生代碼變更,如果查找到目標(biāo)class節(jié)點(diǎn),則執(zhí)行步驟304。
本發(fā)明實(shí)施例中,由于第一元數(shù)據(jù)集中包括多個class節(jié)點(diǎn),每個class節(jié)點(diǎn)下有多個method節(jié)點(diǎn),而每個method節(jié)點(diǎn)對應(yīng)一個成員函數(shù),為了確定當(dāng)前編譯生成的多個class文件中哪些成員函數(shù)發(fā)生了代碼變更,可以對該多個class節(jié)點(diǎn)依次進(jìn)行分析。
對于第一元數(shù)據(jù)集中的每個class節(jié)點(diǎn),以class節(jié)點(diǎn)1為例,測試用例篩選單元可以在第二元數(shù)據(jù)集中查找與該class節(jié)點(diǎn)1同名的目標(biāo)class節(jié)點(diǎn),如果在第二元數(shù)據(jù)集中查找不到該目標(biāo)class節(jié)點(diǎn),則說明該class節(jié)點(diǎn)1是當(dāng)前編譯生成的全新class節(jié)點(diǎn),即該class節(jié)點(diǎn)1下的所有成員函數(shù)均發(fā)生了代碼變更。此時(shí),測試用例篩選單元可以將該class節(jié)點(diǎn)下所有成員函數(shù)的變更屬性標(biāo)記為第一屬性(如true)。以class節(jié)點(diǎn)1包括成員函數(shù)a和成員函數(shù)b為例,可以標(biāo)記成員函數(shù)a和成員函數(shù)b的變更屬性為true。通過第一屬性對代碼發(fā)生變更的成員函數(shù)進(jìn)行標(biāo)記,可以便于后續(xù)獲取對這些成員函數(shù)的確認(rèn)和獲取。
而如果在第二元數(shù)據(jù)集中查找到目標(biāo)class節(jié)點(diǎn),則說明該class節(jié)點(diǎn)1下至少有一個成員函數(shù)未發(fā)生代碼變更。此時(shí),測試用例篩選單元可以通過執(zhí)行步驟304,進(jìn)一步對該class節(jié)點(diǎn)1進(jìn)行分析,以確定代碼變更的情況。
304、如果查找到目標(biāo)class節(jié)點(diǎn),則比較該class節(jié)點(diǎn)的摘要信息和目標(biāo)class節(jié)點(diǎn)的摘要信息是否相同,如果相同,將該class節(jié)點(diǎn)下所有成員函數(shù)的變更屬性標(biāo)記為第二屬性,該第二屬性用于指示未發(fā)生代碼變更,如果不同,則對該class節(jié)點(diǎn)下的method節(jié)點(diǎn)和目標(biāo)class節(jié)點(diǎn)下的method節(jié)點(diǎn)進(jìn)行差異分析。
本發(fā)明實(shí)施例中,測試用例篩選單元在確定第二元數(shù)據(jù)集中存在與class節(jié)點(diǎn)1同名的目標(biāo)class節(jié)點(diǎn)后,可以比較該class節(jié)點(diǎn)1包含的摘要信息和目標(biāo)class節(jié)點(diǎn)包含的摘要信息是否相同,如果相同,說明該class節(jié)點(diǎn)1與該目標(biāo)class節(jié)點(diǎn)完全相同,也即說明該class節(jié)點(diǎn)1下的所有成員函數(shù)均未發(fā)生代碼變更。此時(shí),測試用例篩選單元可以將該class節(jié)點(diǎn)下所有成員函數(shù)的變更屬性標(biāo)記為第二屬性(如false)。以class節(jié)點(diǎn)1包括成員函數(shù)a和成員函數(shù)b為例,可以標(biāo)記成員函數(shù)a和成員函數(shù)b的變更屬性為false。
而如果該class節(jié)點(diǎn)1包含的摘要信息和目標(biāo)class節(jié)點(diǎn)包含的摘要信息不同,則說明該class節(jié)點(diǎn)1下至少有一個成員函數(shù)發(fā)生了代碼變更。此時(shí),測試用例篩選單元可以進(jìn)一步對該class節(jié)點(diǎn)1下的所有method節(jié)點(diǎn)進(jìn)行分析,以確定是哪些成員函數(shù)發(fā)生了代碼變更。
本發(fā)明實(shí)施例中,對該class節(jié)點(diǎn)1下的method節(jié)點(diǎn)和該目標(biāo)class節(jié)點(diǎn)下的method節(jié)點(diǎn)進(jìn)行差異分析的過程可以包括以下步驟a至b:
a、對于該class節(jié)點(diǎn)1下的每個method節(jié)點(diǎn),讀取該method節(jié)點(diǎn)的名稱,在該第二元數(shù)據(jù)集中查找目標(biāo)method節(jié)點(diǎn),該目標(biāo)method節(jié)點(diǎn)與該method節(jié)點(diǎn)的名稱相同;如果查找不到該目標(biāo)method節(jié)點(diǎn),則將該method節(jié)點(diǎn)對應(yīng)的成員函數(shù)的變更屬性標(biāo)記為該第一屬性;
本發(fā)明實(shí)施例中,由于每個class節(jié)點(diǎn)下有多個method節(jié)點(diǎn),而每個method節(jié)點(diǎn)對應(yīng)一個成員函數(shù),為了確定該class節(jié)點(diǎn)1下哪些成員函數(shù)發(fā)生了代碼變更,可以對該class節(jié)點(diǎn)1下的多個method節(jié)點(diǎn)依次進(jìn)行分析。
對于該class節(jié)點(diǎn)1下的每個method節(jié)點(diǎn),以method節(jié)點(diǎn)1為例,測試用例篩選單元可以在第二元數(shù)據(jù)集中查找與該method節(jié)點(diǎn)1同名的目標(biāo)method節(jié)點(diǎn),如果在第二元數(shù)據(jù)集中查找不到該目標(biāo)method節(jié)點(diǎn),則說明該method節(jié)點(diǎn)1對應(yīng)的成員函數(shù)發(fā)生了代碼變更。此時(shí),測試用例篩選單元可以將該method節(jié)點(diǎn)1對應(yīng)的成員函數(shù)的變更屬性標(biāo)記為第一屬性(如true)。以該method節(jié)點(diǎn)1對應(yīng)成員函數(shù)a為例,可以標(biāo)記成員函數(shù)a的變更屬性為true。
而如果在第二元數(shù)據(jù)集中查找到目標(biāo)method節(jié)點(diǎn),則說明該method節(jié)點(diǎn)1對應(yīng)的成員函數(shù)有可能發(fā)生了代碼變更。此時(shí),測試用例篩選單元可以通過執(zhí)行步驟b,進(jìn)一步確定該method節(jié)點(diǎn)1對應(yīng)的成員函數(shù)是否發(fā)生了代碼變更。
b、如果查找到該目標(biāo)method節(jié)點(diǎn),則根據(jù)該method節(jié)點(diǎn)的字節(jié)碼序列和該目標(biāo)method節(jié)點(diǎn)的字節(jié)碼序列,計(jì)算萊文斯坦距離,如果該萊文斯坦距離大于或者等于預(yù)設(shè)門限值,則將該method節(jié)點(diǎn)對應(yīng)的成員函數(shù)的變更屬性標(biāo)記為該第一屬性,如果該萊文斯坦距離小于預(yù)設(shè)門限值,則將該method節(jié)點(diǎn)對應(yīng)的成員函數(shù)的變更屬性標(biāo)記為該第二屬性。
本發(fā)明實(shí)施例中,萊文斯坦距離可以用于衡量兩個字節(jié)碼序列之間的相似度。測試用例篩選單元在確定第二元數(shù)據(jù)集中存在與method節(jié)點(diǎn)1同名的目標(biāo)method節(jié)點(diǎn)后,可以按照指定算法,計(jì)算method節(jié)點(diǎn)1的字節(jié)碼序列和目標(biāo)method節(jié)點(diǎn)的字節(jié)碼序列之間的萊文斯坦距離d。
如果d大于或者等于預(yù)設(shè)門限值,則說明method節(jié)點(diǎn)1的字節(jié)碼序列和目標(biāo)method節(jié)點(diǎn)的字節(jié)碼序列之間相似度較低,可以認(rèn)為該method節(jié)點(diǎn)1對應(yīng)的成員函數(shù)發(fā)生了代碼變更。此情況下,測試用例篩選單元可以將該method節(jié)點(diǎn)1對應(yīng)的成員函數(shù)的變更屬性標(biāo)記為第一屬性(如true)。
而如果d小于預(yù)設(shè)門限值,則說明method節(jié)點(diǎn)1的字節(jié)碼序列和目標(biāo)method節(jié)點(diǎn)的字節(jié)碼序列之間相似度較高,可以認(rèn)為該method節(jié)點(diǎn)1對應(yīng)的成員函數(shù)未發(fā)生代碼變更,此情況下,測試用例篩選單元可以將該method節(jié)點(diǎn)1對應(yīng)的成員函數(shù)的變更屬性標(biāo)記為第二屬性(如false)。
需要說明的是,步驟a至步驟b是以class節(jié)點(diǎn)1下的method節(jié)點(diǎn)1為例,對該method節(jié)點(diǎn)1進(jìn)行代碼變更分析的過程。本發(fā)明實(shí)施例中,測試用例篩選單元需要對class節(jié)點(diǎn)1下的每個method節(jié)點(diǎn)均進(jìn)行代碼變更分析,即執(zhí)行步驟a至步驟b,直至該class節(jié)點(diǎn)1下的多個method節(jié)點(diǎn)全部遍歷,才完成對該class節(jié)點(diǎn)1進(jìn)行代碼變更分析的過程。
步驟303至步驟304是對第一元數(shù)據(jù)集和第二元數(shù)據(jù)集進(jìn)行差異分析的過程。為了體現(xiàn)每個class節(jié)點(diǎn)的具體分析過程,在上述步驟中,以第一元數(shù)據(jù)集中的class節(jié)點(diǎn)1為例,對該class節(jié)點(diǎn)1的分析過程進(jìn)行了說明,該第一元數(shù)據(jù)集中其他節(jié)點(diǎn)的分析過程與該class節(jié)點(diǎn)1的分析過程同理。測試用例篩選單元需要對第一元數(shù)據(jù)集中的每個class節(jié)點(diǎn)均進(jìn)行分析,即執(zhí)行步驟303至步驟304,直至第一元數(shù)據(jù)集中的多個class節(jié)點(diǎn)全部遍歷后,再執(zhí)行后續(xù)步驟305。由于每個class節(jié)點(diǎn)下包括多個成員函數(shù),通過遍歷第一元數(shù)據(jù)集中的所有class節(jié)點(diǎn),可以獲取當(dāng)前編譯生成的多個class節(jié)點(diǎn)中代碼發(fā)生變更的所有成員函數(shù)。
需要說明的是,步驟303至步驟304的差異分析過程只是本發(fā)明實(shí)施例的一個示例,當(dāng)然,還可以通過其他方式實(shí)現(xiàn)對第一元數(shù)據(jù)集中的class節(jié)點(diǎn)和第二元數(shù)據(jù)集中的class節(jié)點(diǎn)進(jìn)行差異分析的過程,本發(fā)明實(shí)施例對此不做限定。
305、將當(dāng)前編譯生成的多個class節(jié)點(diǎn)中變更屬性標(biāo)記為第一屬性的所有成員函數(shù),獲取為代碼發(fā)生變更的多個成員函數(shù),并基于與該多個成員函數(shù)一一對應(yīng)的測試用例生成的測試用例集進(jìn)行測試。
本發(fā)明實(shí)施例中,測試用例篩選單元通過上述步驟303至步驟304,對該第一元數(shù)據(jù)集中的class節(jié)點(diǎn)和該第二元數(shù)據(jù)集中的class節(jié)點(diǎn)進(jìn)行了差異分析,并用第一屬性對代碼發(fā)生變更的成員函數(shù)進(jìn)行了標(biāo)記。因此,測試用例篩選單元可以將用第一屬性標(biāo)記的所有成員函數(shù),獲取為代碼發(fā)生變更的多個成員函數(shù)。
在一種可能實(shí)現(xiàn)方式中,該測試用例集的生成過程可以包括:對于該代碼發(fā)生變更的多個成員函數(shù)中的每個成員函數(shù),根據(jù)該成員函數(shù)和指定調(diào)用關(guān)系,從測試用例庫中篩選出目標(biāo)測試用例,該目標(biāo)測試用例為調(diào)用該成員函數(shù)進(jìn)行測試的測試用例;將該多個成員函數(shù)的目標(biāo)測試用例獲取為該測試用例集。
例如,測試用例篩選單元可以存儲有該指定調(diào)用關(guān)系,用于指示成員函數(shù)與調(diào)用該成員函數(shù)進(jìn)行測試的測試用例之間的對應(yīng)關(guān)系。測試用例篩選單元可以根據(jù)該指定調(diào)用關(guān)系和該代碼發(fā)生變更的多個成員函數(shù),確定多個目標(biāo)測試用例,然后從測試用例庫中獲取這些目標(biāo)測試用例,并將這些目標(biāo)測試用例作為該測試用例集,然后執(zhí)行這些測試用例以完成測試。
需要說明的是,上述實(shí)現(xiàn)方式是以指定調(diào)用關(guān)系和測試用例分開存儲為例進(jìn)行說明,實(shí)際上,該指定調(diào)用關(guān)系和測試用例也可以對應(yīng)存儲在測試用例庫中。相應(yīng)地,對于代碼發(fā)生變更的每個成員函數(shù),測試用例篩選單元可以直接從測試用例庫中獲取到與該成員函數(shù)對應(yīng)的測試用例。
參見圖5,為了更清楚地體現(xiàn)本發(fā)明實(shí)施例提供的測試方法,采用圖5所示的流程圖,體現(xiàn)上述步驟301至步驟305的全部過程,圖5中的內(nèi)容均在上述步驟301至步驟305中進(jìn)行了說明,在此不做贅述。
本發(fā)明實(shí)施例提供的方法,通過對第一元數(shù)據(jù)集中的class節(jié)點(diǎn)和第二元數(shù)據(jù)集中的class節(jié)點(diǎn)進(jìn)行差異分析,來獲取代碼發(fā)生變更的多個成員函數(shù),進(jìn)而針對該多個成員函數(shù),獲取與該多個成員函數(shù)一一對應(yīng)的測試用例,并根據(jù)這些測試用例生成測試用例集進(jìn)行測試。上述技術(shù)方案可以精確地反映出哪些成員函數(shù)發(fā)生了代碼變更,根據(jù)這些成員函數(shù)選取的測試用例針對性強(qiáng),可以實(shí)現(xiàn)成員函數(shù)級別的針對性測試,提高了測試效率。
圖6是本發(fā)明實(shí)施例提供的一種基于代碼變更分析的測試裝置的結(jié)構(gòu)示意圖。參照圖6,該裝置包括生成模塊601、分析模塊602和測試模塊603:
生成模塊601,用于根據(jù)當(dāng)前編譯生成的多個類class文件和當(dāng)前編譯之前任一次編譯生成的多個class文件,分別生成樹狀結(jié)構(gòu)的第一元數(shù)據(jù)集和第二元數(shù)據(jù)集,該兩個元數(shù)據(jù)集均包括多個class節(jié)點(diǎn),及所述多個class節(jié)點(diǎn)下的多個method節(jié)點(diǎn),每個class節(jié)點(diǎn)對應(yīng)一個class文件,每個method節(jié)點(diǎn)對應(yīng)一個成員函數(shù);
分析模塊602,用于以該第一元數(shù)據(jù)集和該第二元數(shù)據(jù)集的差異分析,獲取代碼發(fā)生變更的多個成員函數(shù);
測試模塊603,用于基于與該多個成員函數(shù)一一對應(yīng)的測試用例生成的測試用例集進(jìn)行測試。
可選地,參見圖7,該分析模塊602包括:
查找子模塊,用于對于該第一元數(shù)據(jù)集中的任一class節(jié)點(diǎn),讀取該class節(jié)點(diǎn)的名稱,在該第二元數(shù)據(jù)集中查找目標(biāo)class節(jié)點(diǎn),該目標(biāo)class節(jié)點(diǎn)與該class節(jié)點(diǎn)的名稱相同;
標(biāo)記子模塊,用于如果查找不到該目標(biāo)class節(jié)點(diǎn),則將該class節(jié)點(diǎn)下所有成員函數(shù)的變更屬性標(biāo)記為第一屬性,該第一屬性用于指示發(fā)生代碼變更。
可選地,該查找子模塊,還用于如果查找到該目標(biāo)class節(jié)點(diǎn),且該class節(jié)點(diǎn)的摘要信息和該目標(biāo)class節(jié)點(diǎn)的摘要信息相同,則對于該class節(jié)點(diǎn)下的每個method節(jié)點(diǎn),讀取該method節(jié)點(diǎn)的名稱,在該第二元數(shù)據(jù)集中查找目標(biāo)method節(jié)點(diǎn),該目標(biāo)method節(jié)點(diǎn)與該method節(jié)點(diǎn)的名稱相同;
標(biāo)記子模塊,還用于如果查找不到該目標(biāo)method節(jié)點(diǎn),則將該method節(jié)點(diǎn)對應(yīng)的方法的變更屬性標(biāo)記為該第一屬性。
可選地,參見圖8,該分析模塊602還包括計(jì)算子模塊:
該計(jì)算子模塊,用于如果查找到該目標(biāo)method節(jié)點(diǎn),則根據(jù)該method節(jié)點(diǎn)的字節(jié)碼序列和該目標(biāo)method節(jié)點(diǎn)的字節(jié)碼序列,計(jì)算萊文斯坦距離;
如果該萊文斯坦距離大于或者等于預(yù)設(shè)門限值,則將該method節(jié)點(diǎn)對應(yīng)的方法的變更屬性標(biāo)記為該第一屬性;
如果該萊文斯坦距離小于預(yù)設(shè)門限值,則將該method節(jié)點(diǎn)對應(yīng)的方法的變更屬性標(biāo)記為該第二屬性。
本發(fā)明實(shí)施例中,通過對第一元數(shù)據(jù)集中的class節(jié)點(diǎn)和第二元數(shù)據(jù)集中的class節(jié)點(diǎn)進(jìn)行差異分析,來獲取代碼發(fā)生變更的多個成員函數(shù),進(jìn)而針對該多個成員函數(shù),獲取與該多個成員函數(shù)一一對應(yīng)的測試用例,并根據(jù)這些測試用例生成測試用例集進(jìn)行測試。上述技術(shù)方案可以精確地反映出哪些成員函數(shù)發(fā)生了代碼變更,根據(jù)這些成員函數(shù)選取的測試用例針對性強(qiáng),可以實(shí)現(xiàn)成員函數(shù)級別的針對性測試,提高了測試效率。
需要說明的是:上述實(shí)施例提供的基于代碼變更分析的測試裝置在基于代碼變更分析的測試時(shí),僅以上述各功能模塊的劃分進(jìn)行舉例說明,實(shí)際應(yīng)用中,可以根據(jù)需要而將上述功能分配由不同的功能模塊完成,即將設(shè)備的內(nèi)部結(jié)構(gòu)劃分成不同的功能模塊,以完成以上描述的全部或者部分功能。另外,上述實(shí)施例提供的基于代碼變更分析的測試裝置與基于代碼變更分析的測試方法實(shí)施例屬于同一構(gòu)思,其具體實(shí)現(xiàn)過程詳見方法實(shí)施例,這里不再贅述。
圖9是本發(fā)明實(shí)施例提供的一種基于代碼變更分析的測試裝置900的框圖。參照圖9,裝置900包括處理組件9001,其進(jìn)一步包括一個或多個處理器,以及由存儲器9002所代表的存儲器資源,用于存儲可由處理組件9001的執(zhí)行的指令,例如應(yīng)用程序。存儲器9002中存儲的應(yīng)用程序可以包括一個或一個以上的每一個對應(yīng)于一組指令的模塊。此外,處理組件9001被配置為執(zhí)行指令,以執(zhí)行上述基于代碼變更分析的測試方法。
裝置900還可以包括一個電源組件9003被配置為執(zhí)行裝置900的電源管理,一個有線或無線網(wǎng)絡(luò)接口9004被配置為將裝置900連接到網(wǎng)絡(luò),和一個輸入輸出(i/o)接口9005。裝置900可以操作基于存儲在存儲器9002的操作系統(tǒng),例如windowsservertm,macosxtm,unixtm,linuxtm,freebsdtm或類似。
本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述實(shí)施例的全部或部分步驟可以通過硬件來完成,也可以通過程序來指令相關(guān)的硬件完成,所述的程序可以存儲于一種計(jì)算機(jī)可讀存儲介質(zhì)中,上述提到的存儲介質(zhì)可以是只讀存儲器,磁盤或光盤等。
以上所述僅為本發(fā)明的較佳實(shí)施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。