軟體測試第三次作業_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表格
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
三:專案設計
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的單元測試,利用白盒測試法,在已經知道所測試的檔案的內容,以及程式碼結構的基礎上來進行的測試,主要是測試基本功能是否得到了實現以及一些邏輯分支是否正確,面對錯誤的邊界值等,程式的主要處理方式。