WordCount项目

Java程序设计与测试实践

项目地址:我的GIT项目地址

  • PSP表格

    1487827-20180930153730265-1469343084.png
    • 分析:发现自己预估的时间和实际时间差别较大。因为语言上的熟悉程度不够,所以浪费了很多时间在学习相关语法和修改Bug中,还有慢慢的修改自己的错误逻辑。在准备阶段、测试和修改方面耗费了很多时间,造成了开发过程时间较长。自己实际写文档速度与预估的不太一致,包括写设计、测试、总结文档等。主要是对于这些东西的熟练度不够,平常写的少,一下子要写也写的特别的慢。

  • 项目思路

    • 功能的确定:

      • 对程序设计语言源文件统计字符数、单词数、行数。统计结果以指定格式输出到默认文件中。
      • 可执行程序命名为:wc.exe,该程序处理用户需求的模式为:wc.exe [parameter] [input_file_name]。
      • 一个测试程序命名为:wc_1.exe ,该程序直接运行即可运行设定好测试数据。
      • 存储统计结果的文件默认为result.txt,放在与wc.exe相同的目录。
      • 其他自定义存储文件放在与wc.exe同目录下。
    • 设计流程:

      • 用户输入
      • 数据获取
        • find the target
          • X.c
          • X.txt
        • get the command
          • -c
          • -w
          • -l
          • -o
      • 非法判断
        • input wrong command!
      • 错误提示
        • can't find the file!
      • 功能执行
        • use BufferrReader to count the numbers of char in every line and sum it.(-c)
        • use split function to divided every line with space and " , " .(-w)
        • use readLine function to add lines.(-l)
        • use BufferrWriter and FileWriter to write.(-o)
      • 数据显示
        • the charNum is
        • the wordNum is
        • the lineNum is
      • 数据存储
    • 注意事项:

      • 对于字符统计功能所需要注意的地方:空格,水平制表符,换行符,均算字符。
      • 对于单词统计所需要注意的地方:由空格或逗号分割开的都视为单词,且不做单词的有效性校验,例如:thi#,that视为用逗号隔开的2个单词。
      • 其他注意事项:多个参数可以共用同一个输入文件,-o 必须与文件名同时使用,且输出文件必须紧跟在-o参数后面,不允许单独使用-o参数。
  • 设计实现

    • 基本分类

      • 程序只有一个类,所有的功能放在不同的方法里,并在主函数中被调用。
      • CharCount类负责统计字符个数。
      • WordsCount类负责统计单词个数。
      • LineCount类负责统计行数。
      • OutFile类负责将相关信息写入文档。
    • 运行版本

      • 所有逻辑判断写在主函数里,在主函数中调用其他方法。
    • 测试版本

      • 将逻辑判断写在Command类中,在Command类中根据需求调用其他4个不同的类。
      • 增加一个Test类,里面写了10种测试。
      • 通过在主函数调用Test类的方法来自动进行测试。
  • 部分代码

    主函数逻辑判断:
    //find the target
    for(int i = 0; i < str.length; i++) {
        if(str[i].endsWith(".c")) {
            fileName=str[i];
            flag1=true;
        }
        else if(str[i].endsWith(".txt")&&str[i-1].equals("-o")) {
            outFile=str[i];
        }
    }
    int j=0;

    //find the function and do it
    for(int i = 0; i < str.length; i++) {
            if(str[i].equals("-c")) {
            if(!flag1) {
                System.out.println("input wrong command!");
                System.exit(0);
            }
            flag2=true;
                charNum=CharCount(fileName);
                if(charNum<0)return;
                func[j]="字符数为:"+charNum+"\r\n";
                j++;
            }
            else if(str[i].equals("-w")) {
                if(!flag1) {
                    System.out.println("input wrong command!");
                System.exit(0);
            }
                flag2=true;
                wordNum=WordsCount(fileName);
                if(wordNum<0)return;
                func[j]="单词数为:"+wordNum+"\r\n";
            j++;
            }
            else if(str[i].equals("-l")) {
                if(!flag1) {
                    System.out.println("input wrong command!");
                System.exit(0);
            }
                flag2=true;
                lineNum=LineCount(fileName);
                if(lineNum<0)return;
                func[j]="行数为:"+lineNum+"\r\n";
            j++;
            }
            else if(!flag2) {
                System.out.println("input wrong command!");
            System.exit(0);
            }
    }
    OutFile(fileName,outFile,func,j);

单词统计

//use split function to divided every line with space and , .
    public static int WordsCount(String fileName) {
        int wordNum= 0;
        String line=null;
        try {
            FileReader fr = new FileReader(fileName);  
            BufferedReader br = new BufferedReader(fr);
            while((line = br.readLine()) != null){
                wordNum+=line.split(" |,").length;
            }
            br.close();
            fr.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            System.out.println("can't find the file!");
            System.exit(0);
            
        } 
        System.out.println("the wordNum is: " + wordNum);
        return wordNum;
    }
  • 测试设计

    分为正确和错误指令,对每种情况进行多次测试,尽量的将每种情况考虑进去了,但是测试的次数还不够。
    • 正确输入

      • 5种不同的正确输入
    • 错误输入

      • 5种不同的错误输入
        如图所示:
        1487827-20180930151348772-472413811.png1487827-20180930151417078-1394664132.png
  • 运行效果

    运行版本cmd运行:1487827-20180930151446079-1739139893.png
    测试版本cmd运行:1487827-20180930151453401-1930365306.png

  • 反思总结

    • 通过这一次的项目,我学习了很多我从前没有了解过得东西。包括利用PSP文档对自己的整个项目开发过程进行预估分析反思,git/博客园等平台和工具。同时我也尝试了把java项目转成exe,虽然在实施这些东西中遇到了很多问题,但是exe目前也能够运行了。(按照博客中的步骤一步一步来的,将jre打包进了exe里。但是在没有安装java环境的电脑里,还是运行的有问题,会提示没有jvm!)在这个项目的实现过程中,也遇到了很多问题,经过了自主学习和长时间的调试测试,问题基本已经解决了。在测试设计上,因为软件测试方面,现在接触还不是很多,也不太擅长,我尽量用我自己能够思考到最全面的方式进行了测试。

    • 我会好好利用这些网上资源,在这个开放的平台上阅读更多文章、提升自我。在开放的社区,浏览更多优秀的代码,项目。

  • 参考相关资料:

转载于:https://www.cnblogs.com/SiyaYan/p/9729459.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值