此作业的要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2146
对于四则运算的四个大功能,由于可以使用控制台进行交互,故无需使用TDD测试工具。对于实现功能的具体函数方法,使用TDD测试工具进行测试。具体测试用例如下:
ID |
测试用例 |
预期结果 |
1 |
用户输入f4 |
出现第一个运算表达式及换行的问号 |
2 |
用户输入非f4 |
不出现第一个运算表达式及换行的问号,可能会因电脑系统不同而出现提示信息。例如:”xx’ 不是内部或外部命令,也不是可运行的程序或批处理文件。 |
3 |
用户输入f4后对于表达式做出正确答案 |
提示:“答对啦,你真是个天才!”并给出下一题及换行后的问号 |
4 |
用户输入f4后对于表达式做出错误答案 |
提示:“再想想吧,答案似乎是12喔!”并给出下一题及换行后的问号 |
5 |
用户输入f4后并答完20道题,其中答对X道 |
提示:“你一共答对X道题,共20道题” |
6 |
使用NUnit测试算式表达式计算结果是否正确 情况一:不含括号。 输入:11-18+3*5 |
输出为:8 |
功能2与功能1的主要区别在于是否含有括号,所以功能1的测试用例1-6同样适用于功能2,在此不进行赘述。只提供区别于功能1的测试用例。
ID |
测试用例 |
预期结果 |
7 |
用户输入f4后,观察给出的20道算术表达式是否含有括号 |
因为功能2在功能1的基础上实现,故算术表达式应包括不含括号、含一个括号、含两个括号的形式,且括号位置出现合理,即“(”在数字前,“)”在数字后,且不同时发生“(”在表达式首位与“)”在表达式末尾的情况。 |
8 |
使用NUnit测试算式表达式转化成逆波兰式是否正确情况一:不含括号。 输入:2/8+1-10 |
输出为:28/1+10- |
9 |
使用NUnit测试算式表达式转化成逆波兰式是否正确情况二:含一个括号。 输入:(a+b)*c |
输出为:ab+c* |
10 |
使用NUnit测试算式表达式转化成逆波兰式是否正确情况三:含两个括号。 输入:d+((a+b)*c) |
输出为:dab+c*+ |
11 |
使用NUnit测试算式表达式计算结果是否正确 情况二:含一个括号。 输入:13*(14*12-12) |
输出为:2028 |
12 |
使用NUnit测试算式表达式计算结果是否正确 情况三:含两个括号。 输入:((19+6)-6)*2 |
输出为:38 |
功能3与上述功能1、功能2的区别在于用户输入命令行参事,指定出题数目。且输出格式不一致,并最终输出内容可以写入文件。其中应该满足上述测试用例6,测试用例8-12,在此不赘述。
ID |
测试用例 |
预期结果 |
13 |
使用NUnit测试是否生成了指定内容的txt文件 创建文件equation.txt,并写入”for test” 读取文件equation.txt,对比写入内容与读取内容。 |
电脑指定位置确实生成equation.txt文件,且对比结果一致。 |
14 |
用户输入 f4 –c -200 |
输出:”题目数量必须是 正整数” |
15 |
用户输入 f4 –c 6.5 |
输出:”题目数量必须是 正整数” |
16 |
用户输入 f4 –c 3 |
按照作业要求格式输出三道不重复的题目,且保存到指定txt文件。 |
17 |
用户再次输入 f4 –c 3 |
按照作业要求格式输出三道不重复的题目,且保存到指定txt文件。且此时的txt文件内容为最新的三道题。(不排除随机表达式与测试用例15中输出一致的可能性) |
ID |
测试用例 |
预期结果 |
测试结果 |
测试过程 |
1 |
用户输入f4 |
出现第一个运算表达式及换行的问号 |
通过 见下图一 |
设置好程序入口,直接运行debug版本exe。 输入f4,出现第一个运算表达式及换行的问号 |
2 |
用户输入非f4 |
不出现第一个运算表达式及换行的问号,可能会因电脑系统不同而出现提示信息。例如:”xx’ 不是内部或外部命令,也不是可运行的程序或批处理文件。 |
通过 见下图二 |
设置好程序入口,直接运行debug版本exe. 输入f5,提示“‘f5‘不是内部或外部命令,也不是可运行的程序或批处理文件” |
3 |
用户输入f4后对于表达式做出正确答案 |
提示:“答对啦,你真是个天才!”并给出下一题及换行后的问号 |
通过 见下图一 |
对于给定题目,用户自己计算正确结果并输入到控制台 |
4 |
用户输入f4后对于表达式做出错误答案 |
提示:“再想想吧,答案似乎是12喔!”并给出下一题及换行后的问号 |
通过 见下图一 |
对于给定题目,用户自己输出一个错误结果并输入到控制台 |
5 |
用户输入f4后并答完20道题,其中答对X道 |
提示:“你一共答对X道题,共20道题” |
通过 见下图三 |
做完20道题目,控制正确数目在5道,输出“你一共答对5道题,共20道题” |
6 |
使用NUnit测试算式表达式计算结果是否正确 情况一:不含括号。 输入:11-18+3*5 |
输出为:8 |
修改测试代码后通过。 见图四、图五 |
写一个测试方法TestCalculate(),调用计算表达式的方法,设置预计值与程序计算值,对比二者是否相等。 测试错误。 检查发现NUnit测试是否相同 用Assert.AreEqual(),而测试工作错误使用了Assert.Equals(),修改后测试成功 |
测试结果截图:
图一:
图二
图三
图四
图五
重要代码展示:
(1) 判断题目计算是否正确交互
1 if (userResult == trueResult) 2 { 3 trueNum++; 4 Console.WriteLine("答对啦,你真是个天才!"); 5 } 6 else 7 { 8 Console.WriteLine("再想想吧,答案似乎是" + trueResult.ToString() + "喔!"); 9 } 10 11 Console.WriteLine("你一共答对" + trueNum.ToString() + "道题,共20道题。");
(2) 计算表达式
1 private static void CalcResult(Stack<string> resultStack, string operatorStr) 2 { 3 if (resultStack.Count >= 2) 4 { 5 decimal num2 = Convert.ToDecimal(resultStack.Pop()); 6 decimal num1 = Convert.ToDecimal(resultStack.Pop()); 7 if (operatorStr == "+") 8 { 9 resultStack.Push(Convert.ToString(num1 + num2)); 10 } 11 else if (operatorStr == "-") 12 { 13 resultStack.Push(Convert.ToString(num1 - num2)); 14 } 15 else if (operatorStr == "*") 16 { 17 resultStack.Push(Convert.ToString(num1 * num2)); 18 } 19 else if (operatorStr == "/") 20 { 21 resultStack.Push(Convert.ToString(num1 / num2)); 22 } 23 } 24 }
(3) 测试方法TestCalculate()
1 [Test]// 测试求值不含括号(在逆波兰测试正确的基础上) 2 public void TestCalculate() 3 { 4 Stack<string> numStack = new Stack<string>(); 5 Stack<string> rpnStack = new Stack<string>(); 6 ReversePolishEquation reversePolishEquation = new ReversePolishEquation(); 7 numStack = reversePolishEquation.getReversePolish("11-18+3*5"); 8 CalculatePolishEquation calculatePolishEquation = new CalculatePolishEquation(); 9 rpnStack = calculatePolishEquation.getRpnEquation(numStack); 10 decimal expResult = 0; 11 expResult = Convert.ToDecimal(calculatePolishEquation.CalcRPNFormula(rpnStack)); 12 decimal userResult = 8; 13 //rpnStack = calculatePolishEquation.getRpnEquation(numStack); 14 Assert.AreEqual(expResult, userResult); 15 }
ID |
测试用例 |
预期结果 |
测试结果 |
测试过程 |
7 |
用户输入f4后,观察给出的20道算术表达式是否含有括号 |
因为功能2在功能1的基础上实现,故算术表达式应包括不含括号、含一个括号、含两个括号的形式,且括号位置出现合理,即“(”在数字前,“)”在数字后,且不同时发生“(”在表达式首位与“)”在表达式末尾的情况。 |
通过 见下图六 |
输入f4后回车。观察题目是否符合标准,检验得符合标准。 |
8 |
使用NUnit测试算式表达式转化成逆波兰式是否正确情况一:不含括号。 输入:2/8+1-10 |
输出为:28/1+10- |
通过 见下图七 |
写一个测试方法TestCreatRPN(),调用生成逆波兰式方法, 输入“2/8+1-10”,输出“28/1+10-” |
9 |
使用NUnit测试算式表达式转化成逆波兰式是否正确情况二:含一个括号。 输入:(a+b)*c |
输出为:ab+c* |
通过 见下图七 |
写一个测试方法TestCreatRPN1(),调用生成逆波兰式方法, 输入“(a+b)*c”,输出“ab+c*”
|
10 |
使用NUnit测试算式表达式转化成逆波兰式是否正确情况三:含两个括号。 输入:d+((a+b)*c) |
输出为:dab+c*+ |
通过 见下图七 |
写一个测试方法TestCreatRPN2(),调用生成逆波兰式方法, 输入“d+((a+b)*c)”,输出“dab+c*+*” |
11 |
使用NUnit测试算式表达式计算结果是否正确 情况二:含一个括号。 输入:13*(14*12-12) |
输出为:2028 |
通过 见下图七 |
写一个测试方法TestCalculate1(),调用计算表达式的方法,设置预计值与程序计算值,对比二者是否相等。 输入“13*(14*12-12)” 输出“2028” |
12 |
使用NUnit测试算式表达式计算结果是否正确 情况三:含两个括号。 输入:((19+6)-6)*2 |
输出为:38 |
通过 见下图七 |
写一个测试方法TestCalculate2(),调用计算表达式的方法,设置预计值与程序计算值,对比二者是否相等。 输入“((19+6)-6)*2” 输出“38” |
测试结果截图:
图六
图七
重要代码展示:
(1) 生成含括号的表达式
1 int flag = rm.Next(1,10); 2 string equation = ""; 3 string[] nums = getRandomNum(); 4 string[] operators = getRandomOperator(); 5 if(flag % 2 == 0) 6 { 7 flag = rm.Next(1, 100); 8 }else 9 { 10 flag = 0; 11 } 12 if(flag == 0) 13 { 14 equation = nums[0] + operators[0] + nums[1] + operators[1] + nums[2] + operators[2] + nums[3] ; 15 }else 16 { 17 switch(flag % 10) 18 { 19 case 0: // (1+2+3)+4 20 equation = "(" + nums[0] + operators[0] + nums[1] + operators[1] + nums[2] + ")" + operators[2] + nums[3]; 21 break; 22 case 1: // 1+(2+3+4) 23 equation = nums[0] + operators[0] + "(" +nums[1] + operators[1] + nums[2] + operators[2] + nums[3] + ")"; 24 break; 25 case 2: // (1+2)+3+4 26 equation = "(" + nums[0] + operators[0] + nums[1] + ")" + operators[1] + nums[2] + operators[2] + nums[3] ; 27 break; 28 case 3: // 1+(2+3)+4 29 equation = nums[0] + operators[0] + "(" + nums[1] + operators[1] + nums[2] + operators[2] + nums[3] + ")" ; 30 break; 31 case 4: // 1+2+(3+4) 32 equation = nums[0] + operators[0] + nums[1] + operators[1] + "(" + nums[2] + operators[2] + nums[3] + ")" ; 33 break; 34 case 5: // (1+2)+(3+4) 35 equation = "(" + nums[0] + operators[0] + nums[1] + ")" + operators[1] + "(" + nums[2] + operators[2] + nums[3] + ")" ; 36 break; 37 case 6: // ((1+2)+3)+4 38 equation = "(" + "(" + nums[0] + operators[0] + nums[1] + ")" + operators[1] + nums[2] + ")" + operators[2] + nums[3]; 39 break; 40 case 7: // (1+(2+3))+4 41 equation = "(" + nums[0] + operators[0] + "(" +nums[1] + operators[1] + nums[2] + ")" + ")" +operators[2] + nums[3] ; 42 break; 43 case 8: // 1+((2+3)+4) 44 equation = nums[0] + operators[0] + "(" + "(" + nums[1] + operators[1] + nums[2] + ")" + operators[2] + nums[3] + ")"; 45 break; 46 case 9: // 1+(2+(3+4)) 47 equation = nums[0] + operators[0] + "(" + nums[1] + operators[1] + "(" + nums[2] + operators[2] + nums[3] + ")" + ")"; 48 break; 49 default: 50 Console.WriteLine("Error"); 51 break; 52 } 53 }
(2)转化为逆波兰数
1 public Stack<string> getReversePolish(string equation) 2 { 3 //equation = "(1+2)*3"; 4 Stack<string> opStack = new Stack<string>(); // 定义运算符栈 5 opStack.Push("#"); 6 Stack<string> numStack = new Stack<string>(); // 定义操作数栈 7 for(int i = 0; i < equation.Length;) 8 { 9 int opNum = GetOperationLevel(equation[i].ToString()); 10 if (opNum == 0) 11 { 12 int index = GetCompleteValue(equation.Substring(i, equation.Length - i)); 13 numStack.Push(equation.Substring(i, index)); 14 i = (i + index); 15 } 16 else 17 { 18 if (equation[i] == ‘(‘) 19 { 20 opStack.Push(equation[i].ToString()); 21 } 22 else if (equation[i] == ‘)‘) 23 { 24 MoveOperator(opStack, numStack); 25 } 26 else 27 { 28 if (opStack.Peek() == "(") 29 { 30 opStack.Push(equation[i].ToString()); 31 } 32 else 33 { 34 JudgeOperator(opStack, numStack, equation[i].ToString()); 35 } 36 } 37 i++; 38 } 39 } 40 if (opStack.Count != 0) 41 { 42 while (opStack.Count != 0 && opStack.Peek() != "#") 43 { 44 numStack.Push(opStack.Pop()); 45 } 46 } 47 return numStack; 48 }
ID |
测试用例 |
预期结果 |
测试结果 |
测试过程 |
13 |
使用NUnit测试是否生成了指定内容的txt文件 创建文件equation.txt,并第一次写入”for test1”,第二次写入”for test2”。即执行两次 读取文件equation.txt,对比写入内容与读取内容。 |
电脑指定位置确实生成equation.txt文件,且对比结果一致。 |
通过 见图八 图九 |
写一个测试方法TestOutput(),调用写入文件的方法,读取文件内容,对比读入与写入内容,发现一致。 再次执行该测试方法,更换写入内容,对比后发现读取内容与写入内容一致且为最新一次的写入内容。 |
14 |
用户输入 f4 –c -200 |
输出:”题目数量必须是 正整数” |
通过 见图十 |
输入 f4 –c -200 后回车, 输出”题目数量必须是 正整数” |
15 |
用户输入 f4 –c 6.5 |
输出:”题目数量必须是 正整数” |
通过 见图十一 |
输入 f4 –c -200 后回车, 输出”题目数量必须是 正整数” |
16 |
用户输入 f4 –c 21 |
按照作业要求格式输出三道不重复的题目,且保存到指定txt文件。 |
通过 见图十二 |
输入 f4 –c -3 后回车, 输出二十一道不重复的题目,且可以检查到txt文件中确实存在给出的题目。 |
17 |
用户再次输入 f4 –c 21 |
按照作业要求格式输出三道不重复的题目,且保存到指定txt文件。且此时的txt文件内容为最新的三道题。(不排除随机表达式与测试用例15中输出一致的可能性) |
通过 见图十三 |
输入 f4 –c -3 后回车, 输出二十一道不重复的题目,且可以检查到txt文件中确实存在给出的不同于测试用例16中生成的题目。 |
测试结果截图:
图八
图九
图十
图十一
图十二
图十三
重要代码展示:
(1)命令行参数判断
1 else if(args.Length == 2) 2 { 3 string num = args[1]; 4 //Console.WriteLine(num); 5 if(isNumeric(num)) 6 { 7 int equationNums = Convert.ToInt32(num); 8 // Console.WriteLine("success"); 9 ProduceEquation produceEquation = new ProduceEquation(); 10 produceEquation.produceEquations(equationNums); 11 } 12 else 13 { 14 Console.WriteLine("题目数量必须是 正整数。"); 15 } 16 }
(2)写入文件
1 public void produceFiles(string filename,List<string> equations) 2 { 3 StreamWriter streamWriter = new StreamWriter(filename, false, Encoding.Default); 4 for(int i = 0; i < equations.Count;i++) 5 { 6 streamWriter.WriteLine(equations[i]); 7 } 8 streamWriter.Flush(); 9 streamWriter.Close(); 10 }
(3)测试方法对比写入文件内容与读取文件是否一致
1 [Test]// 测试是否生成txt文件以及文件内容是否与写入一致 2 public void TestOutput() 3 { 4 ProduceFiles produceFiles = new ProduceFiles(); 5 List<string> equations = new List<string>(); 6 string str = "for test2"; 7 equations.Add(str); 8 produceFiles.produceFiles("D:/equations.txt", equations); // 写入 9 10 StreamReader sr = new StreamReader("D:/equations.txt"); // 读取 11 string line; 12 string exp = ""; 13 while ((line = sr.ReadLine()) != null) 14 { 15 exp = line; 16 } 17 Assert.AreEqual(str, exp); // 对比 18 }
原文:https://www.cnblogs.com/fuj905/p/9749627.html