测试一个函数时,它可能会顺带访问数据库、设备接口或尚未完成的模块。想让这些调用按预设结果返回,就需要设置桩函数。下面以C/C++test Professional的Eclipse集成界面为例,说明怎样创建桩,以及调用异常时从哪里查起。
一、C/C++test怎么设置单元测试桩函数
先让工具识别被测代码调用了哪些函数,再决定为哪个函数建桩。如果目标函数已有原始实现,创建用户桩更合适;自动桩主要用于缺少实现的函数。
1、查看需要建桩的函数
①在项目树中选中被测源文件,运行【Collect Stub Information】测试配置。
②依次点击【Parasoft】→【Show View】→【Stubs】,在列表中找到目标函数。
③查看该行的【Definition】和【Location】,确认当前使用的是原函数、已有桩,还是尚未找到定义。
2、创建并保存用户桩
①在【Stubs】视图中右键点击目标函数,选择【Create User Stub】。
②在弹出的窗口中填写桩文件名和保存位置,点击【Finish】。
③在生成的函数体中填入测试所需的返回值或参数处理代码,保存文件。
如果列表显示目标函数缺少定义,也可以右键选择【Generate Auto Stub】。生成后打开桩文件,补齐未完成的返回语句,再保存。已有原函数时,不要指望自动桩覆盖它:C/C++test会优先使用原函数。
3、为测试用例指定返回值
需要让同一个桩在不同用例中返回不同结果时,可以在测试用例编辑器里配置。
①在【Test Case Explorer】中双击要修改的测试用例。
②在【Add new】中选择【Stub Configuration】,点击【+】,将该步骤拖到【Call】之前。
③在【Function】中选定桩函数;在【Action】中选择【SET VALUE】,将【P1】填为*__return,在【P2】填写预期返回值。
④点击【File】→【Save】,运行该测试用例。
二、C/C++test桩函数调用异常如何排查
先看现象:程序仍进入原函数、桩被调用却返回错误结果,还是测试程序根本无法构建。三种情况的检查位置不同。
1、程序仍然调用原函数
①运行【Collect Stub Information】,打开【Parasoft】→【Show View】→【Stubs】。
②如果目标函数的【Definition】显示【Original】,右键该函数选择【Create User Stub】,保存后重新运行测试。
③依次打开【Parasoft】→【Test Configurations】→【Execution】→【General】,检查【Instrumentation mode】,选择包含桩插桩功能的模式。
④如果目标函数来自项目外的库,在同一页选择【Custom instrumentation】,点击【Edit】,将【Function stubs mode】设为【Stub all calls】。
2、桩已调用,但返回值不对
①打开对应测试用例,检查【Stub Configuration】是否位于目标【Call】之前。
②核对【Function】是否选中了正确的函数,并检查【SET VALUE】对应的【P1】、【P2】。
③在【Stubs】视图菜单中打开【Stub settings...】,检查【Enable Stub Callbacks】;如果建桩时未启用,启用后重新生成桩。
④检查是否启用了【Insert call to original function】;若不需要在未配置回调时调用原函数,取消该选项并重新生成桩。
3、构建报错或桩函数找不到
①在【Stubs】视图中查找目标函数,查看【Definition】是否标有【conflict】;如有,移除重复的用户桩定义。
②依次打开【Parasoft】→【Test Configurations】→【Execution】→【Symbols】,核对【Use extra symbols from files found in】是否包含桩文件所在目录。
③重新运行【Collect Stub Information】,再运行测试;检查构建输出中指向的函数名和桩文件位置。
三、同一个桩被调用多次怎么核对
有些被测函数会在一次执行中反复调用同一个依赖。只看最终返回值,容易漏掉调用次数或顺序上的问题。
1、给每次调用设置不同结果
①打开测试用例的【Stub Configuration】,在【Action】中选择【SET VALUE】。
②在【P1】填写*__return,在【P2】按调用顺序填写花括号包围的逗号分隔值,例如{0,-1}。
③保存并运行用例,核对第一次和第二次调用后,被测函数分别进入了预期分支。
2、检查桩到底调用了几次
①在【Add new】中选择【Stub Expectations】,点击【+】,将它拖到相关【Call】之前。
②在【Action】中选择【EXPECT NUMBER OF CALLS】,填写目标函数和预期次数。
③保存并运行测试用例,查看调用次数是否符合预期。
总结
桩函数能帮你把难以控制的外部调用变成可重复的测试条件,也让异常分支更容易验证。写用例时,不妨同时想清楚“希望它返回什么”和“希望它被调用几次”,后续修改代码时也更容易看出行为变化。希望这篇关于C/C++test单元测试桩函数设置与调用排查的内容对大家有帮助;如有C/C++test相关需求,欢迎联系我们咨询。