高效开发与彻底测试
2010-09-04 20:48:16 来源:WEB开发网专门驱动
专门驱动离单元测试只有一步之遥了,只要在驱动代码中添加判断预期输出的语句就构成了完整的测试代码,因此,在实际工作中,采用专门驱动最好是边编码边测试,并使用测试代码作为调试驱动。下面是为函数CExFunction::ParseOneParameter ()编写的调试驱动代码:
{CExFunction* pObj = new CExFunction();
CTokenList iList;
CTokenReader reader;
reader.ReadTokenList(iList, "int i");
PARAMETER* ret = pObj->ParseOneParameter(iList) ;
ASSERT( ret->type == "int" );
ASSERT( ret->name == "i" );
reader.ClearTokenList(iList);
delete pParam;
delete pObj;}
上面的代码其实是一个测试用例的完整代码,测试代码通常都是很简单的,功能无非是使被测试的代码得于执行,被测试代码通常都涉及到外部数据,如参数、成员变量、全局变量什么的,这些数据当然要设定初始值,例如,上面的测试用例是将字符串"int i"经过CTokenReader对象的ReadTokenList方法转换成CToken对象指针的列表作为参数iList的输入。
在实际工作中,函数的输入输出常常不是简单的数据类型,而是某些对象甚至是对象的集合,本例中,输入的数据就是CToken对象 指针的列表。这种情况下, 一般借助现有的代码来生成数据,通常,这些"现在代码"都是存在的,因为即使不做测试,也总有代码要调用该函数的,调用代码本来就需要生成相应的数据。本例中,CTokenReader::ReadTokenList()函数就是把字符串转换为CToken对象指针的列表。
只要写完了第一个测试用例的代码,更多的用例就简单了,只要拷贝并对输入输出数据进行修改就行。细心的读都可能已注意到,第一个测试用例的前后加了{},这是为了多个测试用例可以使用相同的变量名。
使用这种方法,建立测试代码通常是很快的。编写很简单的函数时不需要调试,当然也不需要测试代码。测试代码的组织也很简单:一个产品工程对应一个测试工程,一个产品类对应一个测试类,一个需要测试的产品函数对应一个测试函数。测试工程可以加一个简单的界面,以便执行指定的测试,也可以使用相应的工具如CppUnit。
再回到我们的主题:调试。有了测试代码,调试就简单了,要调试某种输入,只要在相应的测试用例中加断点就行了。使用这种方式,仅就调试来说,好处也是非常明显的:
所有输入在一起列出来,调试比较全面,程序员的思维也会比较全面;
要调试指定的输入很容易,通常不需要高级断点,更不需要通过反复跟踪来捕捉需要的输入;
调试数据可以永久保存,避免了以后修改代码时的重复工作。
更多精彩
赞助商链接