此作业要求参见:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2146]
git地址:https://git.coding.net/qiaojingyu/f4.git
单元测试代码详见上述git地址中的Test_f4.cs
结对伙伴:吴奕瑶
集成环境:Visual Studio 2017
编程语言:C#
测试框架:NUnit3
测试环境地配置参考了冉华学长的博客http://www.cnblogs.com/ranh941/p/7629279.html
要求1:对每个功能,先给出测试用例,然后再编码功能。请注意把测试用例视为功能需求完成的检验指标。
测试用例1:测试所生成的试题是否是字符串
调用生成试题函数,判断返回结果类型。
测试用例2:测试生成逆波兰式
1、无括号生成逆波兰式
(1)测试同级运算符生成逆波兰式
输入字符串:“19-4-2-8=”
期望输出结果:“19 4 - 2 - 8 - ”
测试用例3:测试生成逆波兰式
1、无括号生成逆波兰式
(2)测试混合运算生成逆波兰式
输入字符串:“5*6+7/9=”
期望输出结果:“5 6 * 7 9 / +”
测试用例4:测试生成逆波兰式
2、有括号生成逆波兰式
(1)单括号同级运算符生成逆波兰式
输入字符串:“1-2-(3-4)=”
期望输出结果:“1 2 - 3 4 - -”
测试用例5:测试生成逆波兰式
2、有括号生成逆波兰式
(2)单括号混合运算符生成逆波兰式
输入字符串:“(1+2)*3-4=”
期望输出结果:“1 2 + 3 * 4 -”
测试用例6:测试生成逆波兰式
2、有括号生成逆波兰式
(3)双括号混合运算生成逆波兰式
输入字符串:“1+((2-3)/4)=”
期望输出结果:“1 2 3 - 4 / +”
测试用例7:测试逆波兰式地计算
1、简单四则运算
(1)加法测试
输入字符串:“1 2 +”
期望输出结果:3
测试用例8:测试逆波兰式地计算
1、简单四则运算
(2)减法测试
输入字符串:“4 5 -”
期望输出结果:-1
测试用例9:测试逆波兰式地计算
1、简单四则运算
(3)乘法测试
输入字符串:“2 3 *”
期望输出结果:6
测试用例10:测试逆波兰式地计算
1、简单四则运算
(4)除法测试
输入字符串:“12 6 /”
期望输出结果:2
测试用例11:测试逆波兰式地计算
2、长逆波兰式运算
(1)同级运算符长逆波兰式计算
输入字符串:“19 14 - 12 - 18 -”
期望输出结果:-25
测试用例12:测试逆波兰式地计算
2、长逆波兰式运算
(1)混合运算符长逆波兰式计算
输入字符串:“1 2 3 - 4 / +”
期望输出结果:0.75
要求2:在博客报告测试用例全部fail 到 全部pass 的过程,报告事实 (fail到修改代码或者测试用例,到pass) 以及收获。
第一次测试:
fail1:测试生成逆波兰式(测试用例2:TestCreateRPN1),错误重现如下:
其中数字19之间插入了一个空格,末尾两个减号之间未插入空格,找到相应的代码片段如下:
int flag = 1; ... switch (strOld[i]) { case '+': case '-': case '*': case '/': ... ope.Push(strOld[i]); flag = 1; ... default: num.Push(strOld[i]); if ((flag == 1) && (i != 0)) { strNew += " "; flag = 0; } strNew += strOld[i]; break; }
其中变量flag是识别读取到的字符是否为运算符,而后在运算符左右添加空格。参照测试结果发现逻辑有错误,然后将flag初值置为0。修改代码之后再次测试。
第二次测试:
测试之后发现数字19已经可以以正确的格式输出,但是末尾的“8-”的格式还是不正确。找到相应的代码片段:
while (ope.Peek() != '#') { strNew += ope.Peek() + " "; ope.Pop(); }
发现在出栈时,空格添加的位置错误,修改成如下代码再次进行测试:
while (ope.Peek() != '#') { strNew += " " + ope.Peek(); ope.Pop(); }
第三次测试:
至此,生成逆波兰式功能正确运行。
fail2:逆波兰式计算(测试用例8:TestCal2),错误重现如下:
发现减法结果计算错误,找到相应的代码片段如下:
case '-': left = result.Peek(); result.Pop(); right = result.Peek(); result.Pop(); answer = left - right; i++; break;
发现运算逻辑错误,应该用先弹出栈的数字作为被减数,修改成如下代码后再进行测试:
case '-': left = result.Peek(); result.Pop(); right = result.Peek(); result.Pop(); answer =right - left; i++; break;
第四次测试:
至此,减法运算能得到正确结果。
fail2:逆波兰式计算(测试用例10:TestCal4),错误重现如下:
发现除法计算结果有错误,找到相应代码为:
case '/': left = result.Peek(); result.Pop(); right = result.Peek(); result.Pop(); answer = left / right; i++; break;
发现运算逻辑错误,应该用先弹出栈的数字作为被除数,修改成如下代码后再进行测试:
case '/': left = result.Peek(); result.Pop(); right = result.Peek(); result.Pop(); answer = right / left; i++; break;
第五次测试:
至此测试用例全部通过。程序可以实现生成字符串类型的试题、生成正确的逆波兰式、正确计算逆波兰式的功能。
心得:
通过单元测试地检验才能清晰地看出自己程序的不足之处。在编写测试用例时,通过两个人地讨论,对整个程序运行过程中的可能出现的情况进行猜测,有助于更好地完成程序的功能。也希望在未来的一周,身边的同学可以多多发现我们程序中的不足,从而进一步完善我们的程序。