单元测试的基本测试方法

发表于:2010-11-12 13:53

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

  预期输出是指:返回值及被测试函数所写入的外部数据的结果值。返回值就不用说了,被测试函数进行了写操作的参数(输出参数)、成员变量、全局变量、IO媒体,它们的预期的结果值都是预期输出。

  一个函数无论多复杂,都无非是对这几类数据的读取、计算和写入,我们的测试目的,就是要检验程序的这些行为是否符合要求。

  总而言之,输入就是被测试程序要读取的数据,我们要设定它们的初始值,输出就是被测试程序要改写的数据,我们要判断它们的结果值是否符合预期。

  我们只需要关注外部数据中真正需读取或写入的部分,不必理会其他部分,例如,一个参数,它是一个结构,有十个域,但是被测试函数只需要读取其中的一个域,那么测试用例只需要为这个域设定初始值;再如,被测试类中有十个成员变量,但是被测试函数只需要读取其中的一个,那么测试只需要为这个成员变量设定初始值。对预期输出的判断也一样。

  5、测试代码

  为了简单和实用,建议这样组织测试代码:一个产品类对应一个测试类,一个产品函数对应一个测试函数,一个测试函数内包括若干个测试用例。

  下面是函数CMyClass::Add(int a, int b){return a+b;};的测试函数:

void CMyClassTester::Add_int_int()
{
//第一个测试用例
{ CMyClass* pObj = new CMyClass(); //1
int i = 0; //2
int j = 0; //3
int ret = pObj->Add(i, j); //4
ASSERT(ret == 0); //5
delete pObj; } //6
}

  把参数表作为测试函数的函数名的一部分,这样当出现重载的被测试函数时,测试函数不会产生命名冲突。第1和第6行建立和销毁被测试对象,所加的{}是为了让每个测试用例的代码有一个独立的域,以便多个测试用例使用相同的变量名。第2和第3行是定义输入数据,第4行是调用被测试函数,第5行是预期输出,它的特点是当实际输出与预期输出不同时自动报错,ASSERT是VC的断言宏,也可以使用其他类似功能的宏,使用测试工具进行单元测试时,可以使用该工具定义的断言宏。更多的测试用例可以通过拷贝现有用例并修改输入输出的方法建立。

  前面的例子是使用产品代码所用的语言来编写测试代码,还有一种方式是使用脚本语言来编写测试代码,后者的优点是无需编译即可执行测试,但缺点也非常明显:需要另外掌握一种脚本语言;复杂数据类型处理起来比较麻烦;前置操作和后置操作很难处理(要使用一种语言去调用另一种语言的代码);在两种语言间来回切换会严重干扰人的思维,边开发边测试调试时,这种干扰思维所损失的时间可能比免编译所节约的时间多得多。

  至于测试数据的组织,前面的例子是直接保存于代码中,另一种方式是保存于电子表格中(包括保存于数据库中),后一种方式对于测试工具开发商来说无疑是一种好选择,因为数据是独立的,测试工具容易保证新旧版本的兼容性,降低了工具开发难度,但却难于适应复杂的应用。测试这样的代码:int Add(int a, int b){return a+b;};数据怎么组织都行,但实际应用却是很复杂的,例如,输入数据是复杂类型,可能只需要为其中的一个域设定初始值,设定初始值的途径又可能是调用对象的接口;输入数据可能需要经过中间处理;需要执行前置操作;输出要判断多个数据的结果值,这些数据又可能是高级类型,需要调用其接口来判断状态;需要执行后置操作等等,这些输入输出实际上就是代码,写在表格中显然极不方便,勉强写在表格中,使用时不可避免会产生大量的编译或解析错误,要反复地修改,反复导入,反复编译或解析,效率低下,难于适应实际的应用。

  6、代码的可测性

  具有良好整体结构的代码,应该符合"低耦合"的特性,形象地说,就是"各家自扫门前雪、不管他人瓦上霜",每一个函数、每一个类、每一个模块,都应该只做自己该做的事,不要把应该由"其他人"做的事扯进来。 通常,"低耦合"的代码具有可测性,具有不当高耦合特性的代码通常不具可测性,一般来说,如果代码不具可测性,那么加入测试工程后,会产生编译错误,导致测试无法进行。

  高质量代码应该具有正确性、可测性、可复用性、可扩展性。可测性是最基本特性,能测试才能检验和提高正确性,具备了可测性,也就具备了最基本的可复用性和可扩展性。解决不当耦合的 较好手段是重构,即改良代码结构,这样不但能顺利完成测试,更重要的保证了代码具有良好的整体结构,使代码易于维护和复用。

32/3<123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号