软件开发之面向对象的测试策略(一)
郑州软件公司认为传统的测试计算机软件的策略是从“小型测试”开始,逐步走向“大型测试”。用软件测试的行话来陈述,从单元测试开始,然后逐步进人集成测试,最后是有效性和系统测试。在传统应用中,单元测试集中在最小的可编译程序单位——子程序(如模块、子例程、进程),一旦这些单元均被独立测试后,它被集成进程序结构中,这时要进行一系列的回归测试以发现由于模块的接口所带来的错误和新单元加人所导致的副作用,最后,系统被作为一个整体测试以保证发现在需求中的错误。
1.在面向对象语境中的单元测试
当考虑面向对象软件时,单元的概念发生了变化。封装驱动了类和对象的定义,这意味着每个类和类的实例(对象)包装了属性(数据)和操纵这些数据的操作(也称为方法或服务)。而不是个体的模块。最小的可测试单位是封装的类或对象,类包含一组不同的操作,并且某特殊操作可能作为一组不同类的一部分存在,因此,单元测试的意义发生了较大变化。
我们不再孤立地测试单个操作(传统的单元测试观点),而是将操作作为类的一部分。作为一个例子,考虑一个类层次,其中操作X针对超类定义并被一组子类继承,每个子类使用操作X,但是它被应用于为每个子类定义的私有属性和操作的环境内。因为操作X被使用的语境有微妙的不同,有必要在每个子类的语境内测试操作X。这意味着在面向对象的语境内在真空中测试操作X(即传统的单元测试方法)是无效的。
郑州苹果软件开发认为对面向对象软件的类测试等价于传统软件的单元测试。和传统软件的单元测试不一样,它往往关注模块的算法细节和模块接口间流动的数据,面向对象软件的类测试是由封装在类中的操作和类的状态行为所驱动的。
单元测试是在软件开发过程中要进行的最低级别的测试活动,在单元测试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。在程序设计过程中会有许多种测试,单元测试只是其中的一种,单元测试并不能保证程序是完美无缺的,但是在所有的测试中,单元测试是第一个环节,也是最重要的一个环节。单元测试是一种由程序员自行测试的工作。简单地说,单元测试就是测试代码撰写者依据其所设想的方式执行是否产生了预期的结果。
为什么需要单元测试?当编写项目的时刻,如果假设底层的代码是正确无误的,那么先是高层代码中使用了底层代码;然后这些高层代码又被更高层的代码所使用,如此往复。当基本的底层代码不再可靠时,那么必须的改动就无法只局限在底层。虽然可以修正底层的问题,但是这些对底层代码的修改必然会影响到高层代码。于是,一个对底层代码的修正,可能会导致对几乎所有代码的一连串改动,从而使修改越来越多,也越来越复杂。从而使整个项目也以失败告终。所以,单元测试的核心内涵就是:利用简单有效的技术使代码变得更加完美。
郑州android开发认为传统的单元测试是针对程序的函数、过程或完成某一定功能的程序块。沿用单元测试的概念,实际测试类成员函数。一些传统的测试方法在面向对象的单元测试中都可以使用。如等价类划分法、因果图法、边值分析法、逻辑覆盖法、路径分析法、程序插装法等。单元测试一般建议由程序员完成。
用于单元级测试进行的测试分析(提出相应的测试要求)和测试用例(选择适当的输人,达到测试要求),规模和难度等均远小于后面将介绍的对整个系统的测试分析和测试用例,而且强调对语句应该有100%的执行代码覆盖率。在设计测试用例选择输人数据时,可以基于以下两个假设。
(1)如果函数(程序)对某一类输人中的一个数据正确执行,对同类中的其他输人也能正确执行。
(2)如果函数(程序)对某一复杂度的输人正确执行,对更高复杂度的输人也能正确执行。例如需要选择字符串作为输人时,基于本假设,就无须计较于字符串的长度。除非字符串的长度是要求固定的,如IP地址字符串。
在面向对象程序中,类成员函数通常都很小,功能单一,函数间的调用频繁,容易出现一些不宜发现的错误。例如:
if(-1==Write(fid,buffer,amount)error out();
该语句没有全面检查write()的返回值,无意中断然假设了只有数据被完全写人和没有写人两种情况。当测试也忽略了数据部分写人的情况,就给程序遗留了隐患。
郑州安卓软件开发认为按程序的设计,使用函数 strrchr()查找最后的匹配字符,但误程序中写成了函数strchr(),使程序功能实现时查找的是第一个匹配字符。
又如,程序中将汀(strncmp(strl,str2,strlen(strl)))误写成了if(strncmp(strl,strZ,strlen(str2)))。如果测试用例中使用的数据strl和str2长度一样,就无法检测出。
因此,在做测试分析和设计测试用例时,应该注意面向对象程序的这个特点,仔细地进行测试分析和设计测试用例,尤其是针对以函数返回值作为条件判断选择,字符串操作等情况。
面向对象编程的特性使得对成员函数的测试,又不完全等同于传统的函数或过程测试。尤其是继承特性和多态特性,使子类继承或过载的父类成员函数出现了传统测试中未遇见的问题。从以下两方面来考虑。
1)继承的成员函数是否都不需要测试?
郑州ios开发认为对父类中已经测试过的成员函数,两种情况需要在子类中重新测试:①继承的成员函数在子类中做了改动。②成员函数调用了改动过的成员函数的部分。例如:
假设父类 Bass有两个成员函数:Inherited()和 Reddined(),子类 Derived只对Redefined()做了改动。Derived::Redefined()显然需要重新测试。对于 Derived::In-bented(),如果它有调用Redefined()的语句(如 x—x/Redefined(》,就需要重新测试,反之,无此必要。
2)对父类的测试是否能照搬到子类?
援用上面的假设,Base::Redefined()和 Derived::Redefined()已经是不同的成员函数,它们有不同的服务说明和执行。对此,照理应该对 Derived::Redefined()重新测试分析,设计测试用例。但由于面向对象的继承使得两个函数有相似,故只需在Base::Redefined()的测试要求和测试用例上添加对 Derived::Redfined()新的测试要求和增补相应的测试用例。例如:Base::Redefined()含有如下语句。
If(value<0)message(“less”);
else if(vaIne==0)message(“equal”);
else message(more”);
Derived::Redfined()中定义为:
If(value<0)message(“less”);
eke If(vahe—一0)message(‘l Is equal”);
else
{message(“more”);
在原有的测试上,对 Derived::Redfined()的测试只需做如下改动:将 value—0的测试结果期望改动;增加value==88的测试。
郑州plc开发认为多态有几种不同的形式,如参数多态、包含多态、过载多态。包含多态和过载多态在面向对象语言中通常体现在子类与父类的继承关系,对这两种多态的测试参见上述对父类成员函数继承和过载的论述。包含多态虽然使成员函数的参数可有多种类型,但通常只是增加了测试的繁杂。对具有包含多态的成员函数测试时,只需要在原有的测试分析和基础上扩大测试用例中输人数据的类型的考虑。
转载请注明出处:郑州知网软件 http://www.nwisdom.com
联系我们
软件开发: 15838307519(司经理)
网络营销: 13676968269(王经理)
网络建设: 13073737771(郭经理)
24小时服务电话: 0371-56683330