第2周个人作业:WordCount
github地址
https://github.com/HastingsX/SoftwareTest
PSP表格
PSP2.1 | PSP阶段 | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 1 |
· Estimate | · 估计这个任务需要多少时间 | 10 | 1 |
Development | 开发 | 730 | 890 |
· Analysis | · 需求分析 (包括学习新技术) | 60 | 60 |
· Design Spec | · 生成设计文档 | 20 | 30 |
· Design Review | · 设计复审 (和同事审核设计文档) | 10 | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
· Design | · 具体设计 | 30 | 60 |
· Coding | · 具体编码 | 480 | 540 |
· Code Review | · 代码复审 | 60 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 120 |
Reporting | 报告 | 120 | 150 |
· Test Report | · 测试报告 | 100 | 120 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 10 | 20 |
合计 | 860 | 1050 |
解题思路
先读取在命令行输入的参数来判断进行哪些操作,通过循环和if语句得到相关信息,然后将文件内的字符数、单词数、行数、代码行/空行/注释行一并统计出来,根据参数选择性输出到结果文档内。
查阅资料:
- java main方法参数传递(http://blog.csdn.net/docuxu/article/details/73604038)
- Java实现词频统计(Wordcount)-Map或Hashtable的value排序 (http://blog.csdn.net/qy20115549/article/details/52784926)
- Java一次读取文本文件所有内容(http://www.cnblogs.com/longronglang/p/7458027.html)
- String使用equals和==比较的区别(http://blog.csdn.net/andyzhaojianhui/article/details/75176807)
- Java-IO之BufferedWriter(字符缓冲输出流)(http://blog.csdn.net/qq924862077/article/details/52740488)
- Java获取文件后缀名(http://www.cnblogs.com/henuyuxiang/p/7485834.html)
- Java使用递归找出某目录下的所有子目录以及子文件(http://www.cnblogs.com/wangtianze/p/6690644.html)
- java获取指定文件夹下的所有文件名 (http://blog.csdn.net/aa8568849/article/details/52670133)
程序设计实现过程
一个类(Main类),三个函数(main函数,getAllFilePaths函数和scan函数)。
main函数首先先通过读入参数判断要进行哪些操作,统计是否要用到停用词表,统计结果是否有指定的输出文件名,然后判断是对一个文件进行统计还是利用getAllFilePaths函数对一个目录下符合条件的文件进行统计,这些都通过if语句来判断分别进行不同的操作,把要统计的文件名或路径存入一个String数组,通过循环依次对指定的文件使用scan函数进行统计,将统计结果合成一个字符串(String),一次性写入到结果文件中。
在完成基本功能字符统计,单词数统计,行数统计后git推送一次;完成扩展功能递归处理目录下符合条件的文件,返回代码行、空行、注释行,采用停用词表进行统计后git推送一次,后为完善功能,修复bugs而推送多次。
代码数码
scan方法中将文件按行读入,分行处理。
有关字符统计和单词统计的代码如下:
InputStreamReader isr = new InputStreamReader(new FileInputStream(path));
BufferedReader br = new BufferedReader(isr);
......
String str=null;int flagex=0,j=0;
while((str=br.readLine())!=null){
char[] chars=str.toCharArray();
for( i=0;i<chars.length;i++) {//统计每行字符数并加到字符总数里
numChar++;
}
numChar++;//添上每行最后的换行符
String[] tmp= str.split(" |,");//以空格或英文逗号分隔开每个单词
for(i=0;i<tmp.length;i++){
if(tmp[i].length()!=0){
if(extraList.size()!=0){//假如使用了停用词表
flagex=0;
for(j=0;j<extraList.size();j++) {
if (tmp[i].equals(extraList.get(j))){
flagex = 1;//这个存在于停用词表内,将flagex置1
break;
}
}
if(flagex!=1) {//只统计不在停用词表里的单词
numWord++;
}
}
else{
numWord++;
}
}
}
......
numChar--;//减去最后一行不存在的换行符
与“-s”功能相关的读取目录及子目录下所有文件的代码如下:
//获取当前目录和子目录下所有文件
public static ArrayList<String> getAllFilePaths(File filepath,ArrayList<String> filePaths){
File[] array=filepath.listFiles();
if(array==null)
return filePaths;
for(File f:array){
if(f.isDirectory()){//递归读取子目录下内容
filePaths.add(f.getPath());
getAllFilePaths(f,filePaths);
}
else{
filePaths.add(f.getPath());
}
}
return filePaths;
}
判断行性质的代码因为过长而进行文字说明:假如一行不超过一个可显示字符,则它是空行,假如它有只两个字符且该行是“//”或“/*”,则是注释行,假如它有三个或三个以上字符,假如它是以“{//”或“{/*”或“}//”或“}/*”开头,则他是注释行,剩下的情况都是代码行。
测试设计过程
测试中风险最高的地方在单词数的统计,代码行、空行、注释行的统计,因为这这些地方的代码较为复杂,与其它较为简明的地方相比更易出错。
设计测试用例的思想是是没一个判断语句执行一遍,实现条件覆盖,更进一步,尽量让每一个判断语句在是或否的情况下都执行一遍,实现语句覆盖。
设计10个测试用例。
编写的测试脚本"test.bat"内容如下:
wc.exe -a a.c
wc.exe a.c
wc.exe -c *.c
wc.exe -o
wc.exe a.c -o
wc.exe -s -c -w -l -a *.c -out0.txt
wc.exe -s -c -w -l -a *.c -e b.c -o out1.txt
wc.exe -c -w -l -a a.c out2.txt
wc.exe -c -w -l -a a.c -e b.c -o out3.txt
wc.exe -c -w -l -a a.c -e -o
文件“a.c”内容如下:
a bc a,c,,c ,a
//a
/*a */
/*a b
c
*/
/*
*/
{//
}//
文件”b.c“内容如下:
abc bc ad
这些测试用例基本符合了需求 。
参考文献
- java main方法参数传递(http://blog.csdn.net/docuxu/article/details/73604038)
- Java实现词频统计(Wordcount)-Map或Hashtable的value排序 (http://blog.csdn.net/qy20115549/article/details/52784926)
- Java一次读取文本文件所有内容(http://www.cnblogs.com/longronglang/p/7458027.html)
- String使用equals和==比较的区别(http://blog.csdn.net/andyzhaojianhui/article/details/75176807)
- Java-IO之BufferedWriter(字符缓冲输出流)(http://blog.csdn.net/qq924862077/article/details/52740488)
- Java获取文件后缀名(http://www.cnblogs.com/henuyuxiang/p/7485834.html)
- Java使用递归找出某目录下的所有子目录以及子文件(http://www.cnblogs.com/wangtianze/p/6690644.html)
- java获取指定文件夹下的所有文件名 (http://blog.csdn.net/aa8568849/article/details/52670133)