第四次作业二 单元测试【结对】
结对开发:@贾男男
git地址:https://git.coding.net/SuperCodingChao/f4.git
程序类说明
1.CreateEquation
生成随机数、和随机的运算符(包括括号和加减乘除、等号),其中的getString()方法返回string类型的字符串,就是屏幕输出的等式。
2.Convert2RPN
将上一步生成的等式加工,转化成逆波兰表达式,保存到栈里面。
3.Calculator
根据逆波兰表达式计算等式结果,返回正确结果。
4.主函数的测试类
功能一、二实现:new实例,调用方法,按照要求产生输出,输入结果对错判断、计数。
功能三 实现:static void f4c(int N)方法 同上功能,输出有改变,传入参数,生成题目数量。
说明+单元测试收获:下面的测试也是对上述前三个类的测试,都没有一次就通过的,有的一次通过了之后运行又发现不对的地方再测试。
因为代码是先写的,没有严格定义测试类的输出。
预计未来:计算逆波兰的结果应该不会通不过测试;中缀表达式转化成逆波兰表达式容易通不过,因为有“ ”字符串的缘故。不过如果过滤一下“ ”应该可以达到不会通不过。产生表达式是一次测试通过的,因为只检验了是否是string类型,没有进行正则或者其他方法的判断。所以代码也不展示了吧。
写到这里,我才有点体会什么是TDD了。我理解的是:要求的顺序应该是提前想好需要写的类,方法的功能,方法具体返回值的约束,再写代码,然后测试,调试。初次接触,都不懂,还是先写了代码,写代码期间学习了单元测试如何使用。所以没有采用TDD开发模式。原因是实践少、开发流程不熟悉,希望以后多加练习此类方法并实践。
测试用例fail → pass
1.加法2+3测试fail
下图只是测试计算加法2+3的逆波兰表达式,即“2 3 +”的结果,测试fail。
我改了测试方法的名字未TestCalAdd(),然后检查代码,发现了如下错误:
- 循环遍历逆波兰表达式字符串时,循环遍历i的初始值打错了,应该是0,我写成了10。然后我撤回步骤发现一开始就写错了,一直没发现。
- 在上面的bug改好之前,发现计算数值的时候,初始值和计算公式有问题。代码如下:
1 ans=0;
2 while (equation[i] <= '9' && equation[i] >= '0')
3 {
4 ans = 10 * ans + (equation[i] - '0');//之前写的 ans+=...
5 i++;//之前遗漏了!!!
6 }
Pass截图:加减乘除二元运算都通过了。
2.综合算式计算机结果测试fail
后来一通改Calculator类,发现了几个bug:
- 空格的判断处理
- 循环变量i的遍历有问题。所以处理字符串算数不对,而且都不知道计算机是咋算出来的。程序算法学习自多个博客,用C语言写的题解,算法主要是来自这个博客http://www.cnblogs.com/yang-/p/5471478.html 转换成C#代码,方法思想很类似。
- 总结来看就是 i 的处理。 对于多位数字,这里数字范围是(1,20),两位数字判断需要循环,i会自增,在外面i又自增了,就不对了,还会产生栈空的异常。
- 测试时,输入快了,会直接回车,没有输入答案,程序就崩了,添加了异常catch。
3.非单元测试而是控制台测试fail
双等号错误是因为想优化字符串拼接,做了改动,但是漏改了一处所以出现两个等号的情况。
内存异常应该是处理字符串的问题。有点记不清了。
4.运行结果
功能1,功能2
功能3
暂时未选择实现功能4、5。
5.补充说明
本来没有考虑老师说的精度问题,所谓1/3!=0.33333333333333333333而是无限的3。采用了C#中的decimal类型,可以输出小数点后的28位。本以为这样可以勉强可以,因为计算机输出无限小数是不可行的。后来思考,问了Gaoyb学长,提示说“除了分数表示法,就是避免出现分母里面带有2、5以外的素因子”。然后考虑如何避免产生“3 5 7”这类数字,感觉不太好实现。于是采用了判断字符串长度的方法,如果问题的答案长度超过了10就认为是除不尽的情况发生,舍弃,重新生成随机算式。所以上图代码中没有一串老么长的数字。😄感觉自己有点小聪明➕小偷懒hiahia