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

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

定義 plist 內容 alt turn 通配符 得到 遍歷文件夾 and

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的單元測試,利用白盒測試法,在已經知道所測試的文件的內容,以及代碼結構的基礎上來進行的測試,主要是測試基本功能是否得到了實現以及一些邏輯分支是否正確,面對錯誤的邊界值等,程序的主要處理方式。

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