|
在软件开发的整个过程当中,软件测试是产品交付用户使用前的最后阶段,在软件生命周期中横跨两个阶段,第一阶段通常是在编写出一个模块之后,就对它进行必要的单元测试。编码与单元测试属于软件生命周期中的同一个阶段。这一阶段结束后,就进入了软件生存周期的下一阶段――测试阶段,要对软件进行各种综合意义(一般指的是集成测试、确认测试、系统测试)上的测试。测试工作由专门的测试组完成,测试小组人员负责整个测试工作。测试人员一般对第二阶段的各种测试比较熟悉,本文主要是谈谈测试人员相对陌生的关于单元测试方面的一些内容。
首先说一下单元测试的概念,单元测试主要测试代码的一个很小、很明确功能是否正确。 通常单元指的是“函数或类”。以类为测试单元,如果类比较复杂,测试会变得很复杂,即使是三五个成员变量,十几个成员函数这样一个很普通的类,要考虑清楚类的功能,以类为考核对象进行完整的测试,也是很不容易的。所以我认为,以函数为测试单元,更符合简单实用的原则。
提到单元测试,大家首先想到是开发人员对代码功能进行检查的白盒测试,其实单元测试当中也有功能上的测试,就是所谓的黑盒测试。功能就是在某种输入时应该产生某种确定的输出。例如字符串Trim函数,它的功能是将字符串前后的空格去除,那么我们可以从正常输入,边界输入,非法输入这三种类型数据来考虑设计测试用例进行功能上的测试。现在举例分别说明一下:1)正常输入:针对上面提到的Trim函数,可以分四类:前面有空格;后面有空格;前后均有空格;前后均无空格。2) 边界输入:如字符串全是空格或根本没有空格,看输出结果是否正确。3) 非法输入:是正常取值范围以外的数据,或使代码不能完成正常功能的输入,如上例中Trim函数要求输入的是字符串,如果输入的是非字符串,而是数字类,看单元是否会提出相应的出错。
上面大体上介绍了一下单元测试当中的功能测试,现在再介绍一下单元测试中用得较多的一种测试技术:白盒测试。它是针对程序的逻辑结构来设计测试用例进行测试的。白盒测试用逻辑覆盖率来衡量测试的完整性。逻辑单位主要有:语句、分支、条件、条件值、条件值组合,路径。语句覆盖就是覆盖所有的语句,其他类推。另外还有一种判定条件覆盖,其实是分支覆盖与条件覆盖的组合,在此就不作具体讨论。
那么白盒测试与功能测试间有什么关系呢?可以说,如果功能测试是足够充分的,那么白盒测试就没有必要,从等价类的角度来看,足够充分是指,等价类的划分是完全正确的,并且所有的等价类都测试到了。如何衡量功能测试的完整性呢?人工审核是一个方法,不过这种方式代价较高,并且仍然不能保证结果的准确性。难于衡量测试的完整性是功能测试的主要缺陷,而白盒测试恰恰具有易于衡量测试完整性的优点,两者之间具有极好的互补性。
根据上面讲的单元测试,具体应由哪些人来实施呢?回答这问题答案前,我们先来明确一下单元测试的目标是什么:进行单元测试主要是确保模块当中的程序代码没有错误。通常主要是由我们的程序人员来做程序逻辑结构上的测试,通常是边开发边测试; 测试人员也可以做一些单元功能上的测试,比如通过设计测试数据在模块间进行参数的传递与调用,来确定模块当中存有的错。
单元测试过程当中使用的测试方法有哪些呢?其它就是两大类:静态与动态两种。静态就是对代码程序进行分析来找错,它分为:人工与自动。动态:就是对代码程序进行执行来找出问题。当中也分两种:人工与自动。具体看一下:人工静态测试方法是指通过人工审阅代码来查找错误,一般由程序员之间交叉查看对方的代码,可能发现有特征错误和无特征错误。自动静态是说用测试工具来扫描代码,根据某些预先设定的错误特征,发现并报告代码中的可能的错误,它只能发现语法上的错,而不能发现语义上的错!举个简单的例子:对于
Int Add (int a, int b)
{
return a-b;
};
这段代码,用自动静态测试方法是找不出当中的语义错误的。人工动态测试方法是说,通过人工设定程序的输入和预期的正确输出来执行程序,并判断实际输出是否符合预期。这里所说的“人工”仅指测试用例的输入和预期输出是人工设定的,其他工作可借助测试工具自动完成。比如上面提到的加法函数,只要人工建立一个测试用例,输入两个2,来判断最后的输出是不是为4,如果不是,就说明代码中有错。自动动态测试的意思是使用工具自动生成测试用例并执行被测试程序,通过捕捉某些行为特征(如程序发生异常等)来发现错误,它也只能发现语法上的错,对语义上的错是不能作判断的,毕竟它是一种工具,而不能像人那样了解代码的功能!
总结一下,在我们软件开发过程中,实施单元测试不单保证了我们的代码质量,最主要的是它可以减少后期的测试工作使程序中的错误提前被解决,而不至于到后面再来找错误原因,那这样所花费的工作量是前面的两倍甚至更多,由此可见,做好单元测试的意义有多大了。 |
|