发布时间:2026-08-31 10: 41: 00
在Parasoft C/C++test中做单元测试时,Stub可以替代外部接口、底层驱动或者当前测试环境无法直接调用的函数。真正容易出问题的并不是“有没有生成桩”,而是测试执行时究竟用了哪一个函数定义,以及当前Test Case的返回值配置有没有在调用前生效。碰到桩函数明明设置了返回值,被测函数却拿到0、false、空指针或者原函数结果时,可以从Stub类型、测试步骤顺序和Instrumentation配置三个方向检查。
一、Parasoft旗下C/C++test怎么配置单元测试桩函数
C/C++test提供User Stub和Auto Stub两种常用方式。需要主动覆盖一个已经存在的函数时,User Stub更合适;只是为了补齐缺失的Symbol,则可以生成Auto Stub。
1、从Stubs视图创建桩函数
①先执行一次准备使用的单元测试Test Configuration,让C/C++test完成Symbol收集。
②进入【Parasoft】→【Show View】→【Stubs】。
③在【Symbol】列中找到需要替换的函数。
④查看【Definition】,确认当前显示的是【Original】【Auto】【Safe】还是其他定义。
⑤如果原函数已经存在,但测试中不希望真正调用它,右键选择【Create User Stub】。
⑥选择Stub文件的保存目录和文件名。
⑦向导完成后,打开生成的Stub文件。
⑧检查函数参数、返回类型和原函数是否一致。
⑨保存文件后重新执行测试。
User Stub的优先级高于Original,因此即使项目本身已有函数定义,也可以让测试进入这个User Stub。
2、给缺少定义的Symbol生成Auto Stub
①继续在【Stubs】视图中检查目标函数。
②如果【Definition】显示【N/A】,说明当前没有可用定义。
③右键该函数,选择【Generate Auto Stub】。
④确认Auto Stub输出目录。
⑤打开自动生成的Stub文件。
⑥检查函数声明和返回类型是否完整。
⑦需要自定义默认行为时,修改Stub中的逻辑。
⑧保存后重新运行分析和测试。
Auto Stub的优先级低于User Stub、Safe Stub和Original。项目或库中已经存在原函数时,即使生成了Auto Stub,也不代表执行时一定会进入它。
3、按不同Test Case设置返回结果
同一个Stub在不同测试场景下经常需要返回不同值,这时可以通过Test Case Editor配置,而不必反复修改Stub源文件。
①确认【Enable Stub Callbacks】已经启用。
②打开目标Test Case。
③在调用被测函数之前加入【Stub Configuration】。
④在【Function】中选择对应Stub。
⑤需要修改简单类型返回值时,使用【SET RETURN VALUE】。
⑥填写本次Test Case需要的值。
⑦在后面再加入被测函数的【Call】步骤。
⑧执行Test Case并查看实际结果。
如果Stub Configuration放在Call之后,本次调用不会使用这项新配置。
二、C/C++test桩函数返回值异常如何排查
返回值和预期不一致时,先别急着改数值。更应该先确认测试到底进入了哪一个函数定义,因为不少问题都是“改了Stub,但执行的其实还是Original”。
1、先确认实际使用的Definition
①重新执行一次出现异常的单元测试。
②打开【Parasoft】→【Show View】→【Stubs】。
③找到目标函数并查看【Definition】。
④显示【User】时,当前使用的是User Stub。
⑤显示【Original】时,测试仍然调用原函数。
⑥显示【Auto】时,当前使用自动生成Stub。
⑦显示【Safe】时,当前调用的是C/C++test提供的Safe Stub。
⑧如果显示结果和预期不一致,先处理Stub选择问题,再继续查返回值。
C/C++test对不同定义存在优先级,因此Definition是判断桩是否真正生效的直接依据。
2、检查Stub Configuration执行顺序
①打开异常Test Case。
②找到目标【Stub Configuration】。
③确认它出现在被测函数【Call】之前。
④同一个Stub配置过多次时,检查离当前Call最近的一项。
⑤确认【Function】选择的是实际使用的Stub。
⑥检查【SET RETURN VALUE】里的值和数据类型。
⑦重新单独运行这个Test Case。
⑧观察被测函数获得的结果。
如果一个测试用例中多次修改同一个Stub行为,后续调用会使用调用前已经生效的配置,因此步骤位置会直接影响结果。
3、确认是不是回到了默认Stub逻辑
Auto Stub或其他C/C++test Stub如果没有为当前Test Case定义Stub Callback,会执行自身默认逻辑,简单类型通常会返回0、false或null。
①检查当前Test Case是否真的存在对应【Stub Configuration】。
②确认【Enable Stub Callbacks】已经开启。
③打开目标Stub文件查看默认逻辑。
④检查当前Test Case是否注册了对应Callback。
⑤没有测试用例专属配置时,补充Stub Configuration。
⑥再次执行测试并检查返回结果。
三、配置看起来正确但返回值仍异常怎么继续检查
如果Stubs视图已经显示目标Stub,Test Case中的返回值配置也没有问题,就要继续检查测试执行配置。Instrumentation不支持Stub,或者外部库中的原函数没有被替换,也会造成桩逻辑没有按预期执行。
1、检查Instrumentation配置
①进入【Parasoft】→【Test Configurations】。
②打开当前真正用于执行测试的配置。
③进入【Execution】→【General】。
④查看【Instrumentation mode】。
⑤选择支持Stub Instrumentation的模式。
⑥使用Custom instrumentation时,打开详细设置。
⑦确认Function Stub相关功能已经启用。
⑧保存后重新Build Test Executable,再运行测试。
2、外部库函数检查Stub all calls
①回到【Stubs】视图查看目标函数的【Location】。
②如果函数来自外部Library,确认当前测试确实需要替换它。
③打开当前Test Configuration的Instrumentation设置。
④检查【Function stubs mode】。
⑤需要替换库中已经存在的函数时,可设置【Stub all calls】。
⑥重新构建测试可执行文件。
⑦再次查看【Definition】是否已经切换到目标Stub。
3、重新构建测试执行环境
①保存所有Stub文件和Test Case修改。
②执行【Build Test Executable】。
③确认没有重复Symbol或旧Stub相关错误。
④重新执行【Run Unit Tests】。
⑤再次检查【Stubs】视图中的Definition。
⑥使用固定输入运行目标测试。
⑦对照预期值和实际返回值。
总结
C/C++test桩函数返回值异常时,最先要确认的是当前测试究竟使用了User Stub、Auto Stub还是Original,然后再检查Stub Configuration是否在Call之前生效。若这两项都没有问题,就继续核对Instrumentation和Function stubs mode。把Stub定义、Test Case步骤和Test Configuration放在一起检查,比单独反复修改返回值更容易找到异常来源。如需进一步了解Parasoft C/C++test桩函数配置、Stub Callback与返回值异常排查方法,欢迎联系咨询。
展开阅读全文
︾