第四周任务:wordCountPro

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的代码有多处不符合规定的地方

  1. 左大括号换行不正确

 

 

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

posted @ 2018-04-07 22:36  蒋雨晨  阅读(262)  评论(0编辑  收藏  举报