调测工具VcTester攻略之
使用脚本桩构造数据驱动测试
作者:网际游民,成稿于2010年2月
关于本系列文章
本系列文章罗列如下:
《调测工具VcTester攻略之:搭建敏捷开发环境》
《调测工具VcTester攻略之:使用快捷编辑功能》
《调测工具VcTester攻略之:快速定位问题》
《调测工具VcTester攻略之:敏捷开发方式下调测组织过程》
《调测工具VcTester攻略之:脚本驱动API测试》
《调测工具VcTester攻略之:使用脚本桩构造数据驱动测试》
撰写本系列文章时得到ezTester技术专家Sundy多次帮助,在此谨表感谢!
数据驱动适用哪类API测试
API测试是一种软件自动化测试,它在模块接口或组件接口发起测试,并提供测试结果自动检验。
数据驱动测试(Data-driven Testing)与关键字驱动测试(Keyword-driven testing)是API测试的两大流派,前者适用于接口操作简单,软件复杂性体现于驱动数据变化上的测试,后者适用于接口操作复杂,软件复杂性体现于操作组合上的测试。前者有时也称为表格驱动,因为电子表格(如Excel)适合用来构造测试数据,后者有时也称ActionWord驱动,因为在自动化封装时关键字(Keyword)通常称为ActionWord(简称AW)。
当然,数据驱动与关键字驱动互不排斥,驱动数据庞大复杂与操作接口繁杂易变并存于一个系统的情况很常见,将两者结合起来使用才达到最佳效果。
用Excel构造测试数据
接下来我们试验在Excel表格编辑测试数据,然后在VcTester中把测试数据读出来。因为测试数据内容格式通常比较简单,选择csv格式就够用,比如我们在Excel表格编辑如下图两行测试数据:
然后将它保存为csv格式的文件,在“另存为”对话框选择csv格式。
csv格式文件是纯文本文件,各表格单元用逗号分割来表示,它既可以用Excel打开编辑,也可用各种文本编辑工具打开编辑,比如我们用记事本打开它:
接下来,我们借助VcLib库(该库在上一篇《调测工具VcTester攻略之:脚本驱动API测试》有介绍),在VcTester中读入上述TestData.csv文件中的数据。编写如下脚本:
上面代码中csvSplit函数把以逗号间隔的csv行字串分解回表项,还面介绍借助脚本桩实现数据驱动测试的实例时将附上csvSplit函数原码。运行上述脚本,打印信息如下:
借助脚本桩实施自动化测试
用CSE脚本顺利读取在Excel编辑的测试数据后,接着我们想办法把测试数据插到被测系统中使用,让测试数据驱动起各项测试,并实现结果是否预期的自动判断。VcTester的脚本桩功能,为测试数据驱动插入及在特定位置添加结果值判断提供了方便。为更清晰说明这个问题,我们拿一个实际的VC工程来举例。
这是一个计算消息摘要算法MD5值的例子,程序的主循环处理过程如下:
GetString函数等待用户在命令行键入一行字串,然后用计算该字串的MD5值,最后用PrintResult打印结果信息。
我们只需给GetString打一个脚本桩,将原先的从键盘读入一行字串,替换成从csv文件读取,之后在PrintResult函数打一个脚本桩,对测试结果是否预期进行检验。前面举例的TestData.csv中两列数据正好提供给这两脚本桩用作数据源,两个脚本桩定义如下:
在前一个脚本桩中“strcpy(buff,sCurrInputStr)”一句将从CSV文件读入的字串拷贝给GetString的传入参数buff,以此代替键盘输入,在后一脚本桩中“strcmp(hash,sCurrExpected)”用于判断MD5结果值是否预期。
用命令行自动启动API测试?
接下来,我们借助vtConsole.exe命令行工具自动启动API测试,而不是在VcTester集成界面手工测试。vtConsole.exe在VcTester安装目录下可找到,命令行参数格式可参考《VcTester使用手册》中“附4.搭建自动构建与自动测试环境”一节。
假定VC工程Md5Code保存在C:/VcTester51/sample目录下,导入到VcTester后的工程名为Md5Code.cseprj,与被导入的VC工程放同一目录。我们在C:/VcTester51/sample目录下创建一个批处理文件autorun.bat,在该文件编写如下批处理指令:
之后,我们按手册要求,在test.cse文件末尾添加一条语句:
guiNotify(99);
这条语句用来通知自动测试结束,当你没按规范方式组织测试用例树时,才需要添加这条通知语句。接下来,我们在DOS窗口运行这个autorun.bat文件,运行结果如下图:
从打印信息可看出,测试正常运行了,测试结果是预期的。
能用DOS命令发起自动测试后,我们还可以进一步让这种验证工作例行起来,比如,添加到Windows的计划任务中,让它在指定时间自动运行,或将这个批处理命令集成到ANT、CruiseControl等工具中,以此支持每日构建、自动回归测试、自动验收测试等实践。
数据驱动与关键字驱动能否互相转换?
数据驱动的API测试已轻松搞掂,能否一股作气把关键字驱动也搞掂呢?我寻摸了半天,最后发现这个功能远非像我这样挤点业余时间所能做的,算了,不做了,跟大家共享几点心得吧。
从技术实现角度,不妨把关键字驱动也看成一种特殊格式的“驱动数据”,这种数据有个动作名称(即ActionWord),后带若干参数,参数个数是变化的。当我们把动作名称与参数都看成类型为string的字串,关键字驱动有点向数据驱动靠近了。
之后要设计一种动作流控制语言,最基础的,像if、else、while循环是要提供的,此外子过程routine定义也得支持,否则,测试中一些公共的操作过程无法重用,这将严重影响测试设计效率。仔细推敲一下,if、else控制流要支持,子过程可定义,变量定义也得提供吧,否则if、while判断什么呢?子过程调用传递什么呢?把这些东西合起来就是一个小型解释器了。
有了小型解释器后,还需将AW测试用例描述与VcTester的映射函数关联起来,提供类型检查、字串转化等功能。做得完善一点,最好还有测试例程控制,测试执行过程被监控,要有记录,有起停控制,能生成测试报告。
除了这些,EXCEL也得做一些封装,否则,输入文本缺少提示比较难用。总之,工作量不小。不过,摸索摸索还是有点心得,把关键字驱动也看作一种数据驱动应该可行,用VcAuto自定义的TinyActionWord组件封装AW也这么做的,动作名称与参数都按string格式传递并处理的。
相关文章:
《调测工具VcTester攻略--敏捷开发方式下调测组织过程》
《调测工具VcTester攻略--使用脚本桩构造数据驱动测试》