软件质量测试第二周作业WordCount

时间:2022-06-13 19:07:37

https://github.com/aftermath51/wCount

一.PSP表格

 

PSP2.1

PSP阶段

预估耗时

(分钟)

实际耗时

(分钟)

Planning

计划

 15  20

· Estimate

· 估计这个任务需要多少时间

 3天  3天

Development

开发

 3天 3天 

· Analysis

· 需求分析 (包括学习新技术)

 45  40

· Design Spec

· 生成设计文档

 60  70

· Design Review

· 设计复审 (和同事审核设计文档)

 30  40

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

 45  60

· Design

· 具体设计

 60  60

· Coding

· 具体编码

 400 500

· Code Review

· 代码复审

 30  25

· Test

· 测试(自我测试,修改代码,提交修改)

 150  180

Reporting

报告

45  50

· Test Report

· 测试报告

 30  30

· Size Measurement

· 计算工作量

 20  20

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

 30  30
 

合计

1000

 1100

二.解题思路

 1.先完成基本功能,再完成扩展功能。

基本功能

wc.exe -c file.c     //返回文件 file.c 的字符数
wc.exe -w file.c     //返回文件 file.c 的单词总数
wc.exe -l file.c     //返回文件 file.c 的总行数
wc.exe -o outputFile.txt     //将结果输出到指定文件outputFile.txt

扩展功能

wc.exe -s            //递归处理目录下符合条件的文件
wc.exe -a file.c     //返回更复杂的数据(代码行 / 空行 / 注释行)
wc.exe -e stopList.txt  // 停用词表,统计文件单词总数时,不统计该表中的单词

2、先在IDE中实现对电脑中指定目录下的文件的读写操作;

3、编写程序,实现可以在Main函数的调用下分别正确运行各个基础功能;

4、编写程序,实现在终端执行该程序时,程序可以获取到终端输入的全部参数,并能对终端所在的目录下的文档进行读写;

5、调整Main函数中对各个功能的调用机制,使得在终端输入相应的参数时,程序可以正常执行所对应的功能;

6、确定程序可以正确运行所有功能后,把工程打包成.jar文件,再将.jar文件转换成.exe文件,在终端中运行.exe文件,确保.exe可以正确执行所有功能;

三.程序设计实现过程

1.写Main.java

单词统计:按字符流读取文件,对每一个字符做判断,如果不是换行符或空格则继续往下读取;当读取到换行符或者空格是,将前面读到的字符拼作一个单词

,单词计数加一

字符计数:每读入一个字符,判断是不是回车换行符,不是则字符计数器加一

递归获取文件:

获取文件目录,判断是不是目录,若符合要求的文件,则先将文件名存储,与之后的执行一同进行

软件质量测试第二周作业WordCount

2.写Test.java

编写测试,覆盖每一个函数及功能,每一个的形参包括:读取的文件名,预期的输入;
每一个调用的输出结果是:
测试名称、预期结果、测试输出结果、是否符合预期结果;

public class Test {

    public boolean Test_CharCount(int expResult, String path) {
        return PrintErrorDetail(GetMethodName(), expResult, Main.ReadChar(path));
    }

    public boolean Test_WordCount(int expResult, String path) {
        return PrintErrorDetail(GetMethodName(), expResult, Main.ReadWord(path));
    }

    public boolean Test_LineCount(int expResult, String path) {
        return PrintErrorDetail(GetMethodName(), expResult, Main.ReadLine(path));
    }

    public boolean Test_ReadDiffLine(int emptyLine, int noteLine, int codeLine, String path) {
        int[] expResult = new int[3];
        expResult[0] = codeLine;
        expResult[1] = emptyLine;
        expResult[2] = noteLine;

        String[] lineNames = {"codeLine", "emptyLine", "noteLine"};

        int[] testResult = Main.GetDifferentLine(path);
        for (int i = 0; i < 3; i++) {
            PrintErrorDetail(GetMethodName() + " " + lineNames[i], expResult[i], testResult[i]);
            if (expResult[i] != testResult[i])
                return false;
        }
        return true;
    }

    public boolean Test_StopList(int expResult, String stoplistPath, String readFilePath) {
        int testResult = Main.StopWordTable(stoplistPath, readFilePath);
        return PrintErrorDetail(GetMethodName(), expResult, testResult);
    }

    public boolean Test_Recursion(int expFileCount, String path, String formateName) {
        Main.fomatName = formateName;
        return PrintErrorDetail(GetMethodName(), expFileCount, Main.FindFile(path));
    }

    public boolean Test_OutputFile(StringBuilder sb, String outputPath) {
        System.out.println("test: " + GetMethodName());
        if (Main.OutPutFile(outputPath, sb)) {
            System.out.println("out put file success");
            return true;
        }
        System.out.println("out put file failed");
        return false;
    }

    public boolean Test_Recursion_StopList(String formatName, String stopListName, int[] expCount) {
        Main.fomatName = formatName;
        Main.FindFile("./");
        boolean result = true;
        for (int i = 0; i < Main.canBeFoundFile.size(); i++) {
            if (!Test_StopList(expCount[i], stopListName, Main.canBeFoundFile.get(i))) {
                result = false;
            }
        }

        return result;
    }

    public boolean Test_Recusion_WordRead_OutputFile(String formatName, String outputFileName, int[] expResult) {
        Main.fomatName = formatName;
        Main.FindFile(Main.fileDir);
        boolean result = true;

        for (int i = 0; i < Main.canBeFoundFile.size(); i++) {
            if (expResult[i] != Main.ReadWord(Main.canBeFoundFile.get(i))) {
                result = false;
            }
        }
        if (result) {
            result = Main.OutPutFile(outputFileName, Main.sb);
        }
        return result;
    }

    private static String GetMethodName() {
        String funName = new Throwable().getStackTrace()[1].getMethodName();
        return funName;
    }

    private boolean PrintErrorDetail(String testName, int expResult, int testResult) {
        System.out.println("test: " + testName);
        System.out.println("exp result: " + expResult);
        System.out.println("test result: " + testResult);
        if (expResult == testResult)
            return true;
        return false;
    }
}

参考文献链接:

Git教程 - 廖雪峰的官方网站

https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

java获取当前路径的几种方法 - CSDN博客

http://blog.csdn.net/chengzhaoan2010/article/details/78344791

java.io.File类基本使用——遍历某路径的所有文件夹及文件 - CSDN博客

http://blog.csdn.net/u012325167/article/details/50856515

手把手教你如何把java代码,打包成jar文件以及转换为exe可执行文件 - CSDN博客

http://blog.csdn.net/sunkun2013/article/details/13167099

 

PS:参考了17047同学的代码:

http://www.cnblogs.com/Donoth/p/8597025.html