软件测试第二周个人作业: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