软件测试第2周个人作业:WordCount编码测试
一、Github地址
https://github.com/zhouyubei/WordCount
二、PSP表格
|
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
|
Planning |
计划 |
20 | 20 |
|
· Estimate |
· 估计这个任务需要多少时间 |
20 | 20 |
|
Development |
开发 |
1天 | 1.5天 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
30 | 30 |
|
· Design Spec |
· 生成设计文档 |
- | - |
|
· Design Review |
· 设计复审 (和同事审核设计文档) |
- | - |
|
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
- | - |
|
· Design |
· 具体设计 |
30 | 30 |
|
· Coding |
· 具体编码 |
1天 | 1.5天 |
|
· Code Review |
· 代码复审 |
60 | 60 |
|
· Test |
· 测试(自我测试,修改代码,提交修改) |
60 | 120 |
|
Reporting |
报告 |
140 | 140 |
|
· Test Report |
· 测试报告 |
60 | 60 |
|
· Size Measurement |
· 计算工作量 |
20 | 20 |
|
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
60 | 60 |
|
合计 |
2天 | 3天 |
三、解题思路
- 先实现基本功能,再实现扩展功能
- 由于java的知识忘得差不多了,先百度了一下java如何统计一个文件的字符数,单词数,行数,在此基础上做修改,详见参考文献1
- 实现命令行参数解析,参考2
- 实现统计空行、代码行、注释行和停用词表,参考3、4
- 未能实现递归处理目录文件
四、程序设计实现过程
由于程序较小,就仅使用了一个类main,有三个函数,主函数main(),参数解析函数getopt(),功能实现函数count(),主函数接收从命令行传来的参数,调用getopt()进行参数解析,并传给count()进行相应功能的实现并输出到文件中。
五、代码说明
1、参数解析函数getopt():
- 接收主函数传过来的参数数组args,创建一个Vector向量类optString用于存放解析后的参数。
- for循环体内判断args中的字符串与指定参数是否相等,若相等则加进optString中,若为-o或-e,则将后一字符串存进输出文件路径outPath或停用词表路径stopWordPath。
1 //参数解析 2 public static void getopt(String[] args) { 3 optString = new Vector<String>(); 4 outPath = "result.txt"; 5 for (int i = 0; i < args.length; i++) { 6 if (args[i].equals("-o")) { 7 if (++i == args.length) { 8 System.out.println("未输入输出文件路径名"); 9 return; 10 } 11 outPath = args[i]; 12 } 13 else if (args[i].equals("-e")) { 14 if (++i == args.length) { 15 System.out.println("未输入停用词表路径名"); 16 return; 17 } 18 optString.addElement(args[i-1]); 19 stopWordPath = args[i]; 20 } 21 else if (args[i].equals("-c") || args[i].equals("-w") || args[i].equals("-l")|| args[i].equals("-a")) 22 optString.addElement(args[i]); 23 else if (args[i].equals("-s")) 24 System.out.println("尚未实现-s功能"); 25 else 26 inPath = args[i]; 27 } 28 }
2、统计函数count()
- 读入文件并调用readLine()函数循环读入每一行。
- 统计字符个数和行数较为简单。
- 统计单词个数:运用split() 方法把一个字符串分割成字符串数组strArray。若不需过滤停用词,字符串数组的长度,就是单词个数。若启用停用词表,初始化停用词表时创建Vector向量类stopWord存放停用词,创建动态数组strList,运用contains()函数判断字符串数组strArray中的词是否存在于停用词表,若不存在则加入动态数组strList,单词个数即为strList长度。
- 运用正则表达式匹配判断代码行,空白行,注释行。若全为空或仅有一个字符为空白行,若注释符号“//”前没有或仅有一个字符为注释行,其余为代码行。
1 while((str = br.readLine()) != null) 2 { 3 charNum += str.length();//-c 字符个数就是字符长度 4 lineNum++;//-l 因为是按行读取,所以每次增加一即可计算出行的数目 5 //-w 6 if(!str.equals("")){//防止空行也会增加一个字符串 7 String[] strArray = str.split(" |,|\\t");//split() 方法用于把一个字符串分割成字符串数组,字符串数组的长度,就是单词个数 8 //-e 过滤停用词 9 if (optString.contains("-e")){ 10 ArrayList<String> strList = new ArrayList<String>(); 11 strList.clear(); 12 for(int i = 0; i<strArray.length; i++){ 13 if(!stopWord.contains(strArray[i])) 14 strList.add(strArray[i]); 15 } 16 wordNum += strList.size(); 17 } 18 else 19 wordNum += strArray.length; 20 } 21 //-a 代码行,空白行,注释行 22 if (Pattern.matches("\\s*.?\\s*", str)) 23 blankLineNum++;
25 else if(Pattern.matches("\\s*.?\\s*//.*", str)) 26 commentLineNum++;
28 else
29 codeLineNum++;
30 }
六、测试设计过程
1、未能写出测试脚本,均是在cmd控制台测试。语句覆盖就是要保证设计的测试用例应至少覆盖函数中所有的可执行语句,为此,我针对main类中的getopt方法,使用语句覆盖指标设计测试用例,共产生如下10个测试用例。
1、wc.exe -c file.c -o output.txt:结果会输出到output.txt中 2、wc.exe -c file.c -o:提示未输入输出文件路径名 3、wc.exe -w file.c -e stop.txt:启用停用词表,计算单词数时停用词表中的词不计入在内 4、wc.exe -w file.c -e:提示未输入停用词表路径名 5、wc.exe -w file.c -e stop1.txt:该停用词表文件不存在,会提示系统找不到指定的文件 6、wc.exe -c:提示空指针 7、wc.exe -c file1.c:该源文件不存在,会提示系统找不到指定的文件 8、wc.exe -s:提示尚未实现-s功能 9、wc.exe -c -w -l -a file.c:统计字符数、单词数、行数,结果输出到默认文件result.txt 10、wc.exe -a file.c:统计空白行数、代码行数、空白行数,结果输出到默认文件result.txt
2、针对main类中的count方法,使用语句覆盖指标设计测试用例,共产生如下7个测试用例,为源文件file.c中内容。停用词表中内容为“a”。
1 int a 2 a,b 3 } 4 c d 5 6 //gg 7 }//
3、评价:语句覆盖被认为是“最弱的覆盖”,原因是它仅仅考虑对代码中的执行语句进行覆盖而没有考虑各种条件和分支,优点是可以很直观地从源代码得到测试用例,无须细分每条判定表达式。缺点是由于这种测试方法仅仅针对程序逻辑中显式存在的语句(即可执行语句),但对于隐藏的条件和可能到达的隐式逻辑分支,是无法测试的。所以满足程序测试要求还需更多测试。
七、参考文献
- http://blog.csdn.net/ycy0706/article/details/45457311
- http://blog.csdn.net/ksu99/article/details/157602
- http://blog.csdn.net/u013930303/article/details/44872155
- http://blog.csdn.net/javaniuniu/article/details/53454749
- 参照同学:https://github.com/Asfalas/WordCount
- 参照同学:https://github.com/Wegnery/WordCount

浙公网安备 33010602011771号