WordCountPro
分组:
组长:余乔
组员:商莹、雷佳谕、蒋雨晨
GitHub地址:https://github.com/YuQiao0303/WordCountPro
1、需求说明
参见武老师博客http://www.cnblogs.com/ningjing-zhiyuan/p/8654132.html
2、基本功能及扩展功能PSP表格
PSP2.1 | PSP阶段 | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 5 |
Estimate | 估计这个任务需要多少时间 | 20 | 5 |
Development | 开发 | 555 | 640 |
Analysis | 需求分析(包括学习新技术) | 120 | 211 |
Design Spec | 生成设计文档 | 30 | 31 |
Design Review | 设计复审(和同事审核设计文档) | 120 | 153 |
Coding Standard | 代码规范 | 15 | 5 |
Design | 具体设计 | 0 | 0 |
Coding | 具体编码 | 90 | 50 |
Code Review | 代码复审 | 30 | 21 |
Test | 测试 | 150 | 169 |
Reporting | 报告 | 195 | 266 |
Test Report | 测试报告 | 30 | 45 |
Size Measurement | 计算工作量 | 15 | 15 |
Postmortem&Process Improvement Plan | 事后总结,并提出过程改进计划 | 150 | 206 |
Total | 合计 | 770 | 911 |
3、项目接口实现
在本次项目中,我主要负责的模块是输入控制和主函数设计:
我们将输入控制函数设置为布尔型函数isInputValid(),函数的形参为输入的命令,函数的主要功能是接收到主函数传来的输入命令之后判断此命令是否合法,若合法返回true,若不合法,则根据输入的命令给出相应的错误提示并返回false
函数的流程图如下图所示:
代码处理:
输入控制函数:(函数分析写在注释内)
static Boolean isInputValid(ArrayList<String> strArray){//为使测试用例占用的空间较少,将参数设置为动态数组
/* 判断参数是否合理,
* 若不合理,报错,return false;(之后主函数退出)
* 若合理,return true(之后主函数中args【0】即为inputfilename)
* 商莹*/
if(strArray.size()==0){//未输入参数,提示“请输入文件名”
System.out.println("请输入文件名");
return false;
}
else if(strArray.size()>1){//有参数输入,但文件格式不对
System.out.println("请以格式wcPro.exe [input_file_name]输入命令");
return false;
}
else{
File file=new File(strArray.get(0));
if(!file.exists()){//格式正确,判断文件是否存在
System.out.println("该文件不存在");
return false;
}
else{
System.out.println("文件为:");
System.out.print(strArray.get(0));
return true;
}
}
}
主函数:
ArrayList<String> strArray = new ArrayList<String> ();//为适配输入控制函数,将输入数组赋给一个动态数组
4、测试用例的设计
程序图:
测试用例的设计:
①白盒测试之对判定的测试:(5个用例)
对判定的测试:逻辑覆盖,其关注点是判定式本身的复杂程度,通过对程序逻辑结构的遍历,来实现测试对程序的覆盖 ,对程序代码中所有的逻辑值,都需要测 试真值(True)和假值(False)的情况
包含语句覆盖、判定覆盖、条件覆盖,判定/条件覆盖、条件组合覆盖、修正的判定/条件覆盖
②白盒测试之对路径的测试:(5个用例)
根据还复杂度确定独立路径,依次覆盖判定节点的 不同执行分支,使路径集合中的路径满足线性无关
③黑盒测试之边界值测试:(5个用例)
边界点就是可能导致被测系统内部处理机 制发生变化的点,在边界以及边界附近的邻域内选择所 有的测试数据,构成测试用例
④黑盒测试之等价类的测试:(5个用例)
如果某个输入条件指定了一组特定取值, 则可以定义一个有效等价类和一个无效等价类,测试方法包括:弱覆盖-测试用例应覆盖所有的有效等价类,强覆盖-测试用例应覆盖所有的有效等价类的组合
测试用例设计清单:
Test Case ID 测试用例编号 | Test Item 测试项(即功能模块或函数) | Test Case Title 测试用例标题 | Test Criticality重要级别 | 是否自动用例 | 是否新增修改用例 | Pre-condition 预置条件 | Input 输入 | Procedure 操作步骤 | Output 预期结果 | Result 实际结果 |
Status 是否通过 |
Remark 备注(在此描述使用的测试方法) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | isInputValid() | 没有输入命令 | High | 无 | wcpro.exe | 输入命令直接运行 | False | False | ok | 白盒测试之对判定的测试 | ||
2 | isInputValid() | 输入的参数多于一个 | High | 无 | wcpro.exe input1.txt -c | 输入命令直接运行 | False | False | ok | 白盒测试之对判定的测试 | ||
3 | isInputValid() | 输入的参数多于一个 | Low | 无 | wcpro.exe input1.txt -c input1.txt | 输入命令直接运行 | False | False | ok | 白盒测试之对判定的测试 | ||
4 | isInputValid() | 输入的文件路径不对 | High | 无 | wcpro.exe 11 | 输入命令直接运行 | False | False | ok | 白盒测试之对判定的测试 | ||
5 | isInputValid() | 输入的参数正确 | High | input1.txt在工程目录下 | wc.pro.exe input1.txt | 输入命令直接运行 | True | True | ok | 白盒测试之对判定的测试 | ||
6 | isInputValid() | 输入的参数多于一个 | Low | 无 | wcpro.exe G:\input1.txt 111 | 输入命令直接运行 | False | False | ok | 白盒测试之对路径的测试 | ||
7 | isInputValid() | 输入的参数多于一个 | Low | 无 | wcpro.exe G:\input1.txt 11 11 | 输入命令直接运行 | False | False | ok | 白盒测试之对路径的测试 | ||
8 | isInputValid() | 输入的参数多于一个 | Low | 无 | wcpro.exe G:\input1.txt -c G:\input1.txt | 输入命令直接运行 | False | False | ok | 白盒测试之对路径的测试 | ||
9 | isInputValid() | 输入的文件路径不对 | Low | 无 | wcpro.exe G: | 输入命令直接运行 | False | False | ok | 白盒测试之对路径的测试 | ||
10 | isInputValid() | 输入的参数正确 | Low | input2.txt在工程目录下 | wc.pro.exe input2.txt | 输入命令直接运行 | True | True | ok | 白盒测试之对路径的测试 | ||
11 | isInputValid() | 没有输入命令 | Low | 无 | wcpro.exe | 输入命令直接运行 | False | False | ok | 黑盒测试之边界值测试 | ||
12 | isInputValid() | 输入的文件路径不对 | Low | 无 | wcpro.exe a | 输入命令直接运行 | False | False | ok | 黑盒测试之边界值测试 | ||
13 | isInputValid() | 输入的参数多于一个 | Low | 无 | wcpro.exe a a a | 输入命令直接运行 | False | False | ok | 黑盒测试之边界值测试 | ||
14 | isInputValid() | 输入的参数多于一个 | Low | 无 | wc.pro.exe G:\input1.txt a | 输入命令直接运行 | False | False | ok | 黑盒测试之边界值测试 | ||
15 | isInputValid() | 正确输入 | Low | input2.txt在工程目录下 | wcpro.exe input2.txt | 输入命令直接运行 | True | True | ok | 黑盒测试之边界值测试 | ||
16 | isInputValid() | 输入的参数多于一个 | Low | 无 | wcpro.exe a a a a | 输入命令直接运行 | False | False | ok | 黑盒测试之等价类的测试 | ||
17 | isInputValid() | 输入的参数多于一个 | Low | 无 | wcpro.exe G:\input1.txt G:\input1.txt G | 输入命令直接运行 | False | False | ok | 黑盒测试之等价类的测试 | ||
18 | isInputValid() | 输入的参数多于一个 | Low | 无 | wc.pro.exe G:\input1.txt 11 | 输入命令直接运行 | False | False | ok | 黑盒测试之等价类的测试 | ||
19 | isInputValid() | 输入的参数多于一个 | Low | 无 | wcpro.exe G:\input1.txt -c G:\input1.txt | 输入命令直接运行 | False | False | ok | 黑盒测试之等价类的测试 | ||
20 | isInputValid() | 正确输入 | Low | input1.txt在工程目录下 | wcpro.exe input1.txt | 输入命令直接运行 | True | True | ok | 黑盒测试之等价类的测试 |
单元测试的运行截图:
评价:
这些测试用例覆盖了模块中所有的判定节点和分支,实际输出结果也与预期一致,能够从各个方面对程序进行测试
5、开发规范文档
本次项目中我们选用的开发规范文档为阿里巴巴的Java开发手册,选用的主要评价规范是:
(一) 命名风格
- 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
- 代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
- 类名使用 UpperCamelCase 风格,但以下情形例外:DO / BO / DTO / VO / AO / PO 等。
- 方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵从 驼峰形式。
5.常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。 - 抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类 命名以它要测试的类名开始,以 Test 结尾。
- 类型与中括号紧挨相连来定义数组。
8.POJO 类中布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。
- 包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用 单数形式,但是类名如果有复数含义,类名可以使用复数形式。
- 杜绝完全不规范的缩写,避免望文不知义。
(二) 代码格式 - 大括号的使用约定。如果是大括号内为空,则简洁地写成{}即可,不需要换行;如果 是非空代码块则: 1) 左大括号前不换行。 2) 左大括号后换行。 3) 右大括号前换行。 4) 右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。
- 左小括号和字符之间不出现空格;同样,右小括号和字符之间也不出现空格。
6、对小组成员代码进行评价
我选择的小组成员是17158和17163的编码
代码如下:
static void wcPro(String input) throws IOException{
/*将单词和词频存入info
* 雷佳谕、余乔
* */
File file=new File(input);
BufferedReader br = new BufferedReader(new FileReader(file));
String line = null;
//定义一个map集合保存单词和单词出现的个数
//TreeMap<String,Integer> tm = new TreeMap<String,Integer>();
//读取文件
while((line=br.readLine())!=null){
line=line.toLowerCase();
//System.out.println(line);
String reg1 = "[\\s~`!#%\\^&\\*_\\.\\(\\)\\[\\]\\+=:;\"'\\|<>\\,/\\?0-9]+";
String containLetter=".*[a-z].*";
//String reg2 ="\\w+";
//将读取的文本进行分割
String words[] = line.split(reg1);
for(String word: words){
if(word.equals(""))
continue;
int firstIndex=0,lastIndex=word.length(),len=word.length();
if(word.matches(containLetter)) //如果含字母
{
for(int i=0;i<len;i++)
{
if(word.charAt(i)!='-')
{
firstIndex=i; //寻找第一个字母的坐标
break;
}
}
for(int i=len-1;i>-1;i--)
{
if(word.charAt(i)!='-')
{
lastIndex=i; //寻找最后一个字母的坐标
break;
}
}
word=word.substring(firstIndex, lastIndex+1);
if(!Info.containsKey(word)){
Info.put(word,1);
}
else{
Info.put(word,Info.get(word)+1);
}
}
}
}
br.close();
}
代码内存在的问题有:
①第二行的info与下面代码使用的Info不符
②if的左大括号都换行了
③for循环的左大括号都换行了
④if...else格式不正确
7、静态代码检查工具
Java代码检测IDE插件,Eclipse下的下载地址为:
https://p3c.alibaba.com/plugin/eclipse/update
安装教程:
https://blog.csdn.net/qq_37552993/article/details/79202267
静态检查发现的错误截图:
修改后进行静态检查:
小组问题:
普遍存在的问题是左大括号换行、if...else格式不正确,还有一些函数和变量的命名问题
8、总结
通过本次项目我对接口设计的了解更加深入,对于代码规范有了初步的了解,我们还进行了几个词同行评审,会议记录如下:
第一场 :
主持人:雷佳谕
记录员:余乔
主审:蒋雨晨
讲解员:商莹
讲解方法:input()
会议记录:
余乔:44行建议改为println
蒋雨晨:如果输入不合要求,会直接退出程序吗。答曰会。
雷佳谕:为什么用动态数组存参数?答曰这样对测试类来说更省空间。
蒋雨晨:函数命名不合规范
第二场:
讲解员:余乔
主持人:蒋雨晨
记录员:雷佳谕
主审:商莹
讲解方法:wcPro
方法简介:输入参数为文件名,功能为统计该文件内的单词及单词词频,将结果保存于类的静态变量Info中;
会议记录:
主审(商莹):FirstIndex的作用是什么? 答:定位所分隔出的单词的第一个字母
记录员(雷佳谕):当多个连字符连接英文单词时,多个连字符是否视作分隔符,还是当作普通连字符处理? 答:需求没有明确提出单词中出现多个连字符的情况如何处理;
主审(商莹):该方法为什么要抛出异常? 答:读文件时有可能抛出异常。
主持人(蒋雨晨):当遇到一个单词一行写不下时,第一行结尾会加"-"连接单词的两部分,但是此代码在这种情况下会处理为两个单词 答:这确实是一个存在于手写文稿的问题,
这种情况按道理来讲也确实算一个单词,但是代码确实算了两个单词,但是需求并没有提出这种情况,并且在机打时基本没有这种情况出现,文本编辑器会自动换行。
讲解员(余乔):JAVA开发手册,代码格式的第一条,左大括号前不换行,此代码不符合。
商莹:程序开始段注释内TreeMap参数Info的大小写与实际参数不一致 答:马上改正。
余乔:仔细一看,改代码违反了多条规范; 答:是的。
第三场:
讲解员:蒋雨晨
主持人:余乔
记录员:商莹
主审:雷佳谕
会议记录:
讲解环节:
讲解员蒋雨晨讲解方法output代码
提问环节:
主审:代码很多方面不满足静态规约,注释不美观,121 int flag为什么不定义在方法首
主持人:有没有测过单词数大于100的情况。回答:测了且正确
记录员:catch(Exception e)里不用写东西吗。回答:不用
这种方式集思广益对于模块的纠错改错有很大的帮助,并且能够更加全面的了解各个模块。
9、小组贡献率
经过小组讨论,我的小组贡献率为0.24.