一種實現覆蓋率測試的系統和方法
2023-08-01 12:06:56 2
專利名稱::一種實現覆蓋率測試的系統和方法
技術領域:
:本發明涉及一種通訊領域的白盒測試技術,尤其涉及的是,一種覆蓋率測試系統和方法。
背景技術:
:白盒測試,也稱結構測試或邏輯驅動測試,是在軟體編碼階段,按照程序內部的結構測試程序,通過測試來檢測產品內部動作是否4安照設計規格說明書的規定正常進行,檢驗程序中的每條通路是否都能按預定要求正確工作。白盒測試是軟體生存周期中一個獨立的,關鍵的階段,代表了規約、設計和編碼的最終檢查,也是保證軟體質量的重要手段。覆蓋率統計是白盒測試中衡量測試用例以及代碼的關鍵指標參數,包括語句覆蓋率、分支覆蓋率、條件覆蓋率、函數覆蓋率,語句覆蓋率=至少被執行一次的語句數量/可執行的語句總數,分支覆蓋率=分支結果被執行的次數/分支結果總數,條件覆蓋率=條件操作數值至少被評價一次的數量/條件操作數值的總數;函數覆蓋率=已覆蓋的函數調用個數/全部函數調用個數。目前的覆蓋率統計的方法是在可執行文件插入監視代碼,即對不同的作業系統用不同的可執行文件找到函數入口插入代碼,在重定位代碼位置後進行統計。對可執行文件植入代碼存在以下問題不同的作業系統必須使用不同的可執行文件,例如,Windows4喿作系統的可執行文件是PE文件(PortableExecutable,可移植的執行體,是Windows作業系統自身所帶的執行體文件格式),對其他系統不適用,如UNIX作業系統、XENIX作業系統、LINUX作業系統中就必須另做該系統相應的可執行文件;而且,可執行文件的文件格式複雜,難以分析;代碼插入後需要重新定位,重新定位難度大。因此,現有技術還存在缺陷,有待於改進和發展。
發明內容本發明解決的技術問題是提供一種實現覆蓋率測試的系統和方法,能夠應用於多種作業系統的實現覆蓋率統計。為解決上述技術問題,本發明採用以下方案一種實現覆蓋率測試的系統,包括與被測模塊連接的原始碼分析器,用於對所述被測模塊進行原始碼分析並統計所述被測模塊中需要測試的指令的總數;與所述被測模塊連接的代碼植入器,用於對所述^L測模塊中需要測試的指令前插入代碼打點程序並對插入代碼打點程序的原始碼進行重新編譯;與所述被測模塊連接的代碼打點模塊,用於記錄代碼打點程序調用次數;與所述原始碼分析器和代碼打點模塊連接的計算模塊,用於計算所述打點程序調用次^t與指令的總數之間的比值並輸出。所述的系統,其中,所述原始碼分析器包括與被測模塊連接的原始碼解析模塊,用於解析原始碼結構;與所述原始碼解析模塊連接的指令分類模塊,用於對所述原始碼中的指令類型進行識別;與所述指令分類模塊連接的指令統計模塊,用於分別統計和存儲每種類型的指令的總數。所述的系統,其中,所述代碼打點模塊包括與所述^皮測才莫塊連接的統計代碼打點模塊,用於記錄所述代碼打點程序的調用次數;與所述統計模塊連接的存儲模塊,用於存儲所述代碼打點程序的調用次數。所述的系統,其中,所述需要測試的指令包括語句指令、分支指令、條件指令、函數指令、路徑指令。本發明還提供一種實現覆蓋率測試的方法,包括以下步驟Sl、分析原始碼、統計需要測試的指令的總數;S2、在所述需要測試的指令前插入代碼打點程序;S3、對插入代碼打點程序的原始碼進行重新編譯;S4、運行代碼打點程序插入後的原始碼,記錄代碼打點程序的調用次數;S5、計算代碼打點程序的調用次數與需要測試的指令的總數的比值並輸出。所述的方法,其中,所述需要測試的指令包括語句指令、分支指令、條件指令、函數指令、路徑指令。所述的方法,其中,所述步驟S1包括Sll、解析原始碼結構;S12、對所述原始碼中的指令類型進行識別;所述類型包括語句指令、分支指令、條件指令、函數指令、路徑指令;S13、按照所述指令的不同類型,分別統計每種類型的指令的總數。本發明所提供的一種實現覆蓋率測試的系統和方法,與現有技術相比,由於是在分析原始碼的基礎上進行覆蓋率的測試,因此可應用於不同的作業系統,提高了兼容性能和實用性能。圖l是本發明實現覆蓋率測試的系統的示意圖;圖2是本發明的系統中的原始碼分析器、代碼植入器和代碼打點模塊的示意圖3是本發明實現覆蓋率測試的方法的流程圖。具體實施例方式下面結合具體實施方式和附圖對本發明作進一步詳細的描述。如圖1所示,本發明提供一種實現覆蓋率測試的系統包括與被測模塊連接的原始碼分析器、代碼植入器和代碼打點模塊,以及與原始碼分析器和代碼打點模塊連接的計算模塊。所述原始碼分析器用於對所述被測模塊進行原始碼分析並統計所述被測模塊中需要測試的指令的總數;按照指令類型的不同,其中分為不同類型指令的分析子模塊,見圖2,其中包括賦值語句分析子模塊,用於分析和統計賦值語句指令的總數;分支分析子模塊,用於分析和統計分支指令的總數;條件分析子模塊,用於分析和統計條件指令的總數;函數分析子模塊,用於分析和統計函數指令的總數;路徑分析子模塊,用於分析和統計路徑指令的總數。所述每個分析子模塊包括與被測模塊連接用於解析原始碼結構的原始碼解析模塊;與所述原始碼解析模塊連接用於對所述原始碼中的指令類型進行識別的指令分類模塊;與所述指令分類模塊連接用於分別統計和存儲每種類型的指令的總數的指令統計模塊。與所述被測模塊連接的代碼植入器,用於對被測模塊中需要測試的指令前插入代碼打點程序並對插入代碼打點程序的原始碼進行重新編譯;其中插入代碼打點程序包括在賦值語句指令前插入賦值語句代碼打點子程序、在分支指令前插入分支代碼打點子程序、在條件指令前插入條件代碼打點子程序、在函數指令前插入函數代碼打點子程序。與所述被測模塊連接的代碼打點模塊,用於記錄代碼打點程序調用次數;按照指令類型的不同,運行重新編譯的原始碼,分別記錄賦值語句代碼打點子程序的調用次數、分支代碼打點子程序的調用次數、條件代碼打點子程序的調用次lt、函數代碼打點子程序的調用次數。所述代碼打點模塊包括與所述被測模塊連接的打點統計模塊,用於記錄所述代碼打點程序的調用次數;與所述統計模塊連接的存儲模塊,用於存儲所述代碼打點程序的調用次數。與所述原始碼分析器和代碼打點模塊連接的計算模塊,用於計算所述打點程序調用次數與指令的總數之間的比值並輸出,按照指令類型的不同,分別進行以下計算用賦值語句代碼打點子程序的調用次數與賦值語句指令的總數的相比計算語句覆蓋率;用分支代碼打點子程序的調用次數與分支指令的總數的相比計算分支覆蓋率;用條件代碼打點子程序的調用次數與條件指令的總數的相比計算條件覆蓋率;用函數代碼打點子程序的調用次數與函數指令的總數的相比計算函數覆蓋率。本發明還提供一種實現覆蓋率測試的方法,如圖3所示,有以下步驟100、分析原代碼、計算需要測試的指令的總數;本步驟包括以下分步驟110、解析原始碼結構;120、對原始碼中的指令類型進行識別;識別指令的類型作為後續步驟的依據;類型包括賦值語句指令、分支指令、條件指令、函數指令、路徑指令。130、按照所述指令的不同類型,分別統計每種類型的指令的總數。包括賦值語句指令總數、分支指令總數、條件指令總數、函數指令總數、路徑指令總數。200、根據分析原始碼的分析結果,按照所述指令的不同類型,分別在每種類型的指令前插入代碼打點程序;包括在賦值語句指令前插入賦值語句代碼打點子程序、在分支指令前插入分支代碼打點子程序、在條件指令前插入條件代碼打點子程序、在函數指令前插入函數代碼打點子程序。300、對插入代碼打點程序的原始碼進行重新編譯;400、運行插入代碼打點程序的原始碼,按照所述指令的不同類型,分別記錄每種類型的指令前插入代碼打點程序的調用次數,例如,賦值語句代碼打點子程序、分支代碼打點子程序、條件代碼打點子程序、函數代碼打點子程序;並且在運行過程中,記錄代碼當前運行文件和運行行數,記錄到日誌文件。500、按照所述指令的不同類型,分別計算代碼打點程序的調用次數與需要測試的指令的總數的比值並輸出。步驟200、300、400可在C語言環境中的實現,例如採用如下程序段:代碼插入原理如以下函數代碼inti=printf(,,Iamhere");void*ptr—源碼經過插裝改造,變為inti=(TestCoverage,printf)(,,Iamhere");void*ptr=&(TestCoverage,printf);其中,TestCoverage是插入的打點函數。藉助C語言的逗號表達式實現插裝,跟據ANSIC規範,逗號表達式的結果值是最後一個表達式的計算值,比如"exprl,exprt2,expr3",這3個表達式依次運算,最後返回值是expr3的計算值。所以,不難看出,運行上述插裝代碼等效於插裝前代碼,只有一點差別,每次printf函數調用前插裝打點函數TestCoverage都被調用一次。藉助C語言的宏替換功能可以讓插裝過程變得很簡單,比如#defineprintf(TestCoverage,printf)inti=printf(,,Iamhere");void*ptr=這樣就完成函數的代碼植入。插入賦值語句代碼打點子程序根據代碼分析結果,對賦值語句的代碼植入和函數相同。如intavr=abs*8/numner;TestCoverage;插入分支代碼打點子程序同理,將if、while、for等控制語句也按如下方式植入改造#defmeif(expr)if((expr)if—TestCoveragel:if一TestCoverage0)植入改造後,插裝進去的打點函數(如if—TestCoverage1、if—TestCoverage0)在相應條件成立時就被執行。插入條件代碼打點子程序對於條件覆蓋統計,改造"&&,,與"||"連接的條件子句,比如下面代碼if(i>0&&i0)&&COND(i<100))printf("OK");這樣不同條件都用調用的不同的代碼打點函數。步驟300:原始碼的重新編譯。步驟400:執行測試程序,代碼打點函數執行,自動生成日誌記錄。代碼打點函悽tTestCoverage實現原理根據ANSIC規範宏—FILE—和—LINE—分別記錄當前代碼的所在原始碼文件名和行數,調用TestCovemge函數時間獲取宏值記錄相關文件中。應當理解的是,以上所提供的具體實施方式只是對本發明的說明,而不應當理解為對本發明的限制,對本領域的普通技術人員來說,可以根據上述說明加以改進或變換,而所有這些改進和變換都應為本發明所揭示的原理和特徵,均屬本發明的保護範圍。權利要求1、一種實現覆蓋率測試的系統,其特徵在於,包括與被測模塊連接的原始碼分析器,用於對所述被測模塊進行原始碼分析並統計所述被測模塊中需要測試的指令的總數;與所述被測模塊連接的代碼植入器,用於對所述被測模塊中需要測試的指令前插入代碼打點程序並對插入代碼打點程序的原始碼進行重新編譯;與所述被測模塊連接的代碼打點模塊,用於記錄代碼打點程序調用次數;與所述原始碼分析器和代碼打點模塊連接的計算模塊,用於計算所述打點程序調用次數與指令的總數之間的比值並輸出。2、根據權利要求1所述的系統,其特徵在於,所述原始碼分析器包括與被測模塊連接的原始碼解析模塊,用於解析原始碼結構;與所述原始碼解析模塊連接的指令分類模塊,用於對所述原始碼中的指令類型進行識別;與所述指令分類模塊連接的指令統計模塊,用於分別統計和存儲每種類型的指令的總數。3、根據權利要求1所述的系統,其特徵在於,所述代碼打點模塊包括與所述被測模塊連接的打點統計模塊,用於記錄所述代碼打點程序的調用次數;與所述統計模塊連接的存儲模塊,用於存儲所述代碼打點程序的調用次數。4、根據權利要求1所述的系統,其特徵在於,所述需要測試的指令包括語句指令、分支指令、條件指令、函數指令、路徑指令。5、一種實現覆蓋率測試的方法,包括以下步驟分析原始碼、統計需要測試的指令的總數;、在所述需要測試的指令前插入代碼打點程序;、對插入代碼打點程序的原始碼進行重新編譯;、運行代碼打點程序插入後的原始碼,記錄代碼打點程序的調用次數;、計算代碼打點程序的調用次數與需要測試的指令的總數的比值並輸出。6、根據權利要求1所述的方法,其特徵在於,所述需要測試的指令包括語句指令、分支指令、條件指令、函數指令、路徑指令。7、根據權利要求1所述的方法,其特徵在於,所述步驟S1包括Sll、解析原始碼結構;.S12、對所述原始碼中的指令類型進行識別;所述類型包括語句指令、分支指令、條件指令、函數指令、路徑指令;S13、按照所述指令的不同類型,分別統計每種類型的指令的總數。全文摘要本發明公開了一種實現覆蓋率測試的系統和方法,應用於多種作業系統實現覆蓋率統計。其系統包括與被測模塊連接的原始碼分析器,用於對所述被測模塊進行原始碼分析並統計所述被測模塊中需要測試的指令的總數;與所述被測模塊連接的代碼植入器,用於對所述被測模塊中需要測試的指令前插入代碼打點程序並對插入代碼打點程序的原始碼進行重新編譯;與所述被測模塊連接的代碼打點模塊,用於記錄代碼打點程序調用次數;與所述原始碼分析器和代碼打點模塊連接的計算模塊,用於計算所述打點程序調用次數與指令的總數之間的比值並輸出。本發明是在分析原始碼的基礎上進行覆蓋率的測試,因此可應用於不同的作業系統,提高了兼容性能和實用性能。文檔編號G06F11/36GK101561777SQ20081006659公開日2009年10月21日申請日期2008年4月14日優先權日2008年4月14日發明者張若冰申請人:中興通訊股份有限公司