先来说一下我对于单元测试的认识吧,我觉得有三种情况:
一是输入输出为值,且与数据库无关
二是输入输出为值,且与数据库有关
三是输入输出不是值的情况
第一种情况常见于控制类,它的方法,一般情况下,参数就是输入值,返回值就是输出值,此时输出值只受输入值的影响
第二种情况常见于实体类,它的方法,一般情况下,与控制类的方法相同,但是输出值不只是受输入值的影响,同时还受当前数据库的内容影响。
第三种情况常见于边界类(一般就是界面,不知道我这样理解对不对),一般情况下,它的方法是系统定义的方法,虽然也有参数和返回值,但是对开发人员来说并不是很重要,有时甚至不用。如界面中一个按钮的clicked事件。
对应于上面的三种情况,测试也有不同。
对于第一种情况,比较好办,在设计这个类时,就可以写出测试用例,包括具体的输入值和期望输出。
对于第二种情况,在写测试用例时,就必须先假定数据库中相应表的数据值,但是在真正测试时,并不能保证数据库中的真实数据就是我假定的数据,这种情况下,就需要测试人员去查看数据库的当前内容,就有些麻烦。
对于第三种情况,我根本就不知道怎么去写测试用例。如一个按钮的clicked事件,其中有很多步骤,受影响的部分可能也有很多,这些情况在设计时都已经有说明了,如果对照着设计文档,应该是可以测试的,但要写测试用例,我就不知从何下手,总不能从设计文档中抄一遍吧。这种情况下,我现在的观点是不写测试用例,让测试人员直接看设计文档进行测试。
以上是我的拙见,不知道这种分类是否科学,另外,对于我说的第二种情况和第三种情况,各位有何高见
以下是我写的几点有关谈论单元测试的内部输入问题,大家可以参考
内部输入是函数内部获得的输入,包括调用子函数获得的输入和局部静态变量。请看下面的两组功能完全一样代码(差异部分用粗体标出):
代码一(代码清单4.1.cpp):
//计算圆的外接正方形的面积 int GetArea(int r) { return (r+r) * (r+r); } //判断指定的正方形是否可以容纳圆 if(a1 < a2) return -1; //调用compare |
代码二(代码清单4.2.cpp):
//计算圆的外接正方形的面积 int GetArea(int r) { return (r+r) * (r+r); } //判断指定的正方形是否可以容纳圆 if(a1 < a2) return -1; //调用compare |
两组代码的差别在对GetArea()的调用是在Compare()之内还是之外。假如我们的测试目标是Comapre(),圆的外接正方形的面积a1在代码一中通过调用Compare()取得,在代码二中通过参数传递,显然,两者之间并无本质区别。Compare()的功能是,计算指定正方形的面积后并与外接正方形面积比较,GetArea()只是一个取得数据的调用,GetArea()本身是否正确,不是我们的测试目标,测试目标在于:对参数输入和 GetArea()的各种输出是否做了合适的计算,只要这些计算正确,Comapre()就没有错误。因此,从测试角度来看,被测函数调用其他函数(称为底层函数)所取得的数据,完全可以和通过参数传递的数据同等对待,都是一种输入,称为内部输入。