Github地址:
https://github.com/YuQiao0303/WordCountPro
项目需求:
http://www.cnblogs.com/ningjing-zhiyuan/p/8654132.html
psp2.1 | psp阶段 | 预估耗时 (分钟) | 实际耗时 (分钟) |
Planning | 计划 | 10 | 7 |
·Estimate | ·估计这个任务需要多少时间 | 2 | 4 |
Development | 开发 | 810 | 709 |
·Analysis | ·需求分析 | 30 | 26 |
·Design Spec | ·生成设计文档 | 30 | 31 |
·Design Review | ·设计复审 | 60 | 31 |
·Coding Standard | ·代码规范 | 30 | 38 |
·Design | ·具体设计 | 40 | 31 |
·Coding | ·具体编码 | 200 | 236 |
·Code Review | ·代码复审 | 120 | 55 |
·Test | ·测试 | 300 | 259 |
Reporting | 报告 | 345 | 310 |
·Test Report | ·测试报告 | 300 | 51 |
·Size Measurement | ·计算工作量 | 5 | 27 |
·Postmortem & Process Inprovement Plan | ·事后总结,并提出过程改进计划 | 40 | 232 |
| 合计 | 1167 | 1030 |
对接口的实现
在本次项目中,我负责输出接口的实现,整个实现过程非常的简单,只需按照一定顺序取出treemap中的数据,再写入文件即可。
输出到文件:
try {
File writefile= new File("result.txt");
if(!writefile.exists()){
writefile.createNewFile();
}
BufferedWriter out = new BufferedWriter(new FileWriter(writefile));
int flag = 0;
for (Entry<String, Integer> e: list) {
System.out.println(e.getKey()+":"+e.getValue());
out.write(e.getKey() + " " + e.getValue()+ "\r\n");
flag++;
if(flag>=100)
break;
}
树排序:
List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(Info.entrySet());
Collections.sort(list,new Comparator<Map.Entry<String,Integer>>()
{
//降序排序
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2)
{
return o2.getValue().compareTo(o1.getValue());
}
});
其中info是全局变量,由负责核心功能的组员写入,然后由我负责排序。
测试用例设计:
在小组开会时,我们一致认同把info设计为全局变量,这就导致我的接口没有入口,为了完成测试设计,只好重写一个函数compareFile作为测试函数
compareFile:
static boolean comparefile(TreeMap<String,Integer> Info,String path) {
wordcount.Info = Info;
wordcount.output();
//比较“result.txt”与“path”内容是否相等
try {
File result = new File("result.txt");
File trueRes = new File(path);
List Rlist = new ArrayList();
List Tlist = new ArrayList();
BufferedReader Rbr = new BufferedReader(new FileReader(result));
BufferedReader Tbr = new BufferedReader(new FileReader(trueRes));
String lineTxt = null;
while((lineTxt = Rbr.readLine()) != null) {
Rlist.add(lineTxt);
}
while((lineTxt = Tbr.readLine()) != null) {
Tlist.add(lineTxt);
}
for(int i=0;i<Rlist.size();i++) {
if(!(Rlist.get(i)).equals(Tlist.get(i))){
System.out.println("不相同的是=="+Rlist.get(i));
return false;
}
}
}catch(Exception e) {
System.out.println("读取文件内容出错");
}
System.out.println("Success");
return true;
}
Comparefile的作用就是逐行比较两个文件,当某两行不相同时,输出result中不相同行,返回false。
任务要求设计20例测试用例,分为白盒测试和黑盒测试
白盒测试:
由流程图可知,白盒测试需要4个测试用例
用例一:是否能正常输出
//普通的树
TreeMap<String,Integer> tree1 = new TreeMap<String,Integer>();
tree1.put("miao", 1);
tree1.put("mao", 2);
tree1.put("mi", 3);
tree1.put("mie", 4);
tree1.put("mei", 5);
tree1.put("666", 6);
用例二:是否能正常排序:
//乱序的value
TreeMap<String,Integer> tree2 = new TreeMap<String,Integer>();
tree2.put("beta", 1);
tree2.put("gama", 2);
tree2.put("sum", 3);
tree2.put("sin", 4);
tree2.put("mega", 5);
tree2.put("mishi", 7);
tree2.put("mibb", 115);
tree2.put("sugar", 77);
tree2.put("babe", 136);
tree2.put("miew", 55);
用例三:在value相同时是否能按照首字母排序:
//value相同单词首字母乱序
TreeMap<String,Integer> tree3 = new TreeMap<String,Integer>();
tree3.put("bbduibuqi" ,1);
tree3.put("bbbushiren",1);
tree3.put("bbwocuole" ,1);
tree3.put("baba",1);
tree3.put("baby",1);
tree3.put("babe",1);
tree3.put("beta",1);
tree3.put("bisides",1);
tree3.put("actually",1);
tree3.put("acfun",1);
tree3.put("bilibili",1);
用例四:当树有100个以上节点时的正确输出:
//100个以上的测试
TreeMap<String,Integer> tree4 = new TreeMap<String,Integer>();
tree4.put("a1",101);
tree4.put("a2",100);
tree4.put("a3",99);
tree4.put("a4",98);
tree4.put("a5",97);
tree4.put("a6",96);
tree4.put("a7",95);
tree4.put("a8",94);
tree4.put("a9",93);
tree4.put("b1",92);
tree4.put("b2",91);
tree4.put("b3",90);
tree4.put("b4",89);
tree4.put("b5",88);
tree4.put("b6",87);
tree4.put("b7",86);
tree4.put("b8",85);
tree4.put("b9",84);
tree4.put("c1",83);
tree4.put("c2",82);
tree4.put("c3",81);
tree4.put("c4",80);
tree4.put("c5",79);
tree4.put("c6",78);
tree4.put("c7",77);
tree4.put("c8",76);
tree4.put("c9",75);
tree4.put("d1",74);
tree4.put("d2",73);
tree4.put("d3",72);
tree4.put("d4",71);
tree4.put("d5",70);
tree4.put("d6",69);
tree4.put("d7",68);
tree4.put("d8",67);
tree4.put("d9",66);
tree4.put("e1",65);
tree4.put("e2",64);
tree4.put("e3",63);
tree4.put("e4",62);
tree4.put("e5",61);
tree4.put("e6",60);
tree4.put("e7",59);
tree4.put("e8",58);
tree4.put("e9",57);
tree4.put("f1",56);
tree4.put("f2",55);
tree4.put("f3",54);
tree4.put("f4",53);
tree4.put("f5",52);
tree4.put("f6",51);
tree4.put("f7",50);
tree4.put("f8",49);
tree4.put("f9",48);
tree4.put("g1",47);
tree4.put("g2",46);
tree4.put("g3",45);
tree4.put("g4",44);
tree4.put("g5",43);
tree4.put("g6",42);
tree4.put("g7",41);
tree4.put("g8",40);
tree4.put("g9",39);
tree4.put("h1",38);
tree4.put("h2",37);
tree4.put("h3",36);
tree4.put("h4",35);
tree4.put("h5",34);
tree4.put("h6",33);
tree4.put("h7",32);
tree4.put("h8",31);
tree4.put("h9",30);
tree4.put("i1",29);
tree4.put("i2",28);
tree4.put("i3",27);
tree4.put("i4",26);
tree4.put("i5",25);
tree4.put("i6",24);
tree4.put("i7",23);
tree4.put("i8",22);
tree4.put("i9",21);
tree4.put("j1",20);
tree4.put("j2",19);
tree4.put("j3",18);
tree4.put("j4",17);
tree4.put("j5",16);
tree4.put("j6",15);
tree4.put("j7",14);
tree4.put("j8",13);
tree4.put("j9",12);
tree4.put("k1",11);
tree4.put("k2",10);
tree4.put("k3",9);
tree4.put("k4",8);
tree4.put("k5",7);
tree4.put("k6",6);
tree4.put("k7",5);
tree4.put("k8",4);
tree4.put("k9",3);
tree4.put("l1",2);
tree4.put("l2",1);
tree4.put("m",1);
tree4.put("s",1);
tree4.put("z",1);
黑盒测试:
在白盒测试结束后,我设计了大量的黑盒测试测试用例来检查程序的稳定性和可靠性,按黑盒测试用例来划分其实都是同一个等效类里的测试用例,在此就不列举了。
单元测试运行截图:
整个测试运行的很快,在测试中我测试了边界值,异常情况,正常情况和稳定性,结果显示很好。
小组贡献评分
我负责的部分是输出,不算复杂也不水,在小组讨论后确定我的得分是0.24。
扩展任务:静态测试
规范选择
我们选择了《阿里巴巴Java开发手册》中的一部分规范,并依照以下规范对组员17158,17163的代码进行了分析
编程规约
(1)命名规范:
①【强制】类名使用 UpperCamelCase 风格,但以下情形例外:DO / BO / DTO / VO / AO / PO 等。
②【强制】方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵从 驼峰形式。
③【强制】包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用 单数形式,但是类名如果有复数含义,类名可以使用复数形式。
(2)常量定义
①【强制】不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。
(3)代码格式
① 【强制】大括号的使用约定。如果是大括号内为空,则简洁地写成{}即可,不需要换行;如果 是非空代码块则: 1) 左大括号前不换行。 2) 左大括号后换行。 3) 右大括号前换行。 4) 右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。
②【强制】任何二目、三目运算符的左右两边都需要加一个空格。 说明:运算符包括赋值运算符=、逻辑运算符&&、加减乘除符号等。
③ 【强制】注释的双斜线与注释内容之间有且仅有一个空格。
④【强制】方法参数在定义和传入时,多个参数逗号后边必须加空格。
(4)OOP规约
①【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成 本,直接用类名来访问即可。
②【推荐】使用索引访问用 String 的 split 方法得到的数组时,需做最后一个分隔符后有无 内容的检查,否则会有抛 IndexOutOfBoundsException 的风险。
代码分析:
余乔17158和雷佳谕17163的代码有多处不符合规定的地方
- 左大括号换行不正确
2.注释的双斜线后没有空格
3.if…else语句else换行不正确
同时,该代码良好的遵循了驼峰形式,语言简洁无bug。
检查工具:
Java代码检测IDE插件,Eclipse下的下载地址为:
https://p3c.alibaba.com/plugin/eclipse/update
安装教程:
https://blog.csdn.net/qq_37552993/article/details/79202267
运行截图:
从运行截图看,本程序违反了多条编码规则,我们选择的改进方法是一条条的查源代码并修改wordcountpro中报错的地方,修改后:
小组整体问题:
命名规范,全局变量info并不符合规范
换行规范,所有的换行都随心所欲任意妄为,左大括号前换行,右大括号后瞎换行,多余空行影响阅读和记录错误行。
注释规范,所有注释的双斜杠后都没有一个空格符。
参考资料:
https://blog.csdn.net/keseliugeizuori/article/details/52858304
https://blog.csdn.net/guyuealian/article/details/51934301