1、GitHub地址
https://github.com/RicardoDZX/wcPro
2、PSP表格
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
20 | 20 |
· Estimate |
· 估计这个任务需要多少时间 |
20 | 20 |
Development |
开发 |
150 | 170 |
· Analysis |
· 需求分析 (包括学习新技术) |
30 | 30 |
· Design Spec |
· 生成设计文档 |
0 | 0 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
20 | 20 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10 | 10 |
· Design |
· 具体设计 |
10 | 10 |
· Coding |
· 具体编码 |
30 | 30 |
· Code Review |
· 代码复审 |
20 | 20 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
30 | 50 |
Reporting |
报告 |
60 | 60 |
· Test Report |
· 测试报告 |
30 | 30 |
· Size Measurement |
· 计算工作量 |
10 | 10 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
20 | 20 |
合计 |
230 | 250 |
3、文件输入接口实现
文件输入要实现的功能是识别用户输入的命令是否合法,判断文件是否是txt格式文件以及判断文件是否存在并且能够正常打开,标准输入命令为 wcPro.exe xx.txt(程序在eclipse中编译测试)
设计思路如下:
(1)先由空格将命令拆分成两部分存放在argv[]字符串数组当中;
(2)判断argv[]字符串数组大小是否为2,如果不是则报错"please input the right cmd!"
(3)接着判断argv[0]是否等于"wcPro.exe",如果不是则报错"wcPro.exe erroe input!"
(4)再判断argv[1]中是否包含".",如果不包含则报错"file error input!"
(5)接着由"."对argv[1]进行拆分,结果存放在file[]字符串数组当中,判断file[]的最后一项是不是"txt",如果不是则报错"filetype error input!"
(6)最后根据argv[1]这个文件路径,进行读文件操作,如果读文件失败则报错"error filepath or filename!",如果成功则提示"everything is right!"
if(argv.length == 2){ //argv[0]存储"wcPro.exe",argv[1]存储"需要读取判断的文件名" /*for(;i<argv.length;i++) { System.out.println(argv[i]); }*/ if(argv[0].equals("wcPro.exe")){//检测输入语法正确性 //System.out.println("right input!"); boolean fn=argv[1].contains("."); if(fn) { String[] file = argv[1].split("\\."); //System.out.println(file[1]+"\r\n"+file[2]); if(file[file.length-1].equals("txt")) { //System.out.println("right input!"); pathName = argv[1]; try { File filename = new File(pathName); InputStreamReader reader = new InputStreamReader(new FileInputStream(filename)); BufferedReader br = new BufferedReader(reader); br.close(); //System.out.println("read correct!"); //计算方法函数 //writeFile(content,result);//输出结果文件result.txt System.out.println("every thing is right!"); str[i]="every thing is right!"; i=i+1; }catch (Exception e) { System.out.println("error filepath or filename!"); str[i]="error filepath or filename!"; } } else { System.out.println("filetype error input!"); str[i]="filetype error input!"; } } else { System.out.println("file error input!"); str[i]="file error input!"; } } else { System.out.println("wcPro.exe error input!"); str[i]="wcPro.exe error input!"; } } else { System.out.println("please input the right cmd!"); str[i]="please input the right cmd!"; } }
4、测试用例的设计与Junit的实现
测试用例的设计:
(1)局部测试:
测试main函数中的argv数组是否正常存入了输入的命令并正常按空格拆分,测试argv数组的值是否正常传入readFile函数并正常按空格拆分,测试"wcPro.exe"是否正常判断,测试argv[1]是否正常按"."划分,测试"txt"文件类型是否正常判断。
(2)单元测试:
输入多种格式命令,看实际结果是否和预期结果相同,包括测试输入错误的"wcPro.exe",输入正确文件的相对路径和绝对路径测试,输入错误的文件格式,输入错误的文件路径,输入带其它字符的文件名,输入空的文件名等
测试用例清单如下:
测试用例的实现:
测试用例使用了JAVA的Junit4框架,根据测试清单对其中的10个单元测试设计了测试方法,手动输入命令和预期结果,与实际结果进行比较,验证文件输出部分代码的正确性,以下是部分测试用例的代码与测试用例运行结果,测试全部通过,没有故障或者报错,速度也很快,被测模块质量是合格的。
5、小组贡献度
我完成的文件输入任务比较简单,参与了后面的评审等工作,在小组中的评分是第三,0.24
6、扩展任务:静态测试
代码评审:
我在进行代码评审时参考了邹欣老师在讲义“现代软件工程讲义 3 代码规范与代码复审”中所讨论的有关代码规范与代码复审的内容,分析了我们组罗迪同学17007负责的文件输出代码模块,发现的问题如下:
(1)方法名OutPut最好不要用大写字母开头
(2)用于存放结果的Map变量用了m,用于控制for循环的变量使用了i,不容易看出变量的含义;
(3)注释不够详细,比如for循环的作用和文件具体输出部分没有注释解释
(4)把main函数和方法放在了一起,没有把文件输出功能作为独立的功能模块
(5)没有做错误处理,当出现错误的时候不会抛出提示
静态代码检查:
我使用了PMD静态代码检查工具,下载地址是http://sourceforge.net/projects/pmd/files/pmd-eclipse/update-site/,对自己的代码扫描之后,一共发现了3个警告,警告产生的原因是一个变量声明了但是并没有使用,还有就是使用了简单的变量i。
7、高级任务:性能测试和优化
1. 470KB的txt文档:
经过多次测量取平均值:
排序模块,约耗时:13ms
2.对于1M的文件:
排序时间,经多次测量取平均值。
约26ms(波动较大)
我们认为主要性能制约因素是:词频统计模块。和读取文件,存入map的模块。和读取文件,存入map的模块。因为这涉及到文件的输入流,要逐行读取,分别处理。这就耗费了很大时间,尤其是文件规模很大的情况。
总结:
希望对词频统计和输出进行优化。若难度较大,优化效果不高,则着手排序功能进行优化。