对于一个代码单元,首先要测试它的基本功能。功能就是在某种输入时应该产生某种确定的输出。对于一个代码单元,它的可能输入通常是无穷的,显然,把输入的所有可能取值都进行测试,是不可能也是无意义的,我们应该用一定的规则选择有代表性的数据来建立测试用例。要考虑的输入主要有三种:正常输入,边界输入,非法输入,每种输入还可以分类,也就是平常说的等价类法,每类取一个数据作为输入数据建立测试用例,如果测试通过,可以肯定同类的其他输入也是可以通过的。如果等价类的划分是准确且完整的,并且每一个等价类都进行了测试,那么,可以说这个代码单元经过了充分的测试。下面举例说明:
正常输入
例如字符串的Trim函数,功能是将字符串前后的空格去除,那么正常的输入可以有四类:前面有空格;后面有空格;前后均有空格;前后均无空格。
边界输入
上例中空字符串可以看作是边界输入。
再如一个表示年龄的参数,它的有效范围是0-100,那么边界输入有两个:0和100。
非法输入
非法输入是正常取值范围以外的数据,或使代码不能完成正常功能的输入,如上例中表示年龄的参数,小于0或大于100都是非法输入,再如一个进行文件操作的函数,非法输入有这么几类:文件不存在;目录不存在;权限错误。
如果输入有多个数据,还要考虑这些数据之间的关系,即等价类还要包括数据的组合。
要人工找出所有的等价类通常是很困难的,但使用VU,通常不需要这样做,只要为容易想到的、比较典型的等价类建立测试用例就行了,后文会有进一步的论述。
VU自动生成测试代码,用户只需要在测试用例编辑器中填写输入输出的数值即可:
参数:系统已生成参数的声明,并且,不管是对象、引用、还是指针,甚至指针的指针,都生成对象,VU在调用这些参数时,对于引用、指针或指针的指针,会自动作出适当的处理。对于基本数据类型或定义了赋值操作符的高级数据类型,用户只需将参数的值直接填在"="后面;对于高级数据类型,则可以像普通代码一样,给结构的各个域赋值,或者调用对象的构造函数或其他初始化函数进行初始化。
成员变量:可以用点操作符直接为成员变量赋值,当然,如果成员变量本身也是高级数据类型,则可以像普通代码一样,调用该成员变量的初始化函数。
全局变量:如果全局变量在测试代码中是可见的,则直接引用就行了。
外部数据:外部数据通常需要手工准备,例如文件中的数据或数据库中的数据。
前置操作:可以用点操作符直接调用成员函数。如果前置操作是众多测试用例公用的,可以写在测试类的BeginCase()函数中,如果有多种不同的前置操作,还可以通过传递不同的参数来控制BeginCase()的行为。
预期输出部分的语法与输入部分完全相同,输出可以是0项,1项或多项,每项输出的计算结果,都必须是布尔表达式。如果输出难于预先确定,或者比较复杂,可以在运行测试后再确认。
从上述可以看出,测试用例编辑器可以适应很复杂的测试用例的编辑。只要一个测试用例已编辑完毕,第二个及更多的测试用例就很简单了:选定一个现有的测试用例,由系统自动拷贝,用户再对部分数值进行修改就行了。由于各个测试用例之间的差别通常很小,这种方式可以很快建立测试用例集。
测试用例编辑器还具有代码模式,很特殊的情况下,可以切换到代码模式下直接编辑代码。