Github地址
https://github.com/ohayogirls/wcPro
PSP表格
PSP2.1 |
PSP阶段 |
预计耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
10 |
15 |
· Estimate |
· 估计这个任务需要多少时间 |
10 |
15 |
Development |
开发 |
390 |
490 |
· Analysis |
· 需求分析 (包括学习新技术) |
30 |
20 |
· Design Spec |
· 生成设计文档 |
20 |
30 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
30 |
40 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
40 |
10 |
· Design |
· 具体设计 |
20 |
60 |
· Coding |
· 具体编码 |
120 |
100 |
· Code Review |
· 代码复审 |
30 |
30 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
100 |
180 |
Reporting |
报告 |
90 |
100 |
· Test Report |
· 测试报告 |
45 |
30 |
· Size Measurement |
· 计算工作量 |
15 |
10 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
60 |
|
合计 |
|
|
模块的接口的实现
我在小组中负责的是核心业务模块,即实现单词识别,词频统计,排序这些功能
因为考虑到这些功能之间有相互的参数传递,且由我一个人实现,所以我将模块通过一个Core类来实现,Core类下的方法分别实现了各个功能,下面给出具体代码和解释。
-
Core类的属性content是输入文件的内容,构造方法从输入类中得到content
private String content; public Core(String str){ this.content = str; }
-
方法CountWord(),功能是识别单词,并统计词频。单词和词频可以看做是一个键值对,所以我在这里用到了HashMap来保存单词和词频。识别单词是通过正则表达式([a-zA-Z]+(-[a-zA-Z]+)*)去匹配文件内容实现的,匹配到一个单词,先判断HashMap里是是否有这个单词,若没有则将这个单词添加到HashMap中同时设词频为1,若有则将该单词词频+1。
public HashMap<String, Integer> CountWord(){ //识别单词,统计词频 HashMap<String,Integer> map = new HashMap<String,Integer>(); String reg = "([a-zA-Z]+(-[a-zA-Z]+)*)"; Pattern p = Pattern.compile(reg); Matcher m = p.matcher(content); while(m.find()){ String w = m.group().toLowerCase(); if(null == map.get(w)){ map.put(w, 1); }else{ int x = map.get(w); map.put(w, x + 1); } } return map; }
-
方法WordSort(),将得到的单词和词频按给定的规则进行排序,先比较词频,从大到小排列,如果词频一样再比较单词的首字母的ASCII码的值从小到大排列,java里对Collection对象有sort接口,我们只要重写Comparator里的comrare方法即可实现自己定义的排序。
public List<Map.Entry<String, Integer>>WordSort(HashMap<String,Integer>){ List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet()); Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { if((o2.getValue()).toString().compareTo(o1.getValue().toString())==0){ return (o1.getKey()).toString().compareTo(o2.getKey().toString()); } else{ return (o2.getValue()).toString().compareTo(o1.getValue().toString()); } } }); return list; }
测试用例的设计
- 考虑到我写的模块里只有一个Core类,里面用到了正则表达式和在排序的时候有判断语句,逻辑结构很清晰,设计测试用例时考虑例如:测试输入为空的边界情况,测试大小写字母及其混合,测试大小写单词及其混合,测试单词词频统计,测试对-的处理,测试~作为分隔符,测试!作为分隔符,测试_作为分隔符,测试数字作为分隔符,以及测试非英文字母(如日文),测试奇怪的符号,尽可能覆盖单词判别的所有情况。
- 测试效率的考虑:使用junit框架能够实现快速有效地进行针对性的测试,通过与自己的预期结构进行对比,查漏补缺。
-
测试用例表,具体代码见github中test文件夹
单元测试截图
CoreTest:根据我设计的20个测试用例编写的测试脚本,将实际结果与预期结果进行对比。结果全部通过,单元测试合格。
小组贡献分:0.4
参考文献
https://www.cnblogs.com/longronglang/p/7458027.html
https://zhidao.baidu.com/question/370032964655027804.html
https://blog.csdn.net/u012730840/article/details/19703101