1. 程式人生 > >軟體測試第三次作業_wordCount實現

軟體測試第三次作業_wordCount實現

wordCount的實現

       合作者學號:201631062605,歐連紅 201631062405  黃慶

一本文程式碼

  Github程式碼下載連結:https://github.com/OuLianhHong00/WordCount 

二:功能概述及psp:

2.1.1 基本功能(完成)

wc.exe -c file.c     //返回檔案 file.c 的字元數

wc.exe -w file.c     //返回檔案 file.c 的單詞總數

wc.exe -l file.c     //返回檔案 file.c 的總行數

wc.exe -o outputFile.txt     //將結果輸出到指定檔案outputFile.txt

2.1.2 擴充套件功能(未完成)

wc.exe -s            //遞迴處理目錄下符合條件的檔案

wc.exe -a file.c     //返回更復雜的資料(程式碼行 / 空行 / 註釋行)

wc.exe -e stopList.txt  // 停用詞表,統計檔案單詞總數時,不統計該表中的單詞

[file_name]: 檔案或目錄名,可以處理一般萬用字元

2.1.3 高階功能(未完成)

wc.exe -x  //該引數單獨使用,如果命令列有該引數,則程式會顯示圖形介面,使用者可以通過介面選取單個檔案,程式就會顯示檔案的字元數、單詞數、行數等全部統計資訊。

2.1.4psp表格

psp2.1  psp階段

 估計耗時(分鐘)

 實際耗時(分鐘)
Planning  計劃  1h  35min
 · Estimate  · 估計這個任務需要多少時間  2h 90min
Development  開發 2h  180min
 · Analysis  · 需求分析 (包括學習新技術)  3h  50min
 · Design Spec  · 生成設計文件  2h  90min
 · Design Review  · 設計複審 (和同事稽核設計文件)  1h  50min
 · Coding Standard  · 程式碼規範 (為目前的開發制定合適的規範)  0.5h  30min
 · Design  · 具體設計  1h  50min
 · Coding  · 具體編碼  3h  120min
 · Code Review  · 程式碼複審  0.5h  50min
 · Test  · 測試(自我測試,修改程式碼,提交修改)  2h 120min
Reporting  報告  1h 30min
 · Test Report  · 測試報告  0.5h  40min
 · Size Measurement  · 計算工作量  0.1h  50min

 · Postmortem & ProcessImprovement Plan

 · 事後總結, 並提出過程改進計劃  0.2h  25min
   合計  18.8h 890min
 
   

 

三:專案設計

3.1 接受引數

引數的形式有兩種:長選項、短選項,選項間可以組合,長選項用空格隔開各個引數

例: wc.exe --word --charater file.c

短選項可以多個直接疊加或者,也像長選項一樣分開寫

例: wc.exe -wc file.c wc.exe -w -c file.c

 

對於一個命令列程式,它可以接受來自命令列的引數。

c語言的main函式中有兩個引數:int main (int argc, char *argv[]),這兩個引數就是用於這個引數的輸入。

argc 一個整數,代表有多少個命令列引數,在此注意兩個點

1、 引數間是用空格格開的;

2、程式名是第一個引數。

argv[i]是一個指標,指向第i個引數的首地址

理解了以上的兩個引數就簡單了,只需要做一些基本的字串處理就可以了。

3.1.1 -h引數

這個引數單獨說是因為這個引數不能和別的引數混用,所以我在程式裡面是單獨寫的,一開始就判斷是否使用者需要的是help幫助,如果是的話,那麼完全不必要再執行程式(開啟檔案),直接exit中止程序 。

3.1.2 -w -c -l 引數

這三個引數都是一個路數:

1、開啟檔案;

2、判斷要做的操作;

3、執行操作。

它們間只有步驟3是不同的,所以有理由把3寫成不同的函式,再由2判斷執行哪個。

有一些細節問題是可以考慮的。

比如,因為單複數的關係,有一行/個 單詞/字母,應該是不同的表達(是否有s)

額外就是判斷一個單詞的演算法也是值得考慮的問題,我的想法是,如果一個字元,它自己是一個字母,它前面是一個非字母,那麼這就是一個單詞的標緻。

3.1.3 -o 引數

這個引數比較特殊,因為它後面跟了一個檔案,要做的事情是把輸出的內容存到的檔案換成使用者自定義的名字。

總的來說是兩件事情

  • 捕獲使用者輸入的檔案的名字,並建立這個檔案;

  • 把輸出的資訊存進去

 

四:程式碼實現

 1 int main(int argc, char* argv[])//主程式
 2 { 
 3     //計算單詞數
 4     int countWord(char *file);
 5     //計算字元數
 6     int countChar(char *file);
 7     //計算行數
 8     int countLine(char *file);
 9     //空行
10     int count_blankLine(char *file);
11     //程式碼行
12     int count_codeLine(char *file);
13     //註釋行
14     int count_noteLine(char *file);
15     //遞迴找符合條件的檔案
16     void scanFile();
17     //將內容輸出到outputFile.txt檔案中
18     void printFile(char *file,int result,char type);
19     int cw=0,cc=0,cl=0,cb=0,ccl=0,cn=0;
20     FILE *fp;
21 
22     while(1==1){
23         
24         scanf("%s %s %s",argv[0],argv[1],argv[2]);//argv[0] 可執行程式的檔名argv[1] 指令,argv[2]檔名
25         if((fp=fopen(argv[2],"r"))==NULL){
26            printf("檔案不存在\n\n");
27            //scanf("%s %s %s",argv[0],argv[1],argv[2]);//argv[0] 可執行程式的檔名argv[1] 指令,argv[2]檔名
28            continue;
29         }
30         else 
31         {
32            if(!strcmp(argv[1],"-w"))//判斷字串是否相等
33            {
34              int cw=countWord(argv[2]);
35              
36            }
37            if(!strcmp(argv[1],"-c"))
38            {
39            int cc=countChar(argv[2]);
40            
41            }
42           if(!strcmp(argv[1],"-l"))
43           {
44            int cl=countLine(argv[2]);
45            
46           }
47          if(!strcmp(argv[1],"-a"))//程式碼、空行、註釋
48          {
49           int cb=count_blankLine(argv[2]);
50           int ccl=count_codeLine(argv[2]);
51           int cn=count_noteLine(argv[2]);
52           
53          }
54          if(!strcmp(argv[1],"-s"))//遞迴目錄下符合條件的檔案
55          {
56              scanFile();
57          }
58          if(!strcmp(argv[1],"-o"))
59          {
60             printFile(argv[2],cw,'w');
61             printFile(argv[2],cc,'c');
62             printFile(argv[2],cl,'l');
63             printFile(argv[2],cb,'e');
64             printFile(argv[2],ccl,'f');
65             printFile(argv[2],cn,'g');
66          }
67 
68         }
69          
70      fclose(fp);       
71     }
72     return 0;
73 }

 

    

 1     //計算單詞數
 2     int countWord(char *file)
 3     {
 4         FILE *fp;
 5         int wCount=0;
 6         int is_word=0;
 7         char a;
 8         fp=fopen(file,"r");
 9         if(fp==NULL){
10           printf("檔案開啟失敗\n");
11         }else{
12             while(!feof(fp)){
13                 a=fgetc(fp);
14                 if((a>='a'&&a<='z')||(a>='A'&&a<='Z')||a=='_')
15                     is_word=1;
16                 else if(is_word){
17                      wCount++;
18                      is_word=0;
19                 }
20                 }
21             }
22         fclose(fp);
23         printf("該檔案單詞數為:%d\n",wCount);
24         return wCount;
25     }
 1     //計算字元數
 2     int countChar(char *file)
 3     {
 4         FILE *fp;
 5         fp=fopen(file,"r");
 6         char a;
 7         int cCount=0;
 8         if(NULL==fp)
 9         {
10           printf("檔案為空\n");
11         }else{
12             while((a=fgetc(fp))!=EOF){
13                   cCount++;
14             }
15         }
16       fclose(fp);
17        printf("字元數為:%d\n",cCount);
18        return cCount;
19     }
    //計算行數
    int countLine(char *file)
    {
        FILE *fp;
        fp=fopen(file,"r");
        int lCount=0;
        char a;
        if(NULL==fp)
        {
          printf("檔案為空\n");
        }else{
            while((a=fgetc(fp))!=EOF){
              if(a=='\n')
                  lCount++;
            }
        }
        fclose(fp);
       printf("檔案總行數為:%d\n",lCount); 
       return lCount;
    }
 1     //空行
 2     int count_blankLine(char *file)
 3     {
 4        FILE *f;
 5       int blCount= 0;
 6       int ch_num = 0;
 7       char ch;
 8       f = fopen(file, "r");
 9        if(NULL==(f=fopen(file,"r")))
10        {
11        printf("檔案為空");
12        }
13        else
14            while (!feof(f))
15            {
16              ch= fgetc(f);
17              if (ch=='\n'){
18                 if (ch_num<= 1)
19                     blCount++;
20                     ch_num = 0;
21              }
22              else if (ch!=' '&&ch!='\t')
23                     ch_num++;
24            }
25        fclose(f);
26        printf("檔案空行為:%d\n ",blCount);
27        return blCount;
28     }

 

 1     //程式碼行
 2     int count_codeLine(char *file)
 3     {   
 4         FILE *fp;
 5         fp=fopen(file,"r");
 6         int clCount=0;
 7         char a;
 8         if(NULL==fp)
 9         {
10           printf("檔案為空\n");
11         }else{
12             while((a=fgetc(fp))!=EOF){
13                  if(a==';')
14                      clCount++;      
15             }
16         }
17         fclose(fp);
18        printf("檔案程式碼行數為:%d\n",clCount);  
19        return clCount;
20     }

 

 1 //註釋行
 2     int count_noteLine(char *file)
 3     {
 4         FILE *f;
 5         int ch_num = 0;
 6         int nlCount=0;
 7         char ch;
 8         f=fopen(file, "r");
 9         if(NULL==(f=fopen(file,"r")))
10         {
11          printf("檔案為空\n");
12         }
13       else
14          while (!feof(f))
15          {
16               ch= fgetc(f);
17               if(ch=='\n')
18               {
19                   if(ch_num==2) 
20                       nlCount++;
21                       ch_num=0;
22               }
23              else if(ch=='/') 
24                  ch_num++;
25              else if(ch_num==1)
26              {
27                  if(ch=='/') 
28                      ch_num++;
29              } 
30          } 
31        fclose(f);
32        printf("檔案註釋行為:%d\n ",nlCount);
33        return nlCount;
34     }

 

    //遞迴找符合條件的檔案
    void scanFile()
    {
       printf("you");
     
    }
    void printFile(char *file,int result,char type){
      FILE *wp;
      if((wp=fopen("outputFile.txt","a"))==NULL){
           printf("檔案不存在\n\n");
      }else{
          switch(type){
          case 'c':
                  fprintf(wp, "%s檔案中字元數有%d", file,result);
                    break;
          case 'w':fscanf(wp, "%s檔案中單詞數有%d", file,result);
                   fprintf(wp, "%s檔案中單詞數有%d", file,result);
                   break;
          case 'l':
                   fprintf(wp, "%s檔案中總行數數有%d", file,result);
                   break;
          case 'f':
                   fprintf(wp, "%s檔案中程式碼行數有%d", file,result);
                   break;
          case 'e':
                  fprintf(wp, "%s檔案中空行數有%d", file,result);
                  break;
          case 'g':
                   fprintf(wp, "%s檔案中註釋數有%d", file,result);break;
          default:; break;
          }   
      }
     fclose(wp);
    }

 

五:測試用例

等價類劃分

                                                                                                                      


輸入  


 

 讀取檔案的命令

 

 

 

 

 

 

 

 


有效等價類   


 

 

1. -w

 2. -l

3. -c

4.  -w -l -c

5. -w -l

6. -w -c

7 -l -c

8 空


無效等價類


 

9.除了-w -c -l 之外的其餘任何輸入引數

結果寫入引數

 10. -o

11.其他輸入
檔名 12.正確檔名 13 非檔名

基於等價類劃分的測試用例設計:

測試用例 作用
1  wc.exe  -l -w -c test.txt

測試檔案中有多少字元數,行數,單詞數

有效測試

2.wc.exe -c outputFile.txt 測試outputFile.txt字元數
3.wc.exe -w test.txt  測試檔案單詞總數
4.wc.exe -l test.txt  表示返回檔案file.c的總行數,並存儲在result.txt
5wc.exe -o test.txt  表示返回檔案file.c的總行數,並存儲在result.txt
6.wc.exe -l -w -c test.txt -o outputFile.txt, 都覆蓋
7.wc.exe -s test.txt  遍歷資料夾引數
8.wc.exe -l -w  test.txt  遍歷檔案中的字元數,行數
9.wc.exe -w -c  test.txt  遍歷檔案中的行數和單詞數
10. wc.exe -l -c test.txt  遍歷檔案中的字元數和單詞數
注:-s暫不能使用  

 

六:單元執行結果

 6.1測試的檔案內容:

6.2執行結果

 

 

七視覺化介面

 

 

八:優化

8。1測試資料集思路:

    選用所有單元測試中的等價類和無效等價類進行進行測試,然後將各模組進行聯合測試。

  

九:總結與收穫

    經過這次wordCount的測試設計與實現,掌握了等價類劃分等測試方法,掌握了cmd 的一系列使用命令,通過與小夥伴一起實現wordCount的測試專案。瞭解了軟體測試對於軟體開發的重要性,測試的目的是為了發現儘可能多的缺陷,不是為了說明軟體中沒有缺陷。本次主要是對wordCount的單元測試,利用白盒測試法,在已經知道所測試的檔案的內容,以及程式碼結構的基礎上來進行的測試,主要是測試基本功能是否得到了實現以及一些邏輯分支是否正確,面對錯誤的邊界值等,程式的主要處理方式。