软件测试第三次作业(wordCount的c#实现)

wordCount的c#实现

合作者:201631092112      ,    201631092126

码云(gitee)地址:https://gitee.com/ulysses497/wordCount

本次作业地址:https://edu.cnblogs.com/campus/xnsy/Test/homework/2203

(1)互审代码情况

在此次作业中,我们互相写了完整的wordCount代码后,互相进行了代码的审查,发现了很多问题,下列举几个模块审查问题

在合作同学的代码中他将对数据的处理写为一类,读写,操作,写出,写为一类,显得主函数太过冗长,我将代码的读入,操作,主函数归为三类

使得代码更为精简 

基本功能概述:

 

 

  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 -a file.c       //统计代码行/空行/注释行
        wc.exe -s              //调用其他-指令

注释:

  代码行:本行包括多于一个字符的代码。

  空   行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。

  注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:}//注释

  在这种情况下,这一行属于注释行。

  

 

如下图中的空行/注释行/代码行的计数方法中,我们发现将注释行的if语句嵌套,后对codecount的计数会发生影响

于是进行了改正:

 还有很多不便一一赘述,将在下列测试中继续枚举。

项目实现


main函数类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WordCount { class Program { static void Main(string[] args) { Console.WriteLine("WordCount"); Console.WriteLine("统计字符数 wc.exe -c file.c "); Console.WriteLine("统计单词总数 wc.exe -w file.c "); Console.WriteLine("统计总行数 wc.exe -l file.c "); Console.WriteLine("统计输出到文件 wc.exe -o file.c "); Console.WriteLine("统计代码行/空行/注释行 wc.exe -a file.c "); Console.WriteLine("调用其他-指令 wc.exe -s "); Console.WriteLine("请输入指令:"); readFile readfile = new readFile(); readfile.Read();//调用读入文件类的Read()方法  Console.WriteLine(); Console.WriteLine("按任意键退出"); Console.ReadKey(); } } }

readFile类(对读取的命令进行操作的审查)

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace WordCount { class readFile { public string name = ""; public void Read() { string getcmd = ""; Console.Write("wc.exe "); getcmd = Console.ReadLine(); this.check(getcmd);//调用审查命令函数,进行对cmd的操作是否错误的审查  } string cmd = ""; public void check(string getcmd) //判断输入格式是否正确  { try { this.name = getcmd; string[] file = getcmd.Split(new char[1] { ' ' }, StringSplitOptions.RemoveEmptyEntries);//分割读取的文件名与操作 string filename = ""; bool isopen = true; foreach (string s in file) { if(s.Length>2) { string[] f = s.Split(new char[1] { '.' }, StringSplitOptions.RemoveEmptyEntries); //(f[f.Length - 1] != "c" && f[f.Length - 1] == "t") || (f[f.Length - 1] != "txt") if(f[f.Length-1]!="c") { if(f[f.Length-1]!="txt") { isopen = false; } else { filename = s; } } else { filename = s; } } if (s.Length == 2 && s.Substring(0, 1) == "-")//判断是否为操作命令  { cmd = cmd + s; if (s != "-c" && s != "-w" && s != "-l" && s != "-a"&&s !="-s"&&s!="-o")//处理操作错误  { isopen = false; } if (isopen == false) { Console.WriteLine("----------------------------------------------------------"); Console.WriteLine(" 请输入正确的文件名或您的操作有误 "); Console.WriteLine("----------------------------------------------------------"); this.Read(); break; } } if (s.Length < 2)//处理操作错误  { isopen = false; Console.WriteLine("----------------------------------------------------------"); Console.WriteLine(" 请输入正确的文件名或您的操作有误 "); Console.WriteLine("----------------------------------------------------------"); this.Read(); break; } } if (isopen == true&&cmd!="") { if (cmd.Contains("-s") == false) { this.openFilename(filename); } } else { Console.WriteLine("----------------------------------------------------------"); Console.WriteLine(" 请输入正确的文件名或您的操作有误 "); Console.WriteLine("----------------------------------------------------------"); this.Read(); } if(cmd.Contains("-s")) { handleFile hdfile = new handleFile(); hdfile.checkCmd(cmd); } } catch (Exception e) { Console.WriteLine(e); Console.WriteLine("----------------------------------------------------------"); Console.WriteLine(" 请输入正确的文件名或您的操作有误 "); Console.WriteLine("----------------------------------------------------------"); this.Read(); } } public void openFilename(string name)//打开文件操作  { FileStream fs = new FileStream(@name, FileMode.Open); StreamReader sr = new StreamReader(fs); string allStr = sr.ReadToEnd(); sr.Close(); fs.Close(); handleFile hdfile = new handleFile();//调用操作文件类 hdfile.allstr = allStr; hdfile.cmd = cmd; hdfile.name = name; hdfile.checkCmd(cmd); } } }

handleFile类(处理文件类)

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions; using System.Threading.Tasks; namespace WordCount { class handleFile//处理文件  { public string name = ""; public string allstr = ""; public string cmd = ""; public bool isout; public void checkCmd(string cmdstr) //检查指令  { if(cmdstr.Contains("-o"))//是否进行输出到outfile.txt的操作  { this.isout = true; } else { this.isout = false; } if (cmdstr.Contains("-s")) { cmdstr = cmdstr.Replace("-s", ""); this.handleS(cmdstr); } else { for (int i = 0; i < cmdstr.Length; i++)//判断是什么命令  { if (cmdstr[i] == '-') { if (cmdstr[i + 1] == 'c') { this.handleC(); } else if (cmdstr[i + 1] == 'w') { this.handleW(); } else if (cmdstr[i + 1] == 'l') { this.handleL(); } else if (cmdstr[i + 1] == 'a') { this.handleA(); } } } } } public void handleC()//调用正则表达式对字符数的统计进行审查  { var cStr = this.allstr; Regex re = new Regex(@"(\r\n)|(\S)|(\u0020)|(\u3000)"); //换行和回车符不是同一个 int count = re.Matches(this.allstr).Count; Console.WriteLine(); Console.WriteLine(this.name+" "+ "字符数:"+count); this.rstFile(Convert.ToString(this.name + " " + "字符数:" + count)); this.outputFile(Convert.ToString(this.name + " " + "字符数:" + count), this.isout); } public void handleW() { string wStr = this.allstr; string[] sArray = wStr.Split(new char[3] { ' ', ',','\r' }, StringSplitOptions.RemoveEmptyEntries); //" "与","作为分割符 int count = 0; foreach (string s in sArray)//遍历统计单词数量  { count++; } Console.WriteLine(); Console.WriteLine(this.name + " " + "单词数:"+count); this.rstFile(Convert.ToString(this.name + " " + "单词数:" + count)); this.outputFile(Convert.ToString(this.name + " " + "单词数:" + count), this.isout); } public void handleL() { FileStream fs = new FileStream(@name, FileMode.Open); StreamReader sr = new StreamReader(fs); int lines = 0; while (sr.ReadLine() != null)//遍历统计行数(包含空行)  { lines++; } sr.Close(); fs.Close(); Console.WriteLine(this.name + " " + "行数:"+lines); this.rstFile(Convert.ToString(this.name + " " + "行数:" + lines)); this.outputFile(Convert.ToString(this.name + " " + "行数:" + lines), this.isout); } public void handleA()//空行/注释行/代码行的计数  { FileStream fs = new FileStream(@name, FileMode.Open); StreamReader sr = new StreamReader(fs); string lines = ""; int nullcount = 0; int notedcount = 0; int codecount = 0; while ((lines =sr.ReadLine()) != null) { lines = lines.Trim(' ');//每一行去掉两头空白字符 lines = lines.Trim('\t');//每一行去掉两头TAB字符 if (lines == "" || lines.Length <= 1) { nullcount++;//空行计数加一  } else if (lines.Length > 2 && (lines.Substring(0, 2) == "//" || lines.Substring(1, 2) == "//")) { notedcount++;//注释行计数加一  } else if (lines.Length == 2 && (lines.Substring(0, 2) == "//")) { notedcount++; //注释行计数加一  } else { codecount++;//代码行计数加一  } } sr.Close(); fs.Close(); string outstr = this.name + " " + "空行/注释行/代码行:" + nullcount.ToString() + "/" + notedcount.ToString() + "/" + codecount.ToString(); Console.WriteLine(); Console.WriteLine(this.name + " "+"空行/注释行/代码行:" +@"{0}/{1}/{2}", nullcount, notedcount, codecount); this.rstFile(outstr); this.outputFile(outstr, this.isout); } public void handleS(string cmd)//-s命令调用其它命令函数  { string rootPath = Directory.GetCurrentDirectory(); string[] files = Directory.GetFiles(rootPath, "*.c"); foreach (string file in files) { FileStream fs = new FileStream(@file, FileMode.Open); StreamReader sr = new StreamReader(fs); this.allstr = sr.ReadToEnd(); sr.Close(); fs.Close(); this.name = file; this.checkCmd(cmd); } } public void rstFile(string str)//输出函数  { string filePath = Directory.GetCurrentDirectory(); StreamWriter sw = new StreamWriter(@filePath+"//"+"result.txt", true, Encoding.UTF8); sw.WriteLine(str); sw.Close(); } public void outputFile(string str, bool isout)//-0命令,输出到output.txt  { if (isout) { string filePath = Directory.GetCurrentDirectory(); StreamWriter sw = new StreamWriter(@filePath + "//" + "output.txt", true, Encoding.UTF8); sw.WriteLine(str); sw.Close(); } } } }

 

性能测试

测试工具:VS2013的性能测试工具


原来对字符数等命令统计使用的是for循环遍历的方法

代码如下

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO; namespace WordCount { class DataProcess { //打开.c文件并将内容以字符串形式读取出来 public string openFile(string fstr) { FileStream fs = new FileStream(fstr, FileMode.Open); byte[] array = new byte[fs.Length]; fs.Read(array,0, array.Length); fs.Close(); string str = Encoding.UTF8.GetString(array); return str; } //统计字符数 public int cProcess(string fstr) { string str = openFile(fstr); int charCount = 0; charCount = str.Length; foreach(char c in str) { if(c=='\n') { charCount--; } } StreamWriter sw = new StreamWriter("result.txt", true); sw.WriteLine(fstr + " 字符数: " + Convert.ToString(charCount)); sw.Close(); return charCount; } //统计行数 public int lProcess(string fstr) { string str = openFile(fstr); int lineCount = 1; foreach (char l in str) { if (l == '\n') { lineCount++; } } StreamWriter sw = new StreamWriter("result.txt", true); sw.WriteLine(fstr + " 行数: " + Convert.ToString(lineCount)); sw.Close(); return lineCount; } //统计单词书 public int wProcess(string lstr) { string str = openFile(lstr); int count = 1; bool isBlank = true; foreach(char s in str) { if(s!=' ' && s!= '\n' &&s!=','&& isBlank==true) { count++; isBlank = false; } else if((s==' '||s=='\n'||s==',')&&isBlank==false) { isBlank = true; } } StreamWriter sw = new StreamWriter("result.txt", true); sw.WriteLine(lstr + " 单词数:" + Convert.ToString(count - 1)); sw.Close(); return count - 1; } //统计代码行/空行/注释行 public string aProcess(string astr) { FileStream fs = new FileStream(astr, FileMode.Open); StreamReader sr = new StreamReader(fs); string lines = ""; int codeLineCount = 0; int nullLineCount = 0; int noteLineCount = 0; while ((lines = sr.ReadLine()) != null) { lines = lines.Trim(' '); lines = lines.Trim('\t'); if (lines == "" || lines.Length <= 1) { nullLineCount++; } else if (lines.Length > 2 && lines.Substring(0, 2) == "//" || lines.Substring(1, 2) == "//") { noteLineCount++; } else if(lines.Length==2 && lines.Substring(0, 2) == "//") { noteLineCount++; } else { codeLineCount++; } } string complexLineCount = Convert.ToString(codeLineCount) + "/"+Convert.ToString(nullLineCount) +"/"+ Convert.ToString(noteLineCount); StreamWriter sw = new StreamWriter("result.txt", true); sw.WriteLine(astr + " 代码行/空行/注释行:" + Convert.ToString(codeLineCount)+"/"+Convert.ToString(nullLineCount)+"/"+Convert.ToString(noteLineCount)); sw.Close(); return complexLineCount; } //将统计的数据存入指定文件 public string oProcess(string oFile) { System.IO.File.WriteAllText(oFile, string.Empty); string str = openFile("result.txt"); StreamWriter sw = new StreamWriter(oFile, true); sw.WriteLine(str); sw.Close(); return oFile; } } }

 

 

 

对其进行性能测试

 

 

 

 后改用正则表达式的方法,并在对其他代码进行优化后再进行性能测试

代码如下:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace WordCount
{
	class handleFile//处理文件
	{
		public string name = "";
		public string allstr = "";
		public string cmd = "";
		public bool isout;

		public void checkCmd(string cmdstr) //检查指令
		{
			if (cmdstr.Contains("-o"))//是否进行输出到outfile.txt的操作
			{
				this.isout = true;
			}
			else
			{
				this.isout = false;
			}
			if (cmdstr.Contains("-s"))
			{
				cmdstr = cmdstr.Replace("-s", "");
				this.handleS(cmdstr);
			}
			else
			{
				for (int i = 0; i < cmdstr.Length; i++)//判断是什么命令
				{
					if (cmdstr[i] == '-')
					{
						if (cmdstr[i + 1] == 'c')
						{
							this.handleC();
						}
						else if (cmdstr[i + 1] == 'w')
						{
							this.handleW();
						}
						else if (cmdstr[i + 1] == 'l')
						{
							this.handleL();
						}
						else if (cmdstr[i + 1] == 'a')
						{
							this.handleA();
						}

					}
				}
			}

		}
		public void handleC()//调用正则表达式对字符数的统计进行审查
		{

			var cStr = this.allstr;
			Regex re = new Regex(@"(\r\n)|(\S)|(\u0020)|(\u3000)"); //换行和回车符不是同一个
			int count = re.Matches(this.allstr).Count;
			Console.WriteLine();
			Console.WriteLine(this.name + " " + "字符数:" + count);
			this.rstFile(Convert.ToString(this.name + " " + "字符数:" + count));
			this.outputFile(Convert.ToString(this.name + " " + "字符数:" + count), this.isout);
		}
		public void handleW()
		{
			string wStr = this.allstr;
			string[] sArray = wStr.Split(new char[3] { ' ', ',', '\r' }, StringSplitOptions.RemoveEmptyEntries); //" "与","作为分割符
			int count = 0;
			foreach (string s in sArray)//遍历统计单词数量
			{
				count++;
			}
			Console.WriteLine();
			Console.WriteLine(this.name + " " + "单词数:" + count);
			this.rstFile(Convert.ToString(this.name + " " + "单词数:" + count));
			this.outputFile(Convert.ToString(this.name + " " + "单词数:" + count), this.isout);
		}
		public void handleL()
		{
			FileStream fs = new FileStream(@name, FileMode.Open);
			StreamReader sr = new StreamReader(fs);
			int lines = 0;
			while (sr.ReadLine() != null)//遍历统计行数(包含空行)
			{
				lines++;
			}
			sr.Close();
			fs.Close();
			Console.WriteLine(this.name + " " + "行数:" + lines);
			this.rstFile(Convert.ToString(this.name + " " + "行数:" + lines));
			this.outputFile(Convert.ToString(this.name + " " + "行数:" + lines), this.isout);
		}
		public void handleA()//空行/注释行/代码行的计数
		{
			FileStream fs = new FileStream(@name, FileMode.Open);
			StreamReader sr = new StreamReader(fs);
			string lines = "";
			int nullcount = 0;
			int notedcount = 0;
			int codecount = 0;
			while ((lines = sr.ReadLine()) != null)
			{
				lines = lines.Trim(' ');//每一行去掉两头空白字符
				lines = lines.Trim('\t');//每一行去掉两头TAB字符
				if (lines == "" || lines.Length <= 1)
				{
					nullcount++;//空行计数加一
				}
				else if (lines.Length > 2 && (lines.Substring(0, 2) == "//" || lines.Substring(1, 2) == "//"))
				{
					notedcount++;//注释行计数加一

				}
				else if (lines.Length == 2 && (lines.Substring(0, 2) == "//"))
				{

					notedcount++;	//注释行计数加一			
				}
				else
				{
					codecount++;//代码行计数加一
				}
			}
			sr.Close();
			fs.Close();
			string outstr = this.name + " " + "空行/注释行/代码行:" + nullcount.ToString() + "/" + notedcount.ToString() + "/" + codecount.ToString();
			Console.WriteLine();
			Console.WriteLine(this.name + " " + "空行/注释行/代码行:" + @"{0}/{1}/{2}", nullcount, notedcount, codecount);
			this.rstFile(outstr);
			this.outputFile(outstr, this.isout);
		}
		public void handleS(string cmd)//-s命令调用其它命令函数
		{
			string rootPath = Directory.GetCurrentDirectory();
			string[] files = Directory.GetFiles(rootPath, "*.txt");


			foreach (string file in files)
			{

				FileStream fs = new FileStream(@file, FileMode.Open);
				StreamReader sr = new StreamReader(fs);
				this.allstr = sr.ReadToEnd();
				sr.Close();
				fs.Close();
				this.name = file;
				this.checkCmd(cmd);
			}

		}
		public void rstFile(string str)//输出函数
		{
			string filePath = Directory.GetCurrentDirectory();
			StreamWriter sw = new StreamWriter(@filePath + "//" + "result.txt", true, Encoding.UTF8);
			sw.WriteLine(str);
			sw.Close();
		}
		public void outputFile(string str, bool isout)//-0
		{
			if (isout)
			{
				string filePath = Directory.GetCurrentDirectory();
				StreamWriter sw = new StreamWriter(@filePath + "//" + "output.txt", true, Encoding.UTF8);
				sw.WriteLine(str);
				sw.Close();
			}
		}

	}
}

  

 

可以发现性能有了明显提升

 测试用例及结果:

用例1:                                                                                                                                      

 

结果:

 

用例2:

结果:

错误用例示范:

 

 

 

总结与收获

    黄乙轩:在这次wordCount的设计与测试中,我对于软件测试有了较为详细的认知,在学习过程中,我逐渐掌握了c#文件的读写操作,正则表达式的基本应用,控制台命令的实现,

    读写命令的逻辑判断,异常或错误的处理方式的运用,同时掌握了白盒测试,静态测试,性能测试的基本操作,在以后的学习,开发过程中,我也会将在这

    次开发过程中学到的东西运用到实际中。

    杨柳:这次进行的WordCount的作业中,一开始看题目,完全没有头绪,在网上查阅了相关资料后,逐渐理清楚了题目要求的思路逻辑。由于一直接触的是C#窗体应用设计,很久没有接触C#控制台设计了,导致很多操作都比较生疏,因此花费了较多时间去熟悉。在此次作业中,重点是对文件的读写操作,以及对字符串的遍历操作。在有些函数中,我使用了较基础的方法,效率较低,当看见了合作同学所使用的正则表达式后,我也去了解了一下正则表达式。对整体代码进行编写完成后,之后的软件测试则是本课程的核心。在本次测试中,我学习了解到了静态测试,白盒测试,性能测试。对软件测试这门课程有了更深刻的了解。在今后的项目开发学习过程中,我会学以致用,将学习到的学习充分利用到实际情况当中去。

 

转载于:https://www.cnblogs.com/ulysses497/p/9826552.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值