首页 > 其他 > 详细

作业 20180925-4 单元测试,结对

时间:2018-10-07 12:31:58      阅读:289      评论:0      收藏:0      [点我收藏+]

此作业的要求参见: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中输出一致的可能性)

 

要求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(),修改后测试成功

测试结果截图:

图一:                                                                                                                                                                                                          

技术分享图片   

图二        

 技术分享图片 

图三 

 技术分享图片

 

图四                                                                    

 

 技术分享图片

图五

技术分享图片

 

 

重要代码展示:

(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

输出:”题目数量必须是 正整数”

通过

见图十一

输入 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         }

 

要求3 做好准备,在接下的一周你可能无法通过别人的测试用例。 (0分)

 

要求4 使用coding.net做版本控制。checkin 前要求清理 临时文件、可执行程序,通常执行 build-clean可以达到效果。(5分)

 

作业 20180925-4 单元测试,结对

原文:https://www.cnblogs.com/fuj905/p/9749627.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!