软件测试第二周个人作业:WordCount
1、Github地址
https://github.com/Hust17003/WordCount
2、PSP表格
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
40 | 60 |
· Estimate |
· 估计这个任务需要多少时间 |
840 | 1070 |
Development |
开发 |
720 | 950 |
· Analysis |
· 需求分析 (包括学习新技术) |
120 | 180 |
· Design Spec |
· 生成设计文档 |
- | - |
· Design Review |
· 设计复审 (和同事审核设计文档) |
- | - |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
30 | 30 |
· Design |
· 具体设计 |
60 | 60 |
· Coding |
· 具体编码 |
360 | 420 |
· Code Review |
· 代码复审 |
30 | 60 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
120 | 200 |
Reporting |
报告 |
120 | 120 |
· Test Report |
· 测试报告 |
60 | 60 |
· Size Measurement |
· 计算工作量 |
30 | 30 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 | 30 |
合计 |
880 | 1130 |
3、解题思路
看到题目之后,我首先在百度上查找了JAVA文件操作的相关内容;对命令行进行分析主要利用了split()方法,将命令行中的字符串按空格分解为字符串数组,再判断每个部分的含义,并调用相关函数执行命令,具体的文件内容计数见下面的代码说明部分,另外由于时间关系,只实现了作业要求中的基本功能。
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
4、程序设计实现过程
设计的时候,考虑到程序实现并不需要创建属性类,所以打算把所有功能集合到一个Java文件内,先利用argv[]将用户的输入的命令按空格进行分割存储,从wc.exe开始利用if和switch一步步的判断命令是否符合格式以及要求实现哪些功能,并调用相应功能模块进行功能跳转,根据命令按行读取相应文件内容,每读一个字符就使字符数加一,按空格和‘,’对读取内容分解,得到的字符数组长度就是单词数,因为是按行读取,所以每读一行加一即可,最后对结果进行输出。
5、代码说明
(1)命令行处理与判断
1 if(argv!= null){ 2 /*argv[0]存储"wc.exe",argv[1]存储文件内容操作"-s-w-l(中间无空格)" 3 argv[2]存储"需要读取判断的文件名",argv[3]存储"-o",argv[4]存储输出文件名*/ 4 if(argv[0].equals("wc.exe")){//检测输入语法正确性 5 String[] cmd = argv[1].split("-");//过滤"-",将标志字存入数组 6 if(cmd.length>0){ 7 int i=1; 8 while(i<cmd.length){//利用循环使得能够判断strArray[1]中的所有标志位 9 if(argv[2] != null) 10 pathName = argv[2]; 11 else 12 System.out.println("error input!"); 13 switch(cmd[i]){ 14 case "c": 15 isChar = true; 16 break;//跳出switch 17 case "w": 18 isWord = true; 19 break; 20 case "l": 21 isLine = true; 22 break; 23 default: 24 System.out.println("error input!"); 25 } 26 i++; 27 } 28 }else{ 29 System.out.println("error input!"); 30 } 31 32 if(argv.length > 3)//如果存在-o参数,判断并设置标志位 33 if(argv[3].equals("-o") && argv[4] != null){ 34 isOut = true; 35 outputPath = argv[4]; 36 }
(2)文件读取与计数
1 File filename = new File(filePath); 2 InputStreamReader reader = new InputStreamReader( 3 new FileInputStream(filename)); 4 BufferedReader br = new BufferedReader(reader); 5 String str; 6 while(( str=br.readLine() ) != null)//按行读取文件内容 7 { 8 countChar += str.length();//字符长度就是字符个数 9 countChar++;//每一行会有一个换行符,所以加一 10 countWord += str.split(",| {1,}").length-1;//split() 由一个或一个以上空格或",",把一个字符串分割成字符串数组,字符串数组的长度,就是单词个数 11 countLine++;//因为是按行读取,所以每次增加一即可计算出行的数目 12 } 13 br.close();
(3)将结果输出到其它文件
1 File file = new File(str); 2 if (!file.exists()) { 3 file.createNewFile(); 4 } 5 FileWriter fw = new FileWriter(file.getAbsoluteFile()); 6 bw = new BufferedWriter(fw); 7 bw.write(content); 8 bw.close();
6、测试用例
wc.exe –c file.txt
测试了多种字符的识别,确保能够应对大多数情况
测试文件内容:!@#$%^&*()_+{}|"?><[]\;',./~`a,结果与预期一致为30
wc.exe -w-l file.txt
测试文件内容:
测试多行代码的单词数判断,并且单词与单词之间有 ‘=’、‘()’、‘;’等符号
-
writename.createNe|wFile(); Buffe,redWriter out = new BufferedWrit,er(new FileWriter(writename)); out.close();
测试结果:单词数16,行数4,与预期一致
wc.exe -c-w-l file.txt -o outputfile.txt,以上述文件内容测试,输出文件内容与预期相符合
7、参考文献
a:作业内容与要求 http://www.cnblogs.com/llag9810/p/8604262.html
b:文件的读写操作 https://www.yiibai.com/java_io/java_nio_files_content.html
c:java中split函数的用法 https://jingyan.baidu.com/article/9989c746c5d707f648ecfe05.html
d:判断字符串中单词个数 https://www.cnblogs.com/gccbuaa/p/7097332.html
e:jar转exe http://blog.csdn.net/sunkun2013/article/details/13167099
8、参考了软工1502班李桐岩同学U201517013的代码