第四周小组作业:WordCount优化

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的模块。因为这涉及到文件的输入流,要逐行读取,分别处理。这就耗费了很大时间,尤其是文件规模很大的情况。

总结:

希望对词频统计和输出进行优化。若难度较大,优化效果不高,则着手排序功能进行优化。

 

posted @ 2018-04-08 20:07  tangqiaobao  阅读(147)  评论(1编辑  收藏  举报