软件测试第二周个人作业:WordCount

github地址:https://github.com/Wegnery/WordCount

一.PSP表格

 

PSP2.1

PSP阶段

预估耗时

(分钟)

实际耗时

(分钟)

Planning

计划

   

· Estimate

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

 5  5

Development

开发

   

· Analysis

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

 60  50

· Design Spec

· 生成设计文档

 -  -

· Design Review

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

 -  -

· Coding Standard

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

 20  20

· Design

· 具体设计

 10  10(边编程边设计)

· Coding

· 具体编码

 360  400

· Code Review

· 代码复审

 100  80

· Test

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

 60  60

Reporting

报告

   

· Test Report

· 测试报告

 30  30

· Size Measurement

· 计算工作量

 20  20

· Postmortem & Process Improvement Plan

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

 40  45
 

合计

 705  720

二.解题思路

首先第一次拿到题目的时候,限定语言为java,我已经忘光了,电脑上也没有环境,所以要重新配置环境,参考链接:http://www.runoob.com/java/java-environment-setup.html。题目描述要求统计文件中的字符数,先读入文件,然后字符数,单词数,行数这三个可以一起统计,因为可以一次读一行。扩展功能中的各种代码行,注释行可以用正则式来匹配,递归处理文件夹下文件可以写一个递归函数,停用词表可以先读出所有停用词,放到数组里,然后匹配所有单词,匹配则不用加一。找资料的过程大概就是JAVA的各种使用方法,这个会在文末列出,由于写这篇文章的时候我的页面都已经关掉了,部分已丢失,虽然计算机的这些语言都是相通的,但是我真的至少打开了五十个页面来完成这个作业。同时代码的前半部分参考了别的同学的代码,详情见参考链接。

三.程序设计实现过程

代码由两个.java文件构成,一个main.java,主函数,实现读文件,读参数的功能,有getparameters函数获取-a -w这种参数,然后还有文件地址,find函数找递归文件夹下的文件,findstop函数找停用词文件,wc.java实现统计功能,countall函数实现基本功能,complex实现复杂的统计。

代码中的几点说明:

-c:空格算字符,多个空格算多个字符,换行没有算作字符

-w:一切用,空格隔开的均算字符,比如a,  ,a算三个字符

-l:直到最后一行,最后一行有个换行的也算一行

-a:注释中/**/注释我的理解目前还有些问题,只将/**/算作注释行,某一行如果只有*/不算注释行,算作代码行。

   空行:只有一个字符或者没有字符只有换行的算作空行

   代码行:两个字符以上的都算作代码行。

-e:这个功能有一些问题,可能会少判定一个,但是没有debug出来原因。

-s:递归处理文件夹下文件,文件夹里有文件夹继续递归处理。

四.代码说明

如下是函数getparameters(),在main.java中,主要作用是获取控制台输入的参数,-a,-w等参数加入Vector中,在wc.java中的wc函数处理。

 1 public static void getparameters(String[] args){
 2         outpath="result.txt";//默认路径
 3         parameters=new Vector<String>();
 4         source=new Vector<File>();//记得初始化,不然有空指针错误
 5         stoplists=new Vector<String>();
 6         for(int i=0;i<args.length;i++){
 7             if(args[i].equals("-o")){//-o是给输出路径名
 8                 if(++i==args.length){
 9                     System.out.println("没有文件名字");
10                     return;
11                 }
12                 outpath=args[i];
13 
14             }
15             else if(args[i].equals("-c")||args[i].equals("-w")||args[i].equals("-l")||args[i].equals("-a"))
16                 parameters.addElement(args[i]);
17             else if(args[i].equals("-e")){
18                 if(++i==args.length){
19                     System.out.println("没有文件名字");
20                     return;
21                 }
22                 stopword=args[i];
23                 try{findstop(stopword);}
24                 catch(Exception e){
25                     e.printStackTrace();
26                 }
27             }
28             else if(args[i].equals("-s")){
29                 m=false;
30                 i++;
31                 nowpath=args[i].substring(0,args[i].indexOf("*")-1);
32                 String mark=args[i].substring(args[i].indexOf("."));//什么类型的文件
33                 find(nowpath,mark);//在当前目录找
34             }
35             else if(m!=false)
36                 source.addElement(new File(args[i]));
37         }
38         return;
39     }

 

在-s参数中需要递归调用find()函数来处理一个文件夹中的内容,通过判断是文件还是目录来分别处理。

 1 public static void find(String nowpath,String mark){
 2         File f=new File(nowpath+"\\");
 3         File nowf=new File("");
 4         File filelist[]=f.listFiles();
 5         if(filelist==null) {System.out.println("目录为空");return;}
 6         for(int i=0;i<filelist.length;i++) {
 7             nowf = filelist[i];
 8             if (nowf.isFile() && nowf.getName().endsWith(mark)) {
 9                 source.addElement(nowf);
10             } else if (nowf.isDirectory()) {
11                 find(nowf.getAbsolutePath(), mark);//递归
12             }
13         }
14         }

main.java中还有一个函数,findstop()来实现判断停用词。考虑了停用词不是个文件的情况,在测试用例中,该分支执行正常。

public static void findstop(String stopword) throws IOException{

            File stopf=new File(stopword);
            InputStreamReader reader=null;
            if(stopf.isFile()){
                reader=new InputStreamReader(new FileInputStream(stopf));
                BufferedReader br=new BufferedReader(reader);
                do{
                    String s=br.readLine();
                    String stoplist[]=s.split(" ");
                    for(String i:stoplist){
                        stoplists.addElement(i.toLowerCase());
                    }
                }while(br.read()!=-1);
                reader.close();
            }
            else{
                System.out.println("停用词不是个文件");
            }
        }
    }

在wc.java中,有两个重要的统计函数,一个统计基本功能countall(),一个统计复杂变量complex(),在这里不一一列举,详见github代码,值得一提的是控制函数count.java,根据参数来确定flag,然后根据flag在countall函数中进行选择性输出。(其实也没什么值得一提的。。。)

 1 public void count(Vector<String> parameters) throws IOException{
 2         for(int i=0;i<source.size();i++) {
 3 
 4             if (parameters.contains("-c")) {
 5                 flag = 1;
 6                 countall(source.get(i));
 7             }
 8             if (parameters.contains("-w")) {
 9                 flag = 2;
10                 countall(source.get(i));
11             }
12             if (parameters.contains("-l")) {
13                 flag = 3;
14                 countall(source.get(i));
15             }
16             if(parameters.contains("-a")){
17                 complex(source.get(i));
18             }
19 //        countall(source);
20         }
21     }

五.测试设计过程

测试用例应该覆盖基本分支,但是又不能太短,太短的测试代码可能会有弊端,于是找了一个曾经写过的一百多行的C++算法程序,在代码中进行修改,形成test文件夹下的3个用例。包括注释的测试(//的测试,只有一个字符然后//的测试),空行的测试(只有一个字符的,没有字符的),包括停用词不是个文件的测试,停用词中是复杂式子的测试。基本每一个if-else分支的测试都有保证,但是有一些后加的功能没有加到代码中,包括换行符算作一个字符的要求。【注:所有test测试用例的结果都在result.txt文件中,用了-s跑了整个文件夹的用例,其中testo.txt是测试-o输出文件的用例。stop.txt是测试停用词表,testo是测试停用词表的输出文件,测试的是BIN文件夹下的file.c用例。】

测试用例举例:

 

 1 }
 2 {
 3 a
 4 //测试注释行
 5 bool cmp(const NODE &a,const NODE &b){
 6     return a.c<b.c;
 7 }
 8 int father[MAXN];
 9 
10 int find(int u){
11     if (father[u]==u) return u;
12     else father[u]=find(father[u]);//这应该不算注释行
13     return father[u];
14 }

 

第1,2,3行应该算作空行,第四行算作注释行,第12行不被算作注释行。

 1 /*测试这种注释 2 */ 3 //我的程序里默认把上面这个当作空行。 

int a
{//try
a
long long kruscal(){
    long long ret=0;
    sort(e,e+m,cmp);
    for (int i=1;i<=n;++i) father[i]=i;
    for (int i=0;i<m;++i){
        if (find(e[i].u)!=find(e[i].v)){
            father[find(e[i].u)]=find(e[i].v);
            addedge(e[i].u,e[i].v,e[i].c);
            addedge(e[i].v,e[i].u,e[i].c);
            ret+=e[i].c;
        }
    }
    return ret;
}
汉字有几个字符
a,   , a,
//上面这个算几个字符

在控制台里的测试包括:

 1 wc.exe -a file.c
 2 wc.exe -w file.c
 3 wc.exe -c file.c
 4 wc.exe -l file.c
 5 //-*功能单独测试
 6 wc.exe -a h.c
 7 //不存在文件的测试【文件打不开情况】
 8 wc.exe -a
 9 //没有加源文件的情况
10 wc.exe -a -s E:\SQ\WordCount\BIN\test\*.c
11 wc.exe -w -s E:\SQ\WordCount\BIN\test\*.c
12 wc.exe -c -s E:\SQ\WordCount\BIN\test\*.c
13 wc.exe -l -s E:\SQ\WordCount\BIN\test\*.c
14 //以上为-* -s组合测试测试
15 E:\SQ\WordCount\BIN>wc.exe -w -c -l -a -s E:\SQ\WordCount\BIN\test\*.c
16 //上面为集体测试
17 wc.exe -l -s E:\SQ\WordCount\BIN\asdad\*.c
18 //以上为不存在文件目录的测试【asdad不存在】
19 wc.exe -l -s E:\SQ\WordCount\BIN\*.c
20 //存在嵌套文件的情况【BIN中有test文件夹】
21 E:\SQ\WordCount\BIN>wc.exe -e stop.txt -o testo.txt
22 //以上虽然没有输出但是至少证明了程序没毛病。
23 E:\SQ\WordCount\BIN>wc.exe -e stop.txt -o testo.txt -a file.c
24 //程序有输出了
25 E:\SQ\WordCount\BIN>wc.exe -e stopaaaa.txt -o testo.txt -a file.c
26 //停用词文件找不到的情况
27 E:\SQ\WordCount\BIN>wc.exe -e stop.txt -o -a file.c
28 //-o后面没有加输出文件的情况

以上在控制台里的测试均没毛病,可以正常运行,虽然不保证结果跟用老师的代码跑出来的一样,但是按照我自己的理解,没什么大毛病。

 

六.参考链接

1. http://www.cnblogs.com/winterfells/p/7965596.html

2. http://www.runoob.com/java/java-environment-setup.html

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

4. http://blog.csdn.net/daxiang_zhang/article/details/2149896

5. http://blog.csdn.net/hpchenqi_16/article/details/48504111

6. http://blog.csdn.net/alex__0805/article/details/50895222

7.https://bbs.csdn.net/topics/390567815

8.https://www.cnblogs.com/zhaoyan001/p/6077492.html

9.参考同学代码:https://github.com/Asfalas/WordCount

 

 

posted @ 2018-03-18 23:56  Ning_N  阅读(399)  评论(0编辑  收藏  举报