基本功能
2、 PSP2.1表格
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
30 |
20 |
· Estimate |
· 估计这个任务需要多少时间 |
30 |
20 |
Development |
开发 |
370 |
470 |
· Analysis |
· 需求分析 (包括学习新技术) |
20 |
20 |
· Design Spec |
· 生成设计文档 |
20 |
20 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
20 |
20 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
20 |
20 |
· Design |
· 具体设计 |
20 |
30 |
· Coding |
· 具体编码 |
120 |
180 |
· Code Review |
· 代码复审 |
20 |
30 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
120 |
150 |
Reporting |
报告 |
90 |
90 |
· Test Report |
· 测试报告 |
30 |
30 |
· Size Measurement |
· 计算工作量 |
30 |
30 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
30 |
|
合计 |
490 |
580 |
3、接口设计:本次WordCountPro我负责的模块是核心处理模块,即对输入模块输入的有效数据(String类文件名)进行接收并对文件内的单词进行词频统计和按照词频对单词进行升序排列,同时,词频相同的单词进行再次排列,按照字母顺序进行排序,在进行排序的过程中由于时间开销的限制,使用快速排序使时间复杂度控制在O(n*logn)。
实现MyString对象的比较方法:
//实现MyString对象的比较方法
public int compareTo(Object o) {
MyString s = (MyString) o;
if (this.count > s.count) {
return 1;
} else if (this.count == s.count) {
if (this.string.compareTo(s.string) < 0) {
return 1;
} else if ((this.string.compareTo(s.string) == 0)) return 0;
else return -1;
} else {
return -1;
}
}
频率统计:
//插入一个字符串,进行判断当前是否存在相同的字符
public static void Insert(String s) {
if (myStrings.isEmpty()) {
myStrings.add(new MyString(s));
return;
}
boolean find = false;
for (MyString ms : myStrings) {
if (ms.string.equals(s)) {
ms.count++;
find = true;
}
}
if (!find) myStrings.add(new MyString(s));
}
//获取排序后的列表 且只输出前100个
public static ArrayListGetStrings() {
quickSort(myStrings, 0, myStrings.size() - 1);
if (myStrings.size() <= 100) return myStrings;
else return (ArrayList) myStrings.subList(0, 99);
// return null;
}
切分以及快速排序:
private static int partition(ArrayListarray, int lo, int hi) {
/** 固定的切分方式 */
MyString key = new MyString(array.get(lo));//选取了基准点
while (lo < hi) {
//从后半部分向前扫描
while (array.get(hi).compareTo(key) <= 0 && hi > lo) {
hi--;
}
array.set(lo, new MyString(array.get(hi)));
//从前半部分向后扫描
while (array.get(lo).compareTo(key) >= 0 && hi > lo) {
lo++;
}
array.set(hi, new MyString(array.get(lo)));
}
array.set(hi, new MyString(key));
//array[hi]=key;//最后把基准存入
return hi;
}
//对列表进行快速排序
private static void quickSort(ArrayListarray, int lo, int hi) {
if (lo >= hi) {
return;
}
//进行第一轮排序获取分割点
int index = partition(array, lo, hi);
//排序前半部分
quickSort(array, lo, index - 1);
//排序后半部分
quickSort(array, index + 1, hi);
}
4、测试设计:测试用例覆盖函数中所有的判断语句,同时针对同单词的不同形式识别、排序最差情况、词频排序、字母排序等各种情况设计测试用例。
本次测试用例经过小组协商,我一共设计了分工的24个用例,设计的24个用例如下表:
5、单元测试截图:
多个输入的词频统计:
单个输入的词频统计:
多个输入的快速排序比较:
单个输入的快速排序内部比较:
单元测试效果良好,基本无出错
单元测试采用JUnit5 Intelij IDEA进行测试
测试质量:测试涵盖了重要的函数,并从四个不同方面设计了20个测试用例对核心部分进行了单元测试。
6、由于小组成员之间通力合作互相帮助,我们一致认为每个人的贡献都很多,因此我的小组贡献分为:0.25。
7、扩展功能:静态测试
(1)选择的代码规范:《阿里巴巴JAVA开发手册》
(2)同行评审代码描述
选择17052组员的代码进行评审:(17052组员的代码通过intelij自带的findbug检查不出错误,于是我找了一些自己人工检测的不规范)
注释不多,虽然代码功能比较明显,但是这还是需要改进的地方
大部分变量命名较为规范,部分变量命名有一些问题
无异常处理,可能导致程序出现不可预知的异常而崩溃
有较为充分的单元测试
8、小结
本次第四周的小组作业wordcountpro优化,虽然只做到了扩展功能,但是还是受益良多,我总共完成了对核心模块的编码设计以及对核心模块的24个单元测试用例的编写,本次作业让我对软件质量与测试这门课认识加深,同时学会了使用像findbugs等工具来对代码进行审查规范以及优化,同时小组其他成员对我的代码的评审提出了中肯的意见,我也在积极地改进自己的不足之处。