软件质量与测试第二周作业--wordcount

时间:2021-11-01 02:14:24

 1.Github作业地址

https://github.com/Luozhixuan/wordcount

2.PSP表格

 

PSP2.1 PSP 阶段 预估耗时 (分钟) 实际耗时 (分钟)
Planning 计划 60 90
· Estimate · 估计这个任务需要多少时间 300 600
Development 开发  300  600
· Analysis · 需求分析 60 60
· Design Spec · 生成设计文档 50 30
· Design Review · 设计复审 30 0
· Coding Standard · 代码规范 40 600
· Design · 具体设计 60 60
· Coding · 具体编码 240 360
· Code Review · 代码复审 60 120
· Test · 测试 40 120
Reporting 报告 30 30
· Test Report · 测试报告 10 5
· Size Measurement · 计算工作量 10 10
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 20 20
  合计 480 600

 

3.解题思路

  • 上周发布题目的的时候我只是大致看了下,觉得有些复杂,所以就先去完成其他的作业了,过了几天真正开始做这个任务。我刚开始准备用c语言完成这个作业,但是好像周围的同学都是用的java,我觉得用相同的语言,在开发过程中出了问题可以一起讨论,能节省好多时间。但是因为好久没使用java了,所以都写到了一个类里面。首先,我觉得这个任务最主要的功能是解析args函数的参数,因为java没有像c/c++那样的类似scanf的函数,因此需要写一个解析args数组参数的函数。参考链接如下:

            http://blog.csdn.net/baidu_28236027/article/details/52471094

         http://blog.csdn.net/qq_24877569/article/details/51931337

  • 其次,就是对输入的文件进行计算单词数,字符数,行数,按行读入字符,字符的长度即是字符的个数,再通过判断前后的字符关系来判断单词数,按行读入依次计数来表示行数。再通过每行的内容及正则表达式来判断是代码行、注释行或是空行。参考链接如下:

          https://www.cnblogs.com/hgcrown/p/5311155.html

  • 最后创建一个result.txt文件,通过解析参数的结果来判断如何输出,将输出写入result.txt文本中。

 

  • 因为java不会自动生成.exe文件,因此需要下载一个exej4软件来先将代码打包成.jar文件,再打包成.exe文件,在我的电脑上点击这个.exe文件会产生错误,但是不影响输出,这个情况到现在我还没解决。

          但是能在命令行中使用此exe文件,由于时间比较紧,我还没找出我的电脑缺少的组件。参考链接:

      https://jingyan.baidu.com/article/2a138328f3e2b0074a134ffe.html

4.程序设计实现过程

只有一个wordcount类

函数:main:主函数,包含args的初步解析并通过解析的结果选择要输出的内容,具体实现方面在上述解题思路中已经体现。

            error函数:当差找不到正确地文件时,向用户反馈错误。

5.代码说明:

 

package word;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.io.FileWriter;

public class WordCount {
           
public static void main(String[] args) throws Exception {
         //解析args数组中的参数
         try {
             if (args.length == 0) {                           //提示未输入参数
               System.out.println("请输入参数");  
               return;  }
              String name =args[args.length-1];                //默认args数组中的最后一个参数为读取文件
             //定义各个记录项
              int Char = 0;  
              int word = 0; 
              int line = 0;
              int emptyline = 0;   
              int codeline = 0;
              int explainline =0;
              int flag = 0; 
              String output="result.txt";
              String except= null;
              String next = System.getProperty("line.separator");      //将行分隔符传入str
               for(int m=0;m<args.length-1;m=m+1){
                      
                  if(args[m].equals("-o")) {
                      output=args[m+1];  }
                  if(args[m].equals("-e")) {
                      
                      except=args[m+1];  }
                  }
              FileInputStream fis = new FileInputStream(name);
              BufferedReader br = new BufferedReader(new InputStreamReader(fis));
             
              while(br.read()!=-1)        //read()=-1代表数据文件读取完毕
              {
               String s = br.readLine();//按行读取
               Char += s.length();//字符个数就是字符长度
               if (s.length()==0) emptyline++;
               String[] aa=s.split(" |,");
               
               
               line++;
               if(line>1){Char++;}
               for (int i = 0 ; i <aa.length ; i++ ) {
                      
                      if(!(aa[i] == null || aa[i].isEmpty()))
                      {word=word+1;
                       flag=flag+1;
                       
                       if(!(except==null||except.isEmpty()))
                       {  FileInputStream ff = new FileInputStream(except);
                          BufferedReader bc = new BufferedReader(new InputStreamReader(ff));
                          String ss = bc.readLine();
                           String[] bb=ss.split(" ");
                           for(int k=0;k<bb.length;k++)
                           {
                               if(aa[i].equals(bb[k])) {word--;}
                           }
                       }
                      }
                      if(aa[i].equals("//")) {explainline=explainline+1;}
                      
                    }
               if(flag>1) codeline=codeline+1;
               flag=0;
              }
                  //每次输出中都会将输出文本文件清空,重新写入计算结果
               FileWriter fw = new FileWriter(output);
              for(int m=0;m<args.length-1;m++)
              {   
                  if (args[m].equals("-c")){ fw.write(name+",字符数: "+Char); fw.write(next); }
                  if (args[m].equals("-w")){ fw.write(name+",单词数: "+word);fw.write(next); }
                  if (args[m].equals("-l")) {fw.write(name+",行数:    "+line);fw.write(next);}
                  if(args[m].equals("-a")) { fw.write(name+",代码行数:    "+codeline);fw.write(next);
                                             fw.write(name+",空行数:    "+emptyline);fw.write(next);
                                             fw.write(name+",注释行:    "+explainline);fw.write(next);
                                           }
              }
              fw.close();
              br.close();//关闭文件流
              
         }
         catch(FileNotFoundException e){
             System.out.println("未找到文件,请输入正确文件名!");
         }
    }

}


6.测试设计过程

  • 测试过程对于每一项功能进行单元测试,再进行组合测试,确保覆盖了所有可执行的代码,总共设计10个测试用例:

         wc.exe                                                输出:请输入参数

           wc.exe asdasd                                 输出:未找到文件,请输入正确文件名!

           wc.exe -c test.txt                              ./test.txt, 字符数: 30                               

          wc.exe -w test.txt                             ./test.txt, 单词数: 2

         wc.exe  -l  test.txt                             ./test.txt, 行数: 1

           wc.exe  -o abc.txt                              生成abc.txt文件

         wc.exe -a  test.txt                             ./test.txt, 代码行/空行/注释行: 1/0/0  

           wc.exe -w -c test.txt                          ./test.txt, 字符数: 30

                                                                    ./test.txt, 单词数: 2

        wc.exe  -w  -c  -l test.txt                      ./test.txt, 字符数: 30
                                                                    ./test.txt, 单词数: 2
                                                                    ./test.txt, 行数: 1

       wc.exe  -a -c -w -l test.txt                     ./test.txt, 字符数: 30
                                                                    ./test.txt, 单词数: 2
                                                                    ./test.txt, 行数: 1
                                                                    ./test.txt, 代码行/空行/注释行: 1/0/0

在命令行中运行结果基本正确,本代码未实现文件夹遍历功能,因此没有设计这样的测试用例,之后会继续完善该代码从而修改本博客。

上述测试所用文本文件在所给github地址中,读者可按照上述例子给出更多测试用例进行测试。

7.心得或体会

本次作业给我最大的感受就是时间较为紧迫,在实现的过程中遇到了不少坎坷,比如java环境配置过程中缺少组件、对java语言的不熟悉、上传到github中是git使用权限受阻、jar文件打包过程中生成的exe文件只能用命令行打开等,就不说遇到的其他bug了,最终还是学习到了一些东西,对后续的学习应该有所帮助。