一種Java卡代碼覆蓋率分析方法和裝置制造方法
【專利摘要】本發(fā)明提供一種分析Java卡Java代碼(含Java卡平臺和應用)覆蓋率的方法和裝置。提供的方法包括:對class文件插入標記覆蓋的字節(jié)碼,其中覆蓋標記數(shù)據(jù)為Native數(shù)據(jù)存儲在JCVM中,在不違背JCVM規(guī)范的前提下對Java卡Converter進行調(diào)整,卡模擬器運行過程中覆蓋標記數(shù)據(jù)存儲了代碼的運行情況,測試結(jié)束后JCVM按一定格式輸出覆蓋標記數(shù)據(jù),分析class文件并和該數(shù)據(jù)對應,即可得到覆蓋率百分比。提供的系統(tǒng)以Eclipse插件和Ant任務兩種形式與用戶交互。該方法在Java卡上使用字節(jié)碼插樁技術(shù),對JCVM的代碼和速度影響小,支持不帶源碼分析,支持語句覆蓋和分支覆蓋。
【專利說明】一種Java卡代碼覆蓋率分析方法和裝置
【技術(shù)領域】
[0001]本發(fā)明涉及智能卡領域,具體說明一種Java卡代碼覆蓋率分析方法和裝置。
【背景技術(shù)】
[0002]代碼覆蓋率統(tǒng)計技術(shù)包括兩大類,一類是通過Java虛擬機對代碼運行進行跟蹤記錄,一類是對源代碼或者字節(jié)碼即class文件進行插樁(Instrumentat1n),在關(guān)鍵位置插入代碼或字節(jié)碼,用于記錄是否被運行到(參見附圖3)。對class文件插樁的方法無需使用源代碼,適用于無法得到源代碼的情況。
[0003]目前針對PC上的Java有較多商用和開源代碼覆蓋率分析工具,而針對Java卡的代碼覆蓋率分析工具則很少。Java卡針對資源有限的設備,使用Java卡虛擬機,在PC上編譯得到的class文件字節(jié)碼需要通過Java卡Converter轉(zhuǎn)換之后使用。無法直接利用現(xiàn)有的代碼覆蓋率工具。
[0004]目前國內(nèi)使用代碼覆蓋率統(tǒng)計技術(shù)中第一類在Java虛擬機中跟蹤代碼運行的技術(shù)對Java卡代碼覆蓋率工具進行了實現(xiàn)(參見碩士學位論文《JAVA卡代碼覆蓋率數(shù)據(jù)源機制的研究與計算》,作者張淋淋,((Java卡代碼覆蓋率度量技術(shù)的研究與實現(xiàn)》,作者趙攀峰),該方案需要在Java卡虛擬機(JCVM)中做大量工作,包括對運行時在每一條指令處做判斷,根據(jù)CAP包內(nèi)容對字節(jié)碼控制流進行分析,將運行記錄和類中具體字節(jié)碼、代碼行位置進行對應。JCVM中需要增加較大代碼空間,同時JCVM運行時進行字節(jié)碼分析和判斷也會降低執(zhí)行速度。
【發(fā)明內(nèi)容】
[0005]本發(fā)明在Java卡上使用Instrumentat1n代碼覆蓋率統(tǒng)計技術(shù),在class文件中插入覆蓋率統(tǒng)計所需字節(jié)碼,class插樁和class的解析都可在PC上做,減輕JCVM的代碼空間負擔,并且插入字節(jié)碼只在特定位置對覆蓋標記數(shù)據(jù)進行賦值,而不需要在每條指令處進行分析和判斷,對速度的影響很小。
[0006]難點在于Java卡虛擬機不在PC上,覆蓋標記記錄無法在PC上存儲,且PC上編譯得到的字節(jié)碼需要Java卡Converter轉(zhuǎn)換后使用,插樁class文件是否能通過Converter的檢查和轉(zhuǎn)換,轉(zhuǎn)換后能否在JCVM上正常運行,插樁內(nèi)容轉(zhuǎn)換后會不會被破壞,以及class文件分析和轉(zhuǎn)換后的覆蓋標記記錄是否還能正確對應等。
[0007]為實現(xiàn)上述發(fā)明目的,本發(fā)明采用的技術(shù)方案步驟如下:
[0008]a.對Java卡class文件插入覆蓋率分析字節(jié)碼,包括對Native方法進行調(diào)用以獲得Native覆蓋標記數(shù)據(jù),每個插樁點在覆蓋標記數(shù)據(jù)相應位置進行標記。由JCVM對覆蓋率數(shù)據(jù)進行存儲。
[0009]b.在不違背JCVM規(guī)范的前提下對Java卡Converter進行部分調(diào)整,使用該Converter對插入字節(jié)碼后的class文件進行轉(zhuǎn)換。以保證插樁后的class文件能通過Converter檢查,并能正常運行和使用。
[0010]C.需要進行覆蓋率統(tǒng)計時如運行測試結(jié)束后,通知JCVM按一定格式輸出各類對應的覆蓋率標記數(shù)據(jù)。
[0011]d.由PC端軟件分析插樁前class文件,和步驟c輸出的覆蓋率標記數(shù)據(jù)對應,步驟a中的class插樁和此時的解析使用同一套class解析代碼,在步驟b的轉(zhuǎn)換過程保證不會丟掉插樁內(nèi)容,故解析時每個樁的位置可和原class對應上。計算可得到語句覆蓋和分支覆蓋結(jié)果,并通過class中debug信息得到對應源代碼每行的覆蓋情況。
[0012]本發(fā)明采用的技術(shù)方案具體操作如下:
[0013]步驟1:對Java源代碼進行編譯,得到class文件;
[0014]步驟2:對class文件插入覆蓋率分析所需字節(jié)碼;
[0015]步驟3:對插樁后class文件進行Java卡字節(jié)碼轉(zhuǎn)換,得到JCA文件;
[0016]步驟4:將JCA文件轉(zhuǎn)換得到mask, c文件;
[0017]步驟5:將mask, c文件置于Java卡虛擬機工程中重新編譯;
[0018]步驟6 Java卡虛擬機工程運行卡模擬器;
[0019]步驟7:運行要檢查測試完備性包含的測試;
[0020]步驟8:通知JCVM輸出覆蓋率標記數(shù)據(jù);
[0021]步驟9:輸出覆蓋率統(tǒng)計報告。
[0022]在技術(shù)方案步驟a中,通過class文件字節(jié)碼運行控制流分析,在每個指令塊(同一塊中字節(jié)碼要么都被執(zhí)行要么都不被執(zhí)行)中插樁,在相應位置進行標記,如將布爾數(shù)組對應元素置I。插樁位置和內(nèi)容根據(jù)Java卡虛擬機規(guī)范限制做調(diào)整,插樁實現(xiàn)上需要注意一些細節(jié),如:
[0023]JCVM對〈clinit〉中的字節(jié)碼有嚴格限制,故對〈clinit〉方法的插樁做調(diào)整。
[0024]JCVM不支持的一些Java特性不能使用,如序列化機制,TRANSIENT關(guān)鍵詞等。
[0025]在步驟b中,對Java卡Converter的檢查和轉(zhuǎn)換流程進行調(diào)整,考慮新插入字節(jié)碼的影響(根據(jù)Java卡版本不同對應虛擬機規(guī)范以及Converter不同,實現(xiàn)可能略有變化),如:
[0026]調(diào)整Converter中嚴格的檢查,新插入的變量沒有對應行號不需要調(diào)試信息,故需調(diào)整Converter的檢查,如將error改為warning。
[0027]Converter中進行指令轉(zhuǎn)換時,會獲取class中局部變量表內(nèi)容計算局部變量的startpc,需調(diào)整計算方法,考慮插樁字節(jié)碼的長度。
[0028]通過以上方案,本發(fā)明提供了完整的Java卡的Instrumentat1n覆蓋率分析方法,并且在實施例中分別和Eclipse與Ant結(jié)合,可極大地方便Java卡開發(fā)項目通過代碼覆蓋率評價測試覆蓋程度及檢查冗余代碼。
【專利附圖】
【附圖說明】
[0029]圖1是根據(jù)本發(fā)明中Java卡Java代碼覆蓋率分析方法實現(xiàn)的Eclipse環(huán)境下的覆蓋率分析系統(tǒng)。
[0030]圖2是根據(jù)本發(fā)明中Java卡Java代碼覆蓋率分析系統(tǒng)提供的Ant任務編寫的build, xml的任務流程,完成從編譯到測試到輸出覆蓋率報告的完整過程。
[0031]圖3是本發(fā)明使用了的Java代碼Instrumentat1n插樁技術(shù),該圖來源于((EclEmma on JaCoCo》,Marc R.Hoffmann, 28.03.2012,其中 probearray 在本發(fā)明中使用了JCVM中的Native數(shù)據(jù)。
【具體實施方式】
[0032]以下結(jié)合實施例及附圖作進一步的詳細說明。
[0033]本發(fā)明提供一種以Eclipse插件形式和用戶交互的覆蓋率分析系統(tǒng),參見圖1,包括如下裝置:
[0034]裝置A:Eclipse插件:提供圖形用戶界面,包括源代碼editor中不同顏色高亮顯示是否覆蓋,覆蓋率View顯示覆蓋統(tǒng)計百分比等,以及類似于Eclipse中“run”和“debug”的另一種“ Coverage ”工程啟動方式。
[0035]裝置B:覆蓋率分析代理:該系統(tǒng)的核心部分,實現(xiàn)對class的插樁,class文件分析,輸出覆蓋率統(tǒng)計結(jié)果等,并提供覆蓋率分析操作的各種Ant任務,如對class文件插樁“instrument”,通知JCVM輸出覆蓋率數(shù)據(jù)“ jcexport”,獲得覆蓋率統(tǒng)計報告“import”。
[0036]裝置C JCVM:提供Native方法,存儲每個類的覆蓋率標記結(jié)果于Native數(shù)據(jù)中,在收到通知消息后按約定格式輸出各類對應的覆蓋率標記數(shù)據(jù)。
[0037]裝置D:Java卡Converter:將java編譯得到的class文件按Java卡虛擬機規(guī)范要求轉(zhuǎn)換后提供給Java卡使用,根據(jù)覆蓋率插入字節(jié)碼內(nèi)容對Converter的檢查和計算流程做相應調(diào)整。
[0038]使用該系統(tǒng)用戶在Eclipse上的Java卡代碼開發(fā)環(huán)境下操作即可,操作流程簡單,參見圖1,包括以下步驟:
[0039]前期準備Java卡開發(fā)人員在原有構(gòu)建過程中加入插樁任務,進行字節(jié)碼轉(zhuǎn)換,在JCVM中重新編譯后得到覆蓋率分析插樁之后的Java卡模擬器。將模擬器交由需要進行覆蓋率統(tǒng)計的人員進行統(tǒng)計。以下步驟中User step I和User step 2順序可交換。
[0040]User step 1:將 Java 卡 Java 代碼工程以 “Coverage” 方式啟動。
[0041]User step 2:運行卡模擬器,對卡模擬器運行測試。
[0042]User step 3:在Eclipse中停止“Coverage”方式運行,或者點擊“dump”按鈕臨時查看當前結(jié)果,都可在Eclipse的界面中看到覆蓋率分析統(tǒng)計結(jié)果,如果有源代碼可在Editor中看到每行代碼不同顏色顯示覆蓋、未覆蓋、部分覆蓋,并且在Coverage View顯示覆蓋率百分比情況。
[0043]該系統(tǒng)還提供了覆蓋率分析操作所需的各Ant任務,用戶只需將Java卡代碼編譯、覆蓋率插樁、Converter轉(zhuǎn)換、運行測試、通知輸出覆蓋率數(shù)據(jù)、得到覆蓋率報告等任務寫在build, xml中,可一次Ant執(zhí)行則完成所有的構(gòu)建、測試并得到覆蓋率報告。參見圖2,具體步驟如下:
[0044]步驟21:調(diào)用Java提供的Ant任務對Java源代碼進行編譯,得到class文件。
[0045]步驟22:調(diào)用本發(fā)明系統(tǒng)提供的Ant任務“ instrument”,對class文件插入覆蓋率分析所需字節(jié)碼。
[0046]步驟23:調(diào)用Java卡開發(fā)工具套件提供的Ant任務“Convert”,使用本發(fā)明修改后的Converter,對插樁后class文件進行Java卡字節(jié)碼轉(zhuǎn)換,得到JCA文件。
[0047]步驟24:調(diào)用Java卡開發(fā)工具套件提供的Ant任務“Maskgen”,將JCA文件轉(zhuǎn)換得到mask, c文件。
[0048]步驟25:將mask, c文件置于JCVM工程中進行編譯。因C開發(fā)IDE如VS Stud1會提供本地命令,Ant可對本地命令進行調(diào)用,故可在build, xml中編寫調(diào)用本地命令的任務。
[0049]步驟26 JCVM工程運行卡模擬器,該步驟類似于步驟25,可在Ant中調(diào)用本地命令。
[0050]步驟27:運行要檢查測試完備性包含的測試,如JUnit測試,測試工具的測試等,JUnit測試提供了 Ant任務,測試工具測試根據(jù)情況可使用其提供的本地命令。
[0051]步驟28:調(diào)用本發(fā)明系統(tǒng)提供的Ant任務“jcexport”,通知JCVM輸出覆蓋標記數(shù)據(jù)。
[0052]步驟29:調(diào)用本發(fā)明系統(tǒng)提供的Ant任務“r印ort”,輸出覆蓋率統(tǒng)計報告。
[0053]上述步驟包括了從Java編譯、覆蓋率分析插樁、Java卡模擬器運行、測試、輸出覆蓋率報告的全過程,整個過程可在一個Ant流程中完成,用戶一次操作即可走完所有步驟得到覆蓋率統(tǒng)計報告,可極大地方便項目中進行回歸測試并統(tǒng)計覆蓋率,在項目的開發(fā)階段和測試階段都可提高效率。
[0054]從上述兩個實施例來看,根據(jù)本發(fā)明提供的Java卡Java代碼覆蓋率分析方法實施的系統(tǒng),可和代碼開發(fā)環(huán)境Eclipse緊密結(jié)合,也可使用Ant自動執(zhí)行所需的各任務,實用性強、靈活性高。
[0055]本發(fā)明提供的Java卡Java代碼覆蓋率分析方法也不只局限于上述兩個實施例,可根據(jù)本發(fā)明提供的方法應用到其它實施例中。因此,任何熟悉本【技術(shù)領域】的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應涵蓋在本發(fā)明的保護范圍之內(nèi)。
【權(quán)利要求】
1.一種分析Java卡代碼覆蓋率的裝置,包括Eclipse插件模塊、覆蓋率分析代理模塊、Java卡虛擬機和Java卡轉(zhuǎn)換器,其中: Eclipse插件模塊提供圖形用戶界面; 覆蓋率分析代理模塊實現(xiàn)對class的插樁,class文件分析,輸出覆蓋率統(tǒng)計結(jié)果,并提供覆蓋率分析操作的各種Ant任務; Java卡虛擬機提供Native數(shù)據(jù)結(jié)構(gòu),存儲每個類的覆蓋標記數(shù)據(jù)于Native數(shù)據(jù)中,提供Native方法,供插入字節(jié)碼調(diào)用以獲得Native數(shù)據(jù),在收到通知消息后按約定格式輸出各類對應的覆蓋標記數(shù)據(jù); Java卡轉(zhuǎn)換器將java編譯得到的class文件按Java卡虛擬機規(guī)范要求轉(zhuǎn)換后提供給Java卡使用,根據(jù)覆蓋率插入字節(jié)碼內(nèi)容對Java卡轉(zhuǎn)換器的檢查和計算流程做相應調(diào)整。
2.如權(quán)利要求1所述的裝置,其特征在于具體操作步驟如下: 步驟I):在Eclipse插件模塊中對Java源代碼進行編譯,得到class文件; 步驟2):由覆蓋率分析代理模塊在class文件中插入覆蓋率分析所需字節(jié)碼; 步驟3):由Java卡轉(zhuǎn)換器對插入覆蓋率分析所需字節(jié)碼后的class文件進行Java卡字節(jié)碼轉(zhuǎn)換,得到JCA文件; 步驟4):由Java卡轉(zhuǎn)換器將JCA文件轉(zhuǎn)換得到mask, c文件; 步驟5):將mask, c文件置于Java卡虛擬機工程中重新編譯; 步驟6) Java卡虛擬機工程運行Java卡模擬器; 步驟7):運行要檢查測試完備性包含的測試,可以是任何編程語言在任何測試工具中的測試; 步驟8) =Eclipse插件模塊調(diào)用覆蓋率分析代理模塊通知Java卡虛擬機輸出覆蓋標記數(shù)據(jù); 步驟9):由覆蓋率分析代理模塊分析class文件,和覆蓋標記數(shù)據(jù)相對應,輸出覆蓋率統(tǒng)計報告。
3.一種分析Java卡Java代碼覆蓋率的方法,應用于權(quán)利要求1所述的裝置中,包括以下步驟: a.對Java卡class文件插入覆蓋率分析字節(jié)碼,包括對Native方法的調(diào)用以獲得Native覆蓋標記數(shù)據(jù),每個插入點在Native覆蓋標記數(shù)據(jù)相應位置進行標記; b.在不違背Java卡虛擬機規(guī)范的前提下對Java卡轉(zhuǎn)換器進行部分調(diào)整,使用該轉(zhuǎn)換器對插入覆蓋率分析字節(jié)碼后的class文件進行轉(zhuǎn)換; c.需要進行覆蓋率統(tǒng)計時,通知Java卡虛擬機按一定格式輸出各類對應的覆蓋標記數(shù)據(jù); d.分析class文件并和覆蓋標記數(shù)據(jù)對應,計算得到覆蓋率百分比,通過class文件中debug信息可得到對應源代碼每行的覆蓋情況。
4.如權(quán)利要求3所述的方法,其特征在于步驟a進一步包括: 1)插入的覆蓋率分析字節(jié)碼通過調(diào)用Native方法獲得可存儲所有插入點標記數(shù)據(jù)的Native數(shù)據(jù)結(jié)構(gòu); 2)通過class文件字節(jié)碼運行控制流分析,在每個順序指令塊中插入覆蓋率分析字節(jié)碼,將覆蓋標記數(shù)據(jù)相應位置進行標記。 3)插入覆蓋率分析字節(jié)碼范圍和內(nèi)容根據(jù)Java卡虛擬機規(guī)范限制做調(diào)整。
5.如權(quán)利要求3所述的方法,其特征在于步驟c中,PC端覆蓋率分析工具和Java卡虛擬機工程進行通訊,每次需要獲得覆蓋率數(shù)據(jù)時發(fā)送消息給Java卡虛擬機,Java卡虛擬機按約定的格式輸出各類對應的覆蓋標記數(shù)據(jù)。
6.如權(quán)利要求3所述的方法,其特征在于步驟d中,由PC端覆蓋率分析工具分析插入覆蓋率分析字節(jié)碼前的class文件,和Java卡虛擬機輸出的覆蓋率標記數(shù)據(jù)對應。
【文檔編號】G06F11/36GK104375932SQ201410427514
【公開日】2015年2月25日 申請日期:2014年8月27日 優(yōu)先權(quán)日:2014年8月27日
【發(fā)明者】巫瑞 申請人:北京中電華大電子設計有限責任公司