wordCount的实现
合作者学号:201631062605, 201631062405
一:本文代码
Github代码下载链接:https://github.com/OuLianhHong00/WordCount
本次作业地址:https://edu.cnblogs.com/campus/xnsy/Test/homework/2203
二:功能概述及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 扩展功能(-a完成)
wc.exe -s //递归处理目录下符合条件的文件
wc.exe -a file.c //返回更复杂的数据(代码行 / 空行 / 注释行)
wc.exe -e stopList.txt // 停用词表,统计文件单词总数时,不统计该表中的单词
[file_name]: 文件或目录名,可以处理一般通配符
2.1.3 高级功能(完成)
wc.exe -x //该参数单独使用,如果命令行有该参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、单词数、行数等全部统计信息。
三:代码设计
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 }
1 //计算行数 2 int countLine(char *file) 3 { 4 FILE *fp; 5 fp=fopen(file,"r"); 6 int lCount=0; 7 char a; 8 if(NULL==fp) 9 { 10 printf("文件为空\n"); 11 }else{ 12 while((a=fgetc(fp))!=EOF){ 13 if(a=='\n') 14 lCount++; 15 } 16 } 17 fclose(fp); 18 printf("文件总行数为:%d\n",lCount); 19 return lCount; 20 }
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 } 29 //代码行 30 int count_codeLine(char *file) 31 { 32 FILE *fp; 33 fp=fopen(file,"r"); 34 int clCount=0; 35 char a; 36 if(NULL==fp) 37 { 38 printf("文件为空\n"); 39 }else{ 40 while((a=fgetc(fp))!=EOF){ 41 if(a==';') 42 clCount++; 43 } 44 } 45 fclose(fp); 46 printf("文件代码行数为:%d\n",clCount); 47 return clCount; 48 } 49 //注释行 50 int count_noteLine(char *file) 51 { 52 FILE *f; 53 int ch_num = 0; 54 int nlCount=0; 55 char ch; 56 f=fopen(file, "r"); 57 if(NULL==(f=fopen(file,"r"))) 58 { 59 printf("文件为空\n"); 60 } 61 else 62 while (!feof(f)) 63 { 64 ch= fgetc(f); 65 if(ch=='\n') 66 { 67 if(ch_num==2) 68 nlCount++; 69 ch_num=0; 70 } 71 else if(ch=='/') 72 ch_num++; 73 else if(ch_num==1) 74 { 75 if(ch=='/') 76 ch_num++; 77 } 78 } 79 fclose(f); 80 printf("文件注释行为:%d\n ",nlCount); 81 return nlCount; 82 }
1 void printFile(char *file,int result,char type){ 2 FILE *wp; 3 if((wp=fopen("outputFile.txt","a"))==NULL){ 4 printf("文件不存在\n\n"); 5 }else{ 6 switch(type){ 7 case 'c': 8 fprintf(wp, "%s文件中字符数有%d", file,result); 9 break; 10 case 'w':fscanf(wp, "%s文件中单词数有%d", file,result); 11 fprintf(wp, "%s文件中单词数有%d", file,result); 12 break; 13 case 'l': 14 fprintf(wp, "%s文件中总行数数有%d", file,result); 15 break; 16 case 'f': 17 fprintf(wp, "%s文件中代码行数有%d", file,result); 18 break; 19 case 'e': 20 fprintf(wp, "%s文件中空行数有%d", file,result); 21 break; 22 case 'g': 23 fprintf(wp, "%s文件中注释数有%d", file,result);break; 24 default:; break; 25 } 26 } 27 fclose(wp); 28 }
1 #include2 #include 3 #include 4 #include<string.h> 5 #include 6 int main(int argc, char* argv[]) 7 { 8 //计算单词数 9 int countWord(char *file); 10 //计算字符数 11 int countChar(char *file); 12 //计算行数 13 int countLine(char *file); 14 //空行 15 int count_blankLine(char *file); 16 //代码行 17 int count_codeLine(char *file); 18 //注释行 19 int count_noteLine(char *file); 20 //递归找符合条件的文件 21 void Scan(char *file, char type); 22 //将内容输出到outputFile.txt文件中 23 void printFile(char *file,int result,char type); 24 int cw=0,cc=0,cl=0,cb=0,ccl=0,cn=0; 25 FILE *fp; 26 char type='c'; 27 while(1==1){ 28 //printf("请输入可执行文件名\n"); 29 //printf("请输入想要进行的操作(-w表示计算单词数 -c表示计算字符数 -l表示计算行数 -a表示计算空行 代码行 注释行 -s表示符合条件的文件数)\n"); 30 //printf("请输入想要操作的文件名\n"); 31 printf("进入可视化界面请输入wc.exe -x\n"); 32 scanf("%s %s",argv[0],argv[1]); 33 if(!strcmp(argv[1],"-x")){ 34 system("D:\\softwaredaima\\c\\WordCount\\wc\\Debug\\wc.exe"); 35 }else{ 36 scanf("%s %s %s",argv[0],argv[1],argv[2]);//argv[0] 可执行程序的文件名argv[1] 指令,argv[2]文件名 37 if((fp=fopen(argv[2],"r"))==NULL){ 38 printf("文件不存在\n\n"); 39 //scanf("%s %s %s",argv[0],argv[1],argv[2]);//argv[0] 可执行程序的文件名argv[1] 指令,argv[2]文件名 40 continue; 41 } 42 else 43 { 44 if(!strcmp(argv[1],"-w"))//判断字符串是否相等 45 { 46 int cw=countWord(argv[2]); 47 48 } 49 if(!strcmp(argv[1],"-c")) 50 { 51 int cc=countChar(argv[2]); 52 53 } 54 if(!strcmp(argv[1],"-l")) 55 { 56 int cl=countLine(argv[2]); 57 58 } 59 if(!strcmp(argv[1],"-a"))//代码、空行、注释 60 { 61 int cb=count_blankLine(argv[2]); 62 int ccl=count_codeLine(argv[2]); 63 int cn=count_noteLine(argv[2]); 64 65 } 66 if(!strcmp(argv[1],"-s"))//递归目录下符合条件的文件 67 { 68 Scan(argv[2],type); 69 } 70 if(!strcmp(argv[1],"-o")) 71 { 72 printFile(argv[2],cw,'w'); 73 printFile(argv[2],cc,'c'); 74 printFile(argv[2],cl,'l'); 75 printFile(argv[2],cb,'e'); 76 printFile(argv[2],ccl,'f'); 77 printFile(argv[2],cn,'g'); 78 } 79 80 81 } 82 83 fclose(fp); 84 } 85 } 86 return 0; 87 }
四:测试用例
等价类划分
输入
读取文件的命令 |
有效等价类
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暂不能使用 |
五:单元执行结果
5.1测试的文件内容:
5.2执行结果
5.3 静态工具测试 cppCheck
六:可视化界面
基于MFC所做
七:优化
7.1测试数据集思路:
选用所有单元测试中的等价类和无效等价类进行进行测试,然后将各模块进行联合测试。
八:总结与收获
经过这次wordCount的测试设计与实现,掌握了等价类划分等测试方法,掌握了cmd 的一系列使用命令,通过与小伙伴一起实现wordCount的测试项目。了解了软件测试对于软件开发的重要性,测试的目的是为了发现尽可能多的缺陷,不是为了说明软件中没有缺陷。本次主要是对wordCount的单元测试,利用白盒测试法,在已经知道所测试的文件的内容,以及代码结构的基础上来进行的测试,主要是测试基本功能是否得到了实现以及一些逻辑分支是否正确,面对错误的边界值等,程序的主要处理方式。