qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          軟件測試實驗學習筆記系列4--CppUnit

          單元覆蓋測試

            覆蓋測試是衡量軟件質量的一個重要的指標,是一種”白合”測試方法,覆蓋的標準有邏輯覆蓋,循環覆蓋,基本路徑覆蓋。其中邏輯測試包括語句覆蓋,判定覆蓋,條件覆蓋,判定/條件覆蓋,條件組合覆蓋和路徑覆蓋。

            覆蓋測試必須擁有程序的規格說明書和程序清單,以程序的內部結構為清單設計測試用例。覆蓋測試主要使用在具有高可靠性要求的軟件領域(軍工企業,航空航天軟件,工業控制軟件).覆蓋測試需要借助一定的工具軟件,工具軟件具有的功能特點:

            分析軟件內部接口,幫助定制覆蓋策略及設計測試用例

            與適當的編譯器結合,對被測軟件實施自動插樁,以便在其運行過程中生成覆蓋信息并收集這些覆蓋信息

            根據收集的覆蓋信息計算覆蓋率(Coverage),幫助測試人員找到未被覆蓋的軟件部分,以改進測試用例,提高覆蓋率

            對主流開發語言的支持,因為對不同的開發語言來說,測試工具的實現的方式和內容差別是較大的。目前測試工具主要支持的開發語言是:標準C,C++,Visual C++,Java等,

            進行動態覆蓋測試的三項任務:1.設計測試用例;2.對被測代碼進行插樁;3.收集覆蓋信息并進行分析。

            2.1覆蓋測試工具介紹

            xUnit基本不支持覆蓋測試(白盒測試中重要的內容)。覆蓋測試工具實現的技術方式和具體的語言是緊耦合的。不同語言使用的覆蓋測試的策略是不一樣的。實例如下:

            Java(EclEmma+JUnit,JCoverage)

            NET(NCover+NUnit)

            CppUnit框架很難提供覆蓋測試的功能,c/c++測試覆蓋測試是通過插樁實現的.C/C++覆蓋測試工具:gcov

            2.2JUnit下的覆蓋工具EclEmma

            時至今日,IT人士更加關注測試的重要性。 測試驅動開發(TDD)被證明是一種能有效提高軟件質量的方法,測試優先原則,EclEmma2006年入圍Eclipse Community Awards Winners 決賽

            2.2.1EclEmma

            Emma是Sourceforge上的開源項目,某種程度上,EclEmma是Emma的圖形開發工具。

            Eclipse,OpenJDK,JUnit,Ant,CVS或者Subversion,Emma -- java開發成套開源的解決方案。

            Emma的同類產品:Coverlipse,Cobertura,Quilt,JCoverage.

            EclEmma的特點:快速的開發和測試周期,非常豐富覆蓋信息分析以及非入侵方式。

            EclEmma:一個封裝Emma覆蓋工具的Eclipse的插件。Eclemma的官方地址:http://sourceforge.net/projects/eclemma

            EclEmma使用不同顏色標識的源代碼測試的情況,綠色-完整執行,紅色-根本沒有執行,黃色-部分被執行,其視圖能夠分層顯示代碼的覆蓋測試率。

            2.2.2EclEmma環境建立

            EclEmma的安裝是就是Eclipse插件的安裝,共有這樣三種方式安裝.

            1.Eclipse自身的Software Update機制.

            選中菜單欄中Help/Install New Softeware,在如下圖中對話框中填入插件的站點的信息。

            本人是在Ubuntu12.04下使用eclipse的,如果是在windows下的話,具體操作可以參考[2]。

            缺點是:當安裝了許多插件之后,eclipse的plugins中會充滿各種舊的或廢棄的插件,不便于更新和管理

            2.蠻力法安裝

            將插件的壓縮包解壓,然后將其中的plugins和features與eclipse安裝包中的同名文件夾合并,這樣就可以在Eclipse中使用新插件。實際上第一個方法自動安裝也是使用的這種方法,只不過由機器自動改成了手動。缺點同上。

           3. links文件

            首先從eclemma官方站點下載最新的eclemmaEclipse插件包:http://sourceforge.net/projects/eclemma/files/?source=navbar

            在eclipse安裝的目錄下新建一個links文件夾,將相應的插件(例如eclemma-2.2.0)包拷貝到links文件夾下,并在links下新建一個eclemma.link空白的文本,在起中寫入:path=/usr/lib/eclipse/links/eclemma-2.2.0 。注意path=xxx是eclemma在系統中的絕對路徑, 由于我使用的Linux系統,在windows下可能是D:\xxx\eclipse\links\eclemma-2.2.0。

            重新啟動一下eclipse就可以看到eclemma被安裝上的標志,最左邊的就是Eclemma的圖標。

            備注: 上面的步驟在windows上已經算是安裝完成了,但是在Ubuntu下好像不太行,至少我自己的實踐表明是這樣的,Ubuntu下還要在加上兩步:

            進入eclemma-2.2.0文件夾中,在其中建立一個eclipse文件夾并將eclemma目錄下其他的文件移到 eclipse目錄下

            進入eclipse目錄,在其中建立一個空的.eclipseextension的隱藏文件(注意"."不可少),并為這個文件加上執行權限。具體的命令如下:

          cd /usr/lib/eclipse/links/eclemma-2.2.0/
          sudo mkdir eclipse
          sudo mv * eclipse/
          cd eclipse/
          vi .eclipseextension
          chmod +x .eclipseextension

            注意命令中是否需要使用sudo提升權限視情況而定, 如果不是類似 /usr/lib這樣的只有root權限才可以操作的目錄的話,就不需要使用sudo。

            2.2.3 EclEmma的使用

            關于Eclemma的使用,網上一堆,不再贅述,推薦一篇文章:

            使用Eclemma進行覆蓋測試:http://www.ibm.com/developerworks/cn/java/j-lo-eclemma/

            2.3C++的覆蓋測試工具gcov

            gcov是GNU/GCC的工具組件,可以C/C++代碼覆蓋率的測試工具,使用便捷,不要配置,不是可視界面,只支持CLI命令行界面.如果要使用可視界面,使用Ggcov。

            2.3.1gcov環境

            gcov是gcc的內部工作組件。利用gcc內部的工具進行代碼插樁。

            2.3.2gcov測試功能及使用流程

            grov的基本功能:可以查看測試時代碼執行的覆蓋率信息,支持函數覆蓋,語句覆蓋和分支覆蓋等覆蓋測試內容,幫助我們分析測試程序中的缺陷。使用該工具還可以查看程序在某個分析執行的頻率,進而分析程序的性能。

            Gcc的覆蓋測試工具gcov,gcov必須和gcc編譯器聯合使用(需要在程序中插樁,參考百度百科程序插樁的解釋)。使用步驟:

            在編譯時加上”-ftest-coverage-fprofile-arcs”,a.out(設置了-o選項就是輸出的文件名)和.gcda文件;

            執行./a.out時,根據源程序的語句,條件,路徑,邊界等因素,以及設計好的輸入測試用例數據 ,執行的信息保存到.gcno和.gcda文件中-->gcov-b xxx.c-->xxx.c.gcov(里面顯示了每條語句執行的次數,沒有執行的語法則以“####”標注)

            注意:使用gcov時,每次重新編譯,統計數據都會清空,所以項目測試必須在確定的版本上進行。

            gcov的其他的選項命令可以查看gcov的在線文檔(man gcov)

          /*Program: testgcov.c -- interpert the workflow of gcov */
           #include<stdio.h>
          int main(){
           printf("Hello,World\n");
          }

           編譯執行:gcc-o testgcov -ftest-coverage -fprofile-arcs testgcov.c

            ./testgcov--->執行程序,各種執行語句將會被寫到testgcov.gcda和testgcov.gcno中

            gcov-b testgcov.c --->testgcov.c.gcov詳細的覆蓋信息

            testgcov.c.gcov 詳細信息:

          -: 0:Source:testgcov.c
          -: 0:Graph:testgcov.gcno
          -: 0:Data:testgcov.gcda
          -: 0:Runs:1
          -: 0:Programs:1
          -: 1:/*Program: testgcov.c -- interpert the workflow of gcov */
          -: 2:#include<stdio.h>
          1: 3:int main(){
          1: 4: printf("Hello,World\n");
          1: 5:}

            注:gcov -b查看分支執行的頻率,-f查看每個函數執行的情況。

            2.3.3gcov覆蓋測試應用舉例

          /*Program:autosell.c -- design the input test case and get the code coverage of program */
          #include<stdio.h>
          void welcome();
          void nochange(int num5coins);
          void getcoin(int *coin);
          void pushbutton(int *button);
          void process(int* coin,int* button,int* num5coins);
          int main(){
           int coin=0,button=0,num5coins=2;
           int i;
           for(i=0;i<10;++i){
            welcome();
            nochange(num5coins);
            getcoin(&coin);
            pushbutton(&button);
            process(&coin,&button,&num5coins);
           }
           return 0;
          }
          void welcome(){
           system("clear");//library function,which 
           printf("welcome to this auto selling machine!\n\n");
          }
          void nochange(int num5coins){
           if(num5coins == 0)
            printf("No change now!\n");
          }
          void getcoin(int* coin){
           int flagredo;
           do{
            printf("Please pitch your coin(5-5角,10-1元):");
            scanf("%d",coin);
            if(*coin!=5 && *coin!=10){
             printf("Wrong coin!Return this coin.\n");
             flagredo=1;
            } else
             flagredo=0;
           }while(flagredo);
          }
          void pushbutton(int *button){
           int flagredo;
           do{
            printf("Please select your drink(1-orange juice,2-beer):");
            scanf("%d",button);
            if(*button!=1 && *button!=2){
             printf("Wrong input,Please re-select.\n");
             flagredo=1;
            } else
             flagredo=0;
           } while(flagredo);
          }
          void process(int* coin,int* button,int* num5coins){
           if(*coin == 10 && *num5coins ==0){
            printf("No change!\n");
             printf("Return 1 yuan coin.\n");
           } else {
            if(*coin == 10){
             if(*button ==1)
              printf("Please take your orange juice.\n");
             else
              printf("Please take you beer\n");
             (*num5coins)--;
             printf("Return 5 jiao coin.\n");
            }
            if(*coin == 5){
             if(*button ==1)
              printf("Please take your orange juice.\n");
             else
              printf("Please take you beer\n");
             (*num5coins)++;
            }
           }
           printf("\nPress Enter to continue");
           getchar();getchar();

           *coin =0;
           *button=0;
          }


           編譯命令:gcc-o autosell -fprofile-arcs -ftest-coverage autosell.c

            執行程序(./autosell)隨便輸入一些測試用例:

            測試結果:

            顯示總體覆蓋率:gcov autosell.c
            File'autosell.c'
            Linesexecuted:94.55% of 55
            Creating'autosell.c.gcov'

            顯示函數覆蓋信息:gcov-f autosell.c
            Function'process'
            Linesexecuted:90.00% of 20
            Function'pushbutton'
            Linesexecuted:100.00% of 9
            Function'getcoin'
            Linesexecuted:100.00% of 9
            Function'nochange'
            Linesexecuted:75.00% of 4
            Function'welcome'
            Linesexecuted:100.00% of 4
            Function'main'
            Linesexecuted:100.00% of 9
            File'autosell.c'
            Linesexecuted:94.55% of 55
            Creating'autosell.c.gcov'

            顯示分支信息:gcov-b autosell.c
            File'autosell.c'
            Linesexecuted:94.55% of 55
            Branchesexecuted:100.00% of 28
            Takenat least once:92.86% of 28
            Callsexecuted:87.50% of 24
            Creating'autosell.c.gcov'

            具體的autosell.c.gcov信息自行查看

            參考資料:

            [1]軟件測試實驗指導教程/蔡建平, 清華大學出版社, 2009.11

            [2]軟件測試學習:測試覆蓋率工具EclEmma安裝與使用:http://liangruijun.blog.51cto.com/3061169/803473

            [3]使用Eclemma進行覆蓋測試:http://www.ibm.com/developerworks/cn/java/j-lo-eclemma/

          相關文章:

          軟件測試實驗學習筆記系列4--CppUnit

          軟件測試實驗學習筆記系列6--圖形界面測試(GUI)



          posted on 2013-08-09 10:42 順其自然EVO 閱讀(430) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2013年8月>
          28293031123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 和平县| 苏州市| 郸城县| 巫山县| 平昌县| 宁海县| 敦煌市| 信丰县| 永仁县| 固安县| 昌邑市| 泌阳县| 讷河市| 潍坊市| 盱眙县| 杭锦旗| 曲沃县| 吴桥县| 昌江| 广河县| 西畴县| 当阳市| 奈曼旗| 红河县| 平邑县| 浮山县| 巴东县| 额尔古纳市| 闸北区| 亚东县| 建瓯市| 阿勒泰市| 茂名市| 元氏县| 新昌县| 台前县| 页游| 阳原县| 南宫市| 西青区| 芜湖市|