软件质量与测试第4周小组作业:WordCountPro
一 github地址
https://github.com/Hare-Lucius/WordCountPro
二 PSP表格
|
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
|
Planning |
计划 |
20 |
10 |
|
· Estimate |
· 估计这个任务需要多少时间 |
20 |
10 |
|
Development |
开发 |
260 |
305 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
20 |
20 |
|
· Design Spec |
· 生成设计文档 |
20 |
20 |
|
· Design Review |
· 设计复审 (和同事审核设计文档) |
30 |
20 |
|
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
20 |
20 |
|
· Design |
· 具体设计 |
15 |
15 |
|
· Coding |
· 具体编码 |
60 |
75 |
|
· Code Review |
· 代码复审 |
15 |
15 |
|
· Test |
· 测试(自我测试,修改代码,提交修改) |
80 |
120 |
|
Reporting |
报告 |
60 |
60 |
|
· Test Report |
· 测试报告 |
25 |
30 |
|
· Size Measurement |
· 计算工作量 |
15 |
10 |
|
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
20 |
20 |
|
|
合计 |
340 |
365
|
三 接口实现
我主要负责项目的输出功能:
通过output类自定义的构造函数传入单词名和数量,再通过out方法输出结果到工程目录下的wordcountPro.txt,同时具备检查空白单词和检查单词统计错误的功能。
public class Output {
private String[] name;
private int[] num;
private int length=0;
public Output(String[] name,int[] num)//构造函数,初始化输出数组
{
this.name=name;
this.num=num;
}
public void out() throws IOException{
if(name.length>100) length=100;//如果输出数组长度大于100,取前100组输出
else if(name.length==0) //如果名字数组长度为0,则没有统计到单词
{
System.out.println("没有统计到单词");
}
else length=name.length ;
if(name.length!=num.length)
{
System.out.println("单词数量统计错误");
}
System.setOut(new PrintStream(new BufferedOutputStream(new FileOutputStream("wordcountPro.txt")),true));
for(int i=0;i<length;i++)
{
if(num[i]<=0)
{
System.setOut(new PrintStream(new BufferedOutputStream(
new FileOutputStream(FileDescriptor.out)),true));
System.out.println("单词数量统计错误");
}
System.out.println(name[i]+" "+num[i]);
}
}
}
四 测试用例设计
代码中涉及到了几个判定,因此可以用白盒测试的判定/条件覆盖方法对判定分支进行完整覆盖,同时也使测试具有很高的语句覆盖度。
而又有与书本输出存在上限100,,又可以通过黑盒测试的边界值测试方法进行测试。
通过这个边界值又可以把输出情况划分为几个等价类,再通过等价类测试对代码再进行测试(虽然和白盒测试的测试用例有所重复)。
因此可以设计如下测试用例:

五 单元测试
使用junit4框架对代码进行测试,通过执行情况返回不同的返回值。根据返回值判断代码是否按照预计情况执行。测试的用例则用前面设计的20个用例即可。
单元测试的运行截图:

20个测试用例全部通过,说明被测模块可靠性很高。由于用的是前面设计的测试用例,因此测试按照了黑盒方法和白盒方法共同去验证,所以测试的完备性也很高。
六 小组贡献分
负责输出和图形界面的代码编写:0.32
七 扩展任务-静态测试
1 采用阿里巴巴java开发手册代码格式的前9点强制要求进行评审,评审代码作者为17065,代码如下:
public class check_input {
public static void checkInput(String[] args){
String inputFile = null;
if(args.length==0)
{
System.out.println("请输入待分析的文件名!!");
}
if(args.length>1)
{
System.out.println("该程序一次只能分析一个文件,请注意参数数量!!");
}
else
{
inputFile = args[0];
if(!inputFile.endsWith(".txt"))
{
System.out.println("该程序只能扫描txt文件!!");
}
else{
File txtFile=new File(inputFile);
if(!txtFile.exists())
{
System.out.println("文件不存在!!");
}
else
{
return inputFile;
}
}
}
}
}
依照这9点强制要求,以上代码有如下不规范之处:
(1) 右大括号后还有else等代码应该不换行。
(2) if与括号之间没有加空格。
(3) 部分二目运算符的左右两边没有加一个空格。
(4)部分缩进未采用4个空格缩进。
满足了以下几点:(1)左大括号前不换行,左大括号后换行,右大括号前换行。
(2)左小括号和字符之间不出现空格;同样,右小括号和字符之间也不出现空格。
(3)注释的双斜线与内容之间有且仅一个空格。
(4)单行字符数限不超过 120 个。
(5)方法参数在定义和传入时,多个参数逗号后边加空格。
(6)IDE的text file encoding设置为UTF-8; IDE中文件的换行符使用Unix格式。
2 采用"阿里巴巴Java开发代码检测IDE插件"作为静态代码检查工具(下载地址:https://github.com/alibaba/p3c/tree/master/eclipse-plugin),扫描代码,主要错误截图如下(乱码是字符编码问题):


此处的错误统计是小组成员所有的错误我编写的output类出现的错误有:
(1)if语句没有使用大括号
(2)类没有添加创建者信息
(3)未定义的常量出现在代码
3优化后的代码如下
package wcPro;
import java.io.*;
public class Output{ //author:xuhao
private String[] name = {};
private int[] num = {};
private int length = 0;
private int record = 0;
public Output(String[] name,int[] num, int record){
this.record = record+1;
this.name = name;
this.num = num;
}
public void out() throws IOException{
if (record > 100)
{
record = 100;
}
else if (record == 0) {
System.out.println("没有统计到单词");
}
System.setOut(new PrintStream(new BufferedOutputStream(new FileOutputStream("output.txt")),true));
for (int i = 0;i < record;i++){
if (num[i] < 0) {
System.setOut(new PrintStream(new BufferedOutputStream(new FileOutputStream(FileDescriptor.out)),true));
System.out.println("单词数量统计错误");
}
System.out.println(name[i] + " " + num[i]);
}
}
}
重新运行单元测试,结果如下
与先前相比,无明显差异,因为静态检查只能检查出代码的格式问题,不能对代码进行优化,所以不能提高代码运行效率。
八 高级任务-性能测试和优化
(1)性能测试
随机产生数字,再整除26,得到0-25的整数,将这些整数映射到a-z得到字符。使用20000字符,40000字符,80000字符,160000字符,640000字符(大小为59kb,118kb,235kb,469kb,1875kb)作为测试用例,多次测试,取平均结果,测试结果如下:
20000字符 63ms
40000字符 94ms
80000字符 140ms
160000字符 250ms
640000字符 874ms
可以发现随着字符数增加,时间也随着增加,两者成一定的线性关系
(2)同行评审
小组成员及分工:U201517065 徐豪 记录员,主持人
U201517062 练志东 评审员 U201517044 陆犇圆 作者,讲解员
评审目的:优化代码性能
评审结论:1 每次运行时间存在差异,主要原因可能是系统其他进程的影响,这种影响一般不大,但偶尔会出现使结果较大波动的问题。
2 占据运行时间的最大因素是统计单词列表(因为循环量很大),而在其中判断语句又耗费了比较多的时间,因此如果要提高性能,精简判断语句是比较有效的方法。
3对于单词的输入输出部分,以及对单词频率的排序,由于没有过多判断而且循环长度不大,因此对性能影响不大。
通过测试,当把不同部分代码修改或注释后(但不修改循环长度),可以发现如果减少统计单词频率循环内的判定,性能有很大的提升;而对其他地方的修改,性能没有明显变化,评审结论第二,三点得到了验证。
(3)软件开发、软件测试、软件质量之间的关系:没有软件开发就没有测试,测试和开发是保证软件质量的重要手段,因此在开发的过程中必须时常测试,以保证软件的高质量。
九 图形界面
图形界面如下:

点击浏览选择文件,点击确认执行“统计txt文件,并将结果输出到指定txt“的过程
十 参考文献
(1)https://blog.csdn.net/jav_zhangwei/article/details/76546226 Java中打印输出到文件
浙公网安备 33010602011771号