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