第四次作业二 单元测试【结对】

结对开发:@贾男男

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

posted @ 2017-10-10 21:10  王超_nenu  阅读(225)  评论(0编辑  收藏  举报