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函数和scan函数)。
main函数首先先通过读入参数判断要进行哪些操作,统计是否要用到停用词表,统计结果是否有指定的输出文件名,然后判断是对一个文件进行统计还是对一个目录下符合条件的文件进行统计,这些都通过if语句来判断分别进行不同的操作,把要统计的文件名或路径存入一个String数组,通过循环依次对指定的文件使用scan函数进行统计,将统计结果合成一个字符串(String),一次性写入到结果文件中。
在完成基本功能字符统计,单词数统计,行数统计后git推送一次;完成扩展功能递归处理目录下符合条件的文件,返回代码行、空行、注释行,采用停用词表进行统计后git推送一次。
代码数码
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++;
}
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++;
}
}
}
......
判断行性质的代码因为过长而进行文字说明:假如一行不超过一个可显示字符,则它是空行,假如它有只两个字符且该行是“//”或“/”,则是注释行,假如它有三个或三个以上字符,假如它是以“{//”或“{/”或“}//”或“}/*”开头,则他是注释行,剩下的情况都是代码行。
测试设计过程
测试中风险最高的地方在单词数的统计,代码行、空行、注释行的统计,因为这这些地方的代码较为复杂,与其它较为简明的地方相比更易出错。
设计测试用例的思想是是没一个判断语句执行一遍,实现条件覆盖,更进一步,尽量让每一个判断语句在是或否的情况下都执行一遍,实现语句覆盖。
设计10个测试用例,如下:
1.命令行
wc.exe -s *.c
文件a.c
a bc,de
?
2.命令行
wc.exe a.c
文件a.c
a bc,de
?
3.命令行
wc.exe -c *.c
文件a.c
a bc,de
?
4.命令行
wc.exe -o
文件a.c
a bc,de
?
5.命令行
wc.exe a.c -o
文件a.c
a bc,de
?
6.命令行
wc.exe -s -c -w -l -a *.c
文件a.c
a bc a,c,,c ,a
//a
/*a */
/*a b
c
*/
/*
*/
{//
}//
文件b.c
a bc a,c,,c ,a
//a
/*a */
/*a b
c
*/
{/*
}*/
{12
}
?
7.命令行
wc.exe -s -c -w -l -a *.c -e b.c -o out.txt
文件a.c
abc aa ad
文件b.c
aa a,b
?
8.命令行
wc.exe -c -w -l -a a.c
文件a.c
a bc a,c,,c ,a
//a
/*a */
/*a b
c
*/
/*
*/
{//
}//
?
9.命令行
wc.exe -c -w -l -a a.c -e b.c -o out.txt
文件a.c
a bc a,c,,c ,a
//a
/*a */
/*a b
c
*/
/*
*/
{//
}//
文件b.c
bc c,a
?
10.命令行
~~~
wc.exe -c -w -l -a D:\IdeaProjects\WordCount1\a.c -e b.c -o out.txt
~~~
//下为文件a.c内容
~~~
a bc a,c,,c ,a
//a
/*a */
/*a b
c
*/
/*
*/
{//
}//
~~~
//下为文件b.c内容
~~~
bc c,a
~~~
这些测试用例基本符合了需求 。
参考文献
- 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)