第4周小组作业:WordCount优化
1 GitHub项目地址
https://github.com/JarrySmith/WordCountPro
2 基本任务:代码编写+单元测试
2.1 PSP表格
PSP2.1 | PSP 阶段 | 预估耗时****(分钟) | 实际耗时****(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 15 |
· Estimate | · 估计这个任务需要多少时间 | 10 | 15 |
Development | 开发 | 205 | 315 |
· Analysis | · 需求分析 (包括学习新技术) | 15 | 20 |
· Design Spec | · 生成设计文档 | 10 | 30 |
· Design Review | · 设计复审 (和同事审核设计文档) | 15 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 15 | 30 |
· Design | · 具体设计 | 15 | 10 |
· Coding | · 具体编码 | 60 | 60 |
· Code Review | · 代码复审 | 15 | 15 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 120 |
Reporting | 报告 | 65 | 80 |
· Test Report | · 测试报告 | 45 | 60 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 10 | 10 |
合计 | 280 | 410 |
2.2 接口的实现
在包project中创建输入类InputProcess,其包含方法processInput(),该方法会抛出异常IOException和IllegalArgumentException,该方法输入参数为一个String[]类型字符串数组,返回值为一个String类型字符串。
根据接口定义搭建框架如下:
package project;
public class InputProcess{
public String processInput (String[] args) throws IOException,IllegalArgumentException{
String filePath=null;
//一系列判断args是否符合规范的条件判断语句
......;
return filePath;
}
}
processInput方法仅判断输入参数是否合法,判断传入的文件是否包含非法字符。
通过if语句判断字符串数组args的个数是否为一,args[0]内是否存放合法的文件名,而后按字符读取文件内容,通过对每个字符的ASCII码进行处理来判断文件内的字符是否都是合法字符。
若args不符合规定,或文件内包含非法字符,则抛出异常:
......
throw new IllegalArguementException("参数个数只能为1");
......
throw new IllegalArgumentException("待处理文件不是txt类型");
......
throw new IllegalArgumentException("待处理文件内包含非法字符");
......
2.3 测试用例设计
本项目使用集成开发环境IntelliJ IDEA进行开发,使用junit4测试框架进行测试
根据白盒测试的思想,尽量实现条件覆盖和语句覆盖,设计了编号为1、4、13、15的测试用例,根据黑盒测试的思想设计了其余的测试用例。
因为被测试的模块较为简单,在对测试效率上可以不做特别要求。
测试用例详见GitHub内的测试脚本和测试用例EXCEL表格。
2.4 测试结果
运行测试用例的结果如图所示:
被测模块的质量较高,由测试结果可知测试效率较高,但没有检测所有非法字符输入情况,因此测试质量一般。
3 扩展任务
3.1 开发规范说明
项目开发语言是Java,选定《阿里巴巴Java开发手册》作为开发规范。
3.2 交叉代码评审
评审同组成员徐江南的代码,除了发现一处变量命名不符合lowerCamelCase命名风格外,没有发现其它不符合规范的地方。
3.3 静态代码扫描
使用的扫描工具是“Alibaba Java Coding Guidelines”。
该工具是一个idea插件,其GitHub项目地址:https://github.com/alibaba/p3c/tree/master/idea-plugin
工具的下载地址:https://plugins.jetbrains.com/plugin/10046-alibaba-java-coding-guidelines
使用扫描工具扫描个人全部代码后运行结果如图所示:
依据扫描结果改进代码后再次运行单元测试,发现结果没有明显区别,可能是模块简单所致,但修改后的代码的可读性的确大为提高。
3.4 组内代码分析
使用扫描工具进行代码检测后发现小组代码存在多处不规范。这些不规范的地方虽然暂时不妨碍项目的正确运行,但它阻碍了其他开发人员阅读代码,让项目的维护变难了。修改过后的代码更符合规范,也更容易找出代码中隐藏的bug。
4 高级任务:性能测试和优化
4.1 测试数据集
考虑到"WcPro.exe"的功能是统计词频,因此用一个12MB的txt文本作为输入,进行测试。
4.2 同行评审过程
由全体组员参与,组员徐江南主持,所有人一同评审小组的全部代码,经过讨论,一致认定在循环内定义变量会增加额外开销。另外,在读取txt内容时只会读取合法字符,对非法字符判断反而会影响效率。
4.3 性能分析与优化
将代码循环内定义的变量外提,删去对非法字符判断等工作后,程序效率大约提升了20%,与同行评审的结论一致。
4.4 作业小结
在软件开发之中,只有自始至终贯彻软件测试,才有可能在项目临近结尾时得到一个过得去的项目成果。
5 小组贡献
经讨论,小组贡献分为0.22