作业 20180925-4 单元测试,结对
此作业的要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2146
结对伙伴:张俊余
测试框架:NUnit
测试内容:本周作业 20180925-6 四则运算试题生成
测试环境:Microsoft Visual Studio 2015,cmd.exe
要求1 对每个功能,先给出测试用例,然后再编码功能。请注意把测试用例视为功能需求完成的检验指标。 (40分)
对于四则运算的四个大功能,由于可以使用控制台进行交互,故无需使用TDD测试工具。对于实现功能的具体函数方法,使用TDD测试工具进行测试。具体测试用例如下:
功能1 测试用例
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测试用例
功能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测试样例
功能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中输出一致的可能性) |
功能4测试样例
功能4与功能3的区别之处在于支持分数出题和运算,功能3测试样例13-17同样适用,只要额外测试题目是否含有分数与含分数的表达式计算是否正确即可。
ID |
测试用例 |
预期结果 |
18 |
使用NUnit测试含分数的表达式是否计算正确。 输入"(10/5+13)*(12/6+5/5)”
|
期待输出45(答案为整数) |
19 |
使用NUnit测试含分数的表达式是否计算正确。 输入"((3/2-9/9)+3/1)*7/5" |
计算结果应为 4.9(答案为小数),即4 9/10 |
20 |
使用NUnit测试含答案的小数转化为分数。 输入0.125 |
输出:1/8 |
21 |
使用NUnit测试连续含三个/的分数表达式是否计算正确。 |
期待输出结果与当前题目结果对应相等。 |
要求2 在博客报告测试用例全部fail 到 全部pass 的过程,报告事实 (fail到修改代码或者测试用例,到pass) 以及收获。 除了最初的框架,测试用例中存在一次性pass没有经过fail的,也报告一次性通过,给出如此优秀地实现了这部分功能的代码。(40分)
功能1测试过程:
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(),修改后测试成功 收获:测试失败时,仔细阅读提示信息会发现“Assertions不支持AssertEquals()方法,推荐使用AssertAreEqual()代替”,更改之后果然有效,因此单元测试时要密切关注控制台提示错误信息。 |
测试结果截图:
图一:
图二
图三
图四
图五
重要代码展示:
(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 }
功能2 测试过程
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 }
功能3测试过程
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 |
输出:”题目数量必须是 正整数” |
未通过 见图十一(1) 修改后通过 见图十一(2) |
输入 f4 –c 6.5 后回车, 提示错误信息,检查代码发现判断第二个命令行参数是否为正整数的正则表达式有误,修改后重新测试,输出”题目数量必须是 正整数” |
16 |
用户输入 f4 –c 21 |
按照作业要求格式输出三道不重复的题目,且保存到指定txt文件。 |
通过 见图十二 |
输入 f4 –c 21 后回车, 输出二十一道不重复的题目,且可以检查到txt文件中确实存在给出的题目。 |
17 |
用户再次输入 f4 –c 21 |
按照作业要求格式输出三道不重复的题目,且保存到指定txt文件。且此时的txt文件内容为最新的三道题。(不排除随机表达式与测试用例15中输出一致的可能性) |
通过 见图十三 |
输入 f4 –c 21 后回车, 输出二十一道不重复的题目,且可以检查到txt文件中确实存在给出的不同于测试用例16中生成的题目。 |
测试结果截图:
图八
图九
图十
图十一(1)
图十一(2)
图十二
图十三
重要代码展示:
(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 }
(3)去重
随机数不包含零,避免了分配律的影响。
1 for (j = 0; j < results.Count;) // 判断是否存在相等的方程式 2 { 3 if (trueResult == results[j]) // 判断结果是否相等 4 { 5 if (compareArray(operatorNums[j], operatorNum))// 判断操作数是否相同 6 { 7 if (compareArray(operatorOnes[j], operatorOne))// 判断操作符是否相同 8 { 9 break; 10 } 11 } 12 } 13 j++; 14 } 15 if (j >= results.Count) // 如果不存在则正常生成 16 { 17 Console.WriteLine(output + trueResult); 18 equations.Add(output + trueResult); 19 results.Add(trueResult); 20 operatorNums.Add(operatorNum); 21 operatorOnes.Add(operatorOne); 22 } 23 else // 如果存在则重新生成 24 { 25 i--; 26 continue; 27 }
功能4测试过程:
ID |
测试用例 |
预期结果 |
测试结果 |
测试过程 |
18 |
使用NUnit测试含分数的表达式是否计算正确。 输入 "(10/5+13)*(12/6+5/5)” |
期待输出45(答案为整数) |
通过 见图十四 |
写一个测试方法testCalculate3(),输入表达式为“(10/5+13)*(12/6+5/5)”,将输出值与预计值45进行比较,测试得二者一致。 |
19 |
使用NUnit测试含分数的表达式是否计算正确。 输入"((3/2-9/9)+3/1)*7/5" |
计算结果应为 4.9(答案为小数),即4 9/10 |
通过 见图十四 |
写一个测试方法testCalculate4(),输入表达式为“((3/2-9/9)+3/1)*7/5",将输出值与预计值4.9进行比较,测试得二者一致。 |
20 |
使用NUnit测试含答案的小数转化为分数。 输入4.9 |
输出:4 9/10 |
通过 见图十五 |
写一个测试方法testDecimalTranverse(),输入4.9,将输出值与4 9/10比较,测试得而二者一致。 |
21 |
使用NUnit测试连续含三个/的分数表达式是否计算正确。
|
期待输出结果与当前题目结果对应相等。 |
不通过,修改后通过。
见图十六、十七
此处由于测试者付佳能力有限,无法在测试方法中直接输出分数,只能输出小数,故进行控制台结果与测试方法中的小数进行对比。 |
写一个测试方法testCalculate5(),输入表达式“((6/3/4/4)*6/3)*10/5”,实际计算结果6与程序结果不一致。生成结果为0.5,此处是由于程序直接将所有的“/”视为除法。 进行修改计算分数算法,且为了便于区分分子分母分界符与除号,将运算数左右加空格进行表达式输出显示。 控制台随机生成符合标准的“5/8/16/2*17/17/10”,输出结果为1/128,实际计算结果也为1/128(0.0078125),调用测试用例20中testDecimalTranverse()方法检验得0.0078125确实对应1/128.
|
图十四
图十五
图十六
图十七
关键代码:
1.生成分数
1 for (int i = 0; i < 4; i++) 2 { 3 int flag = rm.Next(1, 11); 4 switch (flag % 2) 5 { 6 case 0: 7 number1 = rm.Next(1, 20).ToString(); 8 randomFractions[i] = number1; 9 randomRealNum[i] = number1; 10 break; 11 case 1: 12 number1 = rm.Next(1, 20).ToString(); 13 number2 = rm.Next(1, 20).ToString(); 14 randomFractions[i] = number1 + "/" + number2; 15 randomRealNum[i] = (Convert.ToDecimal(number1)/Convert.ToDecimal(number2)).ToString(); 16 break; 17 } 18 }
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 if(num2 != 0) 22 { 23 resultStack.Push(Convert.ToString(num1 / num2)); 24 } 25 else 26 { 27 resultStack.Push(Convert.ToString(1)); 28 } 29 } 30 } 31 }
3. 小数转化为分数
1 public string decimalTranverse(string value) // 小数转化为分数 2 { 3 string result = ""; 4 string[] str = value.Split('.'); 5 int decimalLen = str[1].Length; 6 if (Regex.IsMatch(str[1], @"^[0]*$")) 7 { 8 return str[0]; 9 } 10 long weitght = Convert.ToInt32(Math.Pow(10, decimalLen)); 11 long num = Convert.ToInt32(str[1]); 12 long gcd = gCD(num, weitght); 13 if (Regex.IsMatch(str[0], @"^[+-]?[0]*$")) 14 { 15 result = String.Format("{0}{1}{2}", num / gcd, "/", weitght / gcd); 16 } 17 else 18 { 19 result = String.Format("{0}{1}{2}{3}{4}", str[0], " ", num / gcd, "/", weitght / gcd); 20 21 } 22 23 return result; 24 }
总体收获:
此次单元测试过程主要包括编码之前制订测试用例(包括最终的功能测试、编码过程中方法测试),编码过程中使用NUnit进行测试。
我与结伴伙伴张俊余在编码之前先仔细梳理了四则运算作业中各个功能的细节,详细列出了各种测试样例,包括输入指令不同,输入不同的计算结果等。事实证明在编码之前制定测试样例是非常有效的,因为这样的话测试用例就可以视为功能需求完成的检验指标。
制定好测试用例之后,我俩投入实际编程工作中,几个主要的功能有接收指令、生成非重算术表达式、设置括号位置、将算术表达式转化成逆波兰式、根据逆波兰式计算最终结果、将控制台输出的表达式写入到文本文件中等等。此处我们为每个主要功能编写了NUnit测试方法,由于我之前做Java项目时使用过JUnit测试,所以学习NUnit测试并不是很困难,通过读了两篇很不错的介绍使用Visual Stdio进行C#的单元测试博客后大致了解了测试流程,博客链接为:1,2。知道了流程之后我和张俊余开始写测试方法,由于对项目比较熟悉所以测试进展的很顺利(前三个功能,第四个功能耗时太久了...)。
此次测试的收获是:
1> 编码之前制订测试用例会更加明白整个项目的需求,也是检验功能需求完成的一个优秀的指标。
2> 测试时重点关注错误提示信息。(当然要先明白测试语言语法,瞎写真的是浪费时间。。。)
3> 学习了一种新的单元测试方法。之前只会JUnit(Java),而NUnit适合于所有的.NET语言。
4> 功能4的测试花费了大量的时间,测试过程中一个问题一个问题的冒出来,幸好我和张俊余一直在仔细的讨论,测试,才产生了1+1>2的效果,所以收获就是有沟通的测试比自己一个人测试更全面,更有效。
要求3 做好准备,在接下的一周你可能无法通过别人的测试用例。 (0分)