第4周小组作业:WordCount优化

时间:2022-12-20 08:20:06

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 测试结果

运行测试用例的结果如图所示:

第4周小组作业:WordCount优化

被测模块的质量较高,由测试结果可知测试效率较高,但没有检测所有非法字符输入情况,因此测试质量一般。

3 扩展任务

3.1 开发规范说明

项目开发语言是Java,选定《阿里巴巴Java开发手册》作为开发规范。

3.2 交叉代码评审

评审同组成员徐江南的代码,除了发现一处变量命名不符合lowerCamelCase命名风格外,没有发现其它不符合规范的地方。
第4周小组作业:WordCount优化

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

使用扫描工具扫描个人全部代码后运行结果如图所示:

第4周小组作业:WordCount优化

依据扫描结果改进代码后再次运行单元测试,发现结果没有明显区别,可能是模块简单所致,但修改后的代码的可读性的确大为提高。

3.4 组内代码分析

使用扫描工具进行代码检测后发现小组代码存在多处不规范。这些不规范的地方虽然暂时不妨碍项目的正确运行,但它阻碍了其他开发人员阅读代码,让项目的维护变难了。修改过后的代码更符合规范,也更容易找出代码中隐藏的bug。

4 高级任务:性能测试和优化

4.1 测试数据集

考虑到"WcPro.exe"的功能是统计词频,因此用一个12MB的txt文本作为输入,进行测试。

4.2 同行评审过程

由全体组员参与,组员徐江南主持,所有人一同评审小组的全部代码,经过讨论,一致认定在循环内定义变量会增加额外开销。另外,在读取txt内容时只会读取合法字符,对非法字符判断反而会影响效率。

4.3 性能分析与优化

将代码循环内定义的变量外提,删去对非法字符判断等工作后,程序效率大约提升了20%,与同行评审的结论一致。

4.4 作业小结

在软件开发之中,只有自始至终贯彻软件测试,才有可能在项目临近结尾时得到一个过得去的项目成果。

5 小组贡献

经讨论,小组贡献分为0.22