小组作业wordCountPro·
基本任务:代码编写+单元测试
(1) Github地址: https://github.com/LongtermPartner/ExtendWordCount
(2) PSP表格:
psp 2.1 | psp阶段 | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 10 | 10 |
Estimate | 估计这个任务需要多少时间 | 10 | 10 |
Deveploment | 开发 | 500 | 630 |
Analysis | 需求分析(包括学习新技术) | 30 | 30 |
Design Spec | 生成设计文档 | 20 | 20 |
Design Review | 设计复审(和同事审核设计文档) | 10 | 10 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 20 | 20 |
Design | 具体设计 | 30 | 30 |
Coding | 具体编码 | 150 | 200 |
Code Review | 代码复审 | 30 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 150 | 200 |
Reporting | 报告 | 10 | 10 |
Test Report | 测试报告 | 20 | 20 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 30 | 30 |
合计 | 550 | 630 |
(3)对接口的实现:
对于wordCountPro计数单词优化版,我们小组搭建的框架是:将整个程序分为四个模块,分别是Input,Output,CountAndSort,Main模块,也就是一个包下分别建有对应模块的类,由相应组员完成对应负责的模块,因为考虑到模块间的耦合性,便于各个模块间的单元测试,于是主函数只有三行关键代码,即输入模块调用,返回值文件传给主模块计数并排序模块,主功能模块将处理好的单词排序封装成由Map<String,Integer>集合组成的Arraylist数组,并传给输出模块,并由输出模块写入到输出文本,且输出模块负责只输入前100个高频度单词,超过100不输出。
我负责的是主功能模块的Sort排序函数实现。
该Sort函数接收并对TreeMap中的数据进行排序,TreeMap一般默认为对键值排序,但该数据结构的键值为单词,值为词频,根据需求我们需要对词频排序,词频高的排在前面,词频低的排在后面。若是出现词频出现相同的情况,则按照键值排序。在此函数中键值为字母组成的单词,因此排序按字母顺序排序。故代码中需重写TreeMap默认的排序方法,即Comparator比较器中的compare方法,若是词频值大的就排前面,如果出现词频相等则进行键值比较。getInt()函数主要是将String类型转化成int类型的数值大小。因为compare()方法返回的是int数值型,所以需要将键值String类型比较转化成int类型数值比较。
具体函数实现如下:
//对统计的单词进行词频排序
public static ArrayList<Map.Entry<String, Integer>> Sort(TreeMap<String, Integer> wordsCount){
// 升序比较器
Comparator<Map.Entry<String, Integer>> valueComparator = new Comparator<Map.Entry<String,Integer>>() { @Override
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
//若是词频相同则比较键值大小即比较将String类型转化成int数值类型的大小
return o2.getValue()-o1.getValue()==0?getInt(o2.getKey())-getInt(o1.getKey()):o2.getValue()-o1.getValue();
}
//将String类型转化成数值类型
private int getInt(String key) { int i=0;
try{
Pattern pattern=Pattern.compile("^\\d+");
Matcher matcher=pattern.matcher(key);
if(matcher.find()){
i=Integer.valueOf(matcher.group());
}
}catch(NumberFormatException e){
e.printStackTrace();
}
return i;
}
}; // map转换成list进行排序
ArrayList<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String,Integer>>(wordsCount.entrySet());
// 排序
Collections.sort(list,valueComparator); return list;
}
(4)测试用例的设计:
需要测试的模块为上述所贴代码函数,该Sort函数接收并对TreeMap中的数据进行排序,根据需求我们需要对词频排序,词频高的排在前面,词频低的排在后面。若是出现词频出现相同的情况,则按照键值排序。在此函数中键值为字母组成的单词,因此排序按字母前后顺序排序。
整体测试思路:
首先改变需要测试文本的内容,在此我们指的是hMap中的数据,
然后调用CountAndSort的Sort排序函数得到实际执行的actual,
最后调用assertEquals函数将预先排序好的期望值expected与actual比较。
注:因为各个模块之间单独测试,在单词统计功能后不会出现相同单词和除字母及-字符之外的字符数字,但我在此是对自己实现的排序模块进行测试,与计数模块同时进行测试,故为了程序的健壮性,我将相同单词的出现情况和单词中包含其他非‘-’字符如#,数字也加入了测试用例中。
为达到对需求功能的测试,因为实现模块的函数逻辑简单,因此我的测试思路几乎是从黑盒测试出发,也有白盒测试,如排序情况是否选择键值比较。我从以下几个方面设计测试用例:
1.特殊情况:文本为空时 黑盒测试
2.文本中单词个数数量且词频不同 条件测试 有效等价类测试
3.文本中单词不同,词频相同 条件测试 有效等价类测试
4.文本中单词相同,词频相同 无效等价类测试
5.文本中单词含有特殊字符和数字 无效等价类测试
具体测试用例:
expected为存放预期数据的动态数组,actual为接收sort函数的动态数组,即实际运行结果。
Test Case ID 测试用例编号 |
Test Item 测试项 (即功能模块或函数) |
Test Case Title 测 试用例标题 |
Test Criticality 重要级别 |
Pre-condition 预置条件 |
Input 输入 |
Procedure 操作步骤 |
Output 预期结果 |
Result 实际结果 |
Status 是否通过 |
Remark 备注 (在此描述使用的测试方法) |
S_1 | 排序模块 | 文本内容为空 | M | hMap集合 | 无 | 无 | expected | actual | 是 | 黑盒测试 |
S_2 | 排序模块 | 文本内容为一个字母组成的单词,词频相同 | M | hMap集合 | 无 | 无 | expected | actual | 是 | 黑盒测试 |
S_3 | 排序模块 | 文本内容为多个字母组成的单词,词频相同 | M | hMap集合 | 无 | 无 | expected | actual | 是 | 黑盒测试 |
S_4 | 排序模块 | 文本内容为仅由‘-或字母组成的单词,词频相同 | M | hMap集合 | 无 | 无 | expected | actual | 是 | 黑盒测试 |
S_5 | 排序模块 | 文本内容相同,单词顺序不同,词频相同 | L | hMap集合 | 无 | 无 | expected | actual | 是 | 黑盒测试 |
S_6 | 排序模块 | 文本内容如上,打乱单词顺序,词频相同 | L | hMap集合 | 无 | 无 | expected | actual | 是 | 黑盒测试 |
s_7 | 排序模块 | 文本内容由字母和‘-’组成的单词,词频相同 | H | hMap集合 | 无 | 无 | expected | actual | 是 | 白盒测试 |
S_8 | 排序模块 | 文本单词相同词频相同 | L | hMap集合 | 无 | 无 | expected | actual | 是 | 黑盒测试 |
S_9 | 排序模块 | 文本内容由一个字母组成且词频不同 | M | hMap集合 | 无 | 无 | expected | actual | 是 | 黑盒测试 |
S_10 | 排序模块 | 单词不同词频不同 | M | hMap集合 | 无 | 无 | expected | actual | 是 | 白盒测试 |
S_11 | 排序模块 | 打乱不同单词且词频不同的顺序 | L | hMap集合 | 无 | 无 | expected | actual | 是 | 黑盒测试 |
S_12 | 排序模块 | 文本含‘-’连接单词 | H | hMap集合 | 无 | 无 | expected | actual | 是 | 黑盒测试 |
S_13 | 排序模块 | 文本单词(含'-')不同词频不同 | M | hMap集合 | 无 | 无 | expected | actual | 是 | 黑盒测试 |
S_14 | 排序模块 | 交换相同单词词频不同的顺序 | M | hMap集合 | 无 | 无 | expected | actual | 是 | 黑盒测试 |
S_15 | 排序模块 | 单词数量多时 | H | hMap集合 | 无 | 无 | expected | actual | 是 | 黑盒测试 |
S_16 | 排序模块 | 词频大 | H | hMap集合 | 无 | 无 | expected | actual | 是 | 黑盒测试 |
S_17 | 排序模块 | 单词数量多且词频大 | H | hMap集合 | 无 | 无 | expected | actual | 是 | 黑盒测试 |
S_18 | 排序模块 | 多个单词且含特殊字符 | M | hMap集合 | 无 | 无 | expected | actual | 是 | 黑盒测试 |
S_19 | 排序模块 | 多个单词含字母数字 | M | hMap集合 | 无 | 无 | expected | actual | 是 | 黑盒测试 |
S_20 | 排序模块 | 多个单词含有各种特殊字符数字且词频跨度大 | H | hMap集合 | 无 | 无 | expected | actual | 是 | 黑盒测试 |
(5)单元测试的运行截图:
(6)根据小组讨论,自己的小组贡献分为0.28 。
扩展任务:静态测试
(1)邹欣老师博客:现代软件工程讲义 代码规范与代码复审
http://www.cnblogs.com/xinz/archive/2011/11/20/2255971.html
(2)使用该规范分析了学号后5位为17097的代码,
小的代码问题:大括号{ }没有单独占用一行,有的变量名命名不够规范。
遵循好的规范:关键语句都有注释,在复杂的条件表达式中,用括号清楚地表示逻辑优先级。
(3)静态代码检查工具:
我们小组选择的静态代码检查工具为:PMD
工具下载地址: http://pmd.sourceforge.net/eclipse/
(4)工具对于代码扫描结果,界面运行截图:
根据静态代码分析器PMD得出代码存在以下问题:
1.方法参数o1,o2未定义为final类型。
2.变量名字太短,如o1,o2,i。
3.对象的定义在方法内,导致其他对象不可见。
4.代码中类的所有方法属于static类型,建议为类创建私有构造方法。
5.包名含有大写字母。
改进方法:
1.将方法参数o1,o2定义为final类型。
2.将变量o1,o2,i改为word1,word2,integer。
3.将对对象的定义提到方法外。
4.为含有方法全为静态类型的类创建私有构造方法。
5.包名改成全部由小写字母组成。
(5)整个小组代码主要存在的问题就是很多方法均为静态方法,没有为该类创建私有构造方法;很多对象定义和使用放在一起,导致对象定义不明显;变量名的命名不规范。
高级任务:性能测试和优化
(1)测试数据集的设计思路:
给出一个数据量足够大且在一定程度上能给程序造成压力的测试文本,多次改变文本内容但行数维持在1000行左右的包括特殊字符的文本,定义两个变量startTime,endTime(单位为毫秒)分别用来获取程序及各个子模块运行前后系统时间,运行程序,将(endTime-startTime)得到的结果进行分析。
(2)优化前的程序性能指标:程序运行时间即测出的endTime-startTime.
(3)同行评审,组员全部参加,组长主持,其他组员进行评审,对计数和排序模块进行了评审,集体认为计数和排序会占用大多的程序运行时间。
(4)测试结果:
进行多次测试发现程序执行时间为100-200ms左右。
由测试结果可知,影响性能指标的主要因素是计数和排序模块,它们运行所花时间占了程序大部分时间。
与同行评审结论一致。
(5)优化思路:程序花费时间最多的模块就是计数和排序模块,因此需要改进计数和排序模块的时间复杂度,尤其是计数模块,将之前的逐个字母扫描判断改为用正则表达式实现,在一定程度上可以提升程序的性能。
(6)软件开发、软件测试、软件质量之间的关系:
软件开发欲软件测试的关系:在软件开发过程中进行单元测试,软件开发完成进行集成测试,所以在某种程度来说,相比软件开发,软件测试是建立在软件开发基础上的,在测试的同时找出程序存在的问题并改进,提高软件质量。同样若有足够的项目经验,软件开发时所搭建的框架接口也在一定程度上影响软件质量,另一方面,测试用例集的选择与设计是否覆盖全面也影响着软件质量的好坏。
小组作业wordCountPro·的更多相关文章
- 实践作业4 Web测试(小组作业分配)
经过小组内的讨论之后,我们小组的工作分配如下: 张赛军.闫昊:阶段一,软件评测: 林俊旭:阶段二,用户调研: 张嘉焰:阶段三,得出结论: 许林龙:阶段四,分析: 王奎:阶段五,每日记录,并汇总整理小组 ...
- HUST软测1504班第6周小组作业成绩
说明 本次公布的成绩为第6周小组作业的结果: 第6周小组作业:WordCount(详情见毕博平台) 如果同学对作业结果存在异议,可以: 在毕博平台讨论区的第6周作业第在线答疑区发帖申诉. 或直接在博客 ...
- HUST软测1504班第4周小组作业成绩:WordCount优化
说明 本次公布的成绩为第四周作业的结果: 第4周小组作业:WordCount优化 博客推荐:本次作业有一位同学完成有创意,推荐优秀博客.(优秀博客不会对成绩带来正面或者负面影响)PS:做任何创新的任务 ...
- 实践作业4:Web测试实践(小组作业)每日任务记录5
(一)今日任务更新 本次小组作业均已完成! 本组文件最终pdf文件(文件稍大,请耐心等待加载):https://files.cnblogs.com/files/ruanshuo170204/Web测试 ...
- 实践作业4:Web测试实践(小组作业)每日任务记录3
会议时间:2017年12月23日 会议地点:东九教学楼自习区 主 持 人:王晨懿 参会人员:王晨懿.余晨晨.郑锦波.杨潇.侯欢.汪元 记 录 人:王晨懿 会议议题:小组作业第二阶段 下面是今天 ...
- 实践作业4:Web测试实践(小组作业)每日任务记录2
实践作业4:Web测试实践(小组作业)每日任务记录2 会议时间:2017年12月22日 会议地点:东九教学楼自习区 主 持 人:王晨懿 参会人员:王晨懿.余晨晨.郑锦波.杨潇.侯欢.汪元 记 录 ...
- 实践作业4:Web测试实践(小组作业)每日任务记录1
会议时间:2017年12月21日会议地点:东九教学楼自习区主 持 人:王晨懿参会人员:王晨懿.余晨晨.郑锦波.杨潇.侯欢.汪元记 录 人:王晨懿会议议题:小组作业熟悉和任务分配 (一)选择待测产品 我 ...
- WordCountPro小程序
WordCountPro小程序 基本任务 1.githu地址 https://github.com/JarrySmith/WordCountPro 2.psp2.1表 PSP2.1 PSP阶段 预 ...
- WordCountPro 编码与测试
WordCountPro github项目地址:https://github.com/handsomesnail/WordCountPro PSP表格 PSP2.1 PSP阶段 预估耗时(小时) ...
随机推荐
- Linux命令学习(21):netstat命令
版权声明 更新:2017-06-13博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下面的netstat ...
- Brackets Sequence(升级版)
个人心得:又是途径问题,我怕是又炸了.看了题解他的意思就是找出最短的添加顺序的断点,则只要 根据断点添加就好了,注意递归的奥妙之处吧,暂时还真得是拿他没办法. 题目描述: 定义合法的括号序列如下: 1 ...
- 用TCP穿透NAT(TCP打洞)的实现
目录 TCP穿透原理 程序思路 声明 上代码 运行示例 1. TCP穿透原理: 我们假设在两个不同的局域网后面分别有2台客户机A和 B,AB所在的局域网都分别通过一个路由器接入互联网.互联网上有一台服 ...
- 开启MySQL的sql语句记录
在开发的时候经常会想看一下MySQL最终执行的sql或者想保存sql记录,所以我们可以启用MySQL的sql记录功能. 开启方法:Linux下编辑MySQL的my.cnf文件,windows下编辑my ...
- 什么是 PCB 的压适孔
引用 AMOBBS 1 再举一个高成本控制的例子:有类PCB产品对孔径要求极度严格,这类孔叫压适孔,这类孔的作用类似于显卡内存条的插座,能刚刚好被元件插上,而且元件不会掉,PTH的压适孔公差要求为-0 ...
- 我的ubuntu新系统自动装软件脚本
装一些常用软件 配一下环境变量 #!/bin/bash #download g++sudo apt-get install g++ -y#download codeblockssudo apt-get ...
- Linux开放80、8080端口或者开放某个端口
装载系统的时候只开启了22端口.结果再装完Nginx+php+mysql 后不能访问网站. 查看防火墙设置发现没开启80端口 iptables -L -n 由于Linux防火墙默认是关闭的.可以用两种 ...
- bae3.0第四步 第一个polls系统
1.创建自己的app 进入新建的blog工程目录,执行其下面的manage.py来创建polls应用,命令为: python manage.py startapp polls2.定义app的model ...
- Poj 2395 Out of Hay( 最小生成树 )
题意:求最小生成树中最大的一条边. 分析:求最小生成树,可用Prim和Kruskal算法.一般稀疏图用Kruskal比较适合,稠密图用Prim.由于Kruskal的思想是把非连通的N个顶点用最小的代价 ...
- Process使用
最近在一个项目中,需要在C#中调用cmd窗口来执行一个命令,使用到了Process这个类,使用过程中遇到不少问题,好在终于解决了.赶紧记录下来. Process process = new Proce ...