TESSY中文网站 > 新手入门 > TESSY C 单元测试怎么做Stub TESSY C 外部依赖怎么隔离
TESSY C 单元测试怎么做Stub TESSY C 外部依赖怎么隔离
发布时间:2026/04/22 10:43:33

  在TESSY里做C单元测试时,最容易失控的地方通常不是测试数据不会填,而是被测函数一旦依赖外部函数、底层驱动或同文件里的局部函数,测试边界就会立刻变糊。Razorcat官方对这件事说得很清楚,TESSY本身就提供stub function机制,用来替代缺失的外部函数;而且它不只支持普通stub,还支持Advanced Stubs、synthetic variables,以及把对象文件或库链接进测试驱动这几种不同层次的做法。也就是说,TESSY里的Stub不是补丁动作,而是隔离外部依赖的正式手段。

  一、TESSY C单元测试怎么做Stub

 

  TESSY C单元测试怎么做Stub,关键不是一上来就写stub代码,而是先让TESSY识别出哪些函数属于外部依赖,再决定它们该用普通stub还是更细粒度的高级stub。官方应用说明里给出的标准流程很明确,先在TIE里定义stub,再到TDE里补stub行为。

 

  1、先让TESSY识别外部函数

 

  Razorcat官方说明里写得很直接,外部函数会列在TIE里的External Functions区域。只有这些依赖先被识别出来,后面你才能决定哪些函数要被替换成stub,哪些还保留真实实现。也正因为这样,做Stub的第一步不是写代码,而是先在接口层把外部依赖看清。

 

  2、在TIE里为外部函数创建Stub

 

  官方应用说明给出的两步法非常明确,第一步是在TIE perspective里让TESSY为缺失的外部函数定义一个替代stub;第二步才是在TDE perspective里填写对应stub的代码。也就是说,Stub的生成和Stub的行为实现是分开的,不是手工随便建一个同名函数就算完成。

 

  3、普通Stub适合先把依赖替换掉

 

  如果你当前的目标只是让被测函数先跑通,普通stub就够用。官方说明里提到,TESSY会根据分析到的函数签名自动生成带参数和返回值的stub框架,而函数体一开始是空的,你再在Stub Code区域里补具体逻辑。这种方式最适合先把底层依赖切断,让测试对象能独立执行。

 

  4、Advanced Stub适合精细控制参数和返回值

 

  当你不只是想“替掉”函数,而是想把外部调用也纳入测试数据管理,就应该考虑Advanced Stub。官方说明里,Advanced Stubs可以把外部函数的参数和返回值当成普通输入输出一样处理,而且这些值会出现在TDE和测试报告里;对于标量类型,还可以给每次调用准备不同的值向量。这样做以后,外部依赖就不再只是黑盒,而会进入测试用例本身。

 

  5、同文件里的局部函数也可以被Stub掉

 

  这一点很重要,因为很多C项目的依赖并不都在外部模块。Razorcat官方明确说明,除了缺失的外部函数,source file内定义的local functions也可以用stub函数替换,而不是继续调用原始实现。这意味着在TESSY里,隔离边界不只停在模块边界,连单个源文件内部的局部依赖也可以切出来单独控制。

 

  二、TESSY C外部依赖怎么隔离

 

  TESSY C外部依赖怎么隔离,真正要先分清的是,你要隔离的是“函数存在性”,还是“调用行为”,还是“复杂数据交互”。因为这三种情况在TESSY里对应的处理方式并不完全一样。官方应用说明里其实已经把这几条路分别给出来了,所以隔离外部依赖时更适合按依赖复杂度选方法,而不是所有依赖都用同一种stub写法。

 

  1、普通外部函数优先用普通Stub隔离

 

  如果依赖函数本身只是被调一下,且你只需要控制其返回值或少量输出参数,普通stub就足够。它的优势是简单直接,先把依赖从真实实现上切开,让单元测试只围绕当前test object展开,而不是把下层模块一起拉进来。这个思路完全符合官方把stub function mechanism作为替代外部函数标准手段的设计。

 

  2、需要逐次调用不同结果时用Advanced Stub

 

  当同一个外部函数会在一条测试路径里被连续调用多次,而且每次都要返回不同值,普通stub很快就会写得很重。官方说明里,Advanced Stub支持对标量参数和返回值提供向量,TESSY会按后续调用顺序依次取值。放到外部依赖隔离上,这意味着你可以把“底层接口连续返回不同状态”的行为直接抽出来做测试输入。

  3、复杂类型返回和复杂参数更适合synthetic variables

 

  官方文档还给出另一条路,就是用synthetic variables给stub提供参数或返回值,尤其适合每次调用都要传不同复杂类型时。也就是说,当外部依赖不再是简单`int`或`short`这类标量,而是结构体、联合体或更复杂的数据对象时,不要勉强把它塞进普通向量输入,直接切换到synthetic variables会更稳。

 

  4、想保留部分真实下层实现时可以链接对象文件或库

 

  Razorcat官方说明里明确提到,除了写stub代码,你还可以把包含stub函数的对象文件或库直接链接到测试驱动里;甚至也可以通过这种方式去做更靠近集成测试的场景,把先前已经测过的下层函数真实链接进来。这说明“隔离外部依赖”并不总等于“全部fake掉”,而是可以按测试目标决定哪些依赖用stub,哪些依赖用真实实现。

 

  5、测试报告里也要看见这些隔离动作

 

  外部依赖一旦被隔离,后面最怕的是测试过了,但没人知道底层到底被怎么替换过。Advanced Stub的一个价值就在这里,官方明确说明它的参数和返回值会出现在TDE和测试报告里。这样后面复核测试结果时,不只是知道主函数输入输出是什么,还能看清外部依赖在每次调用时到底被喂了什么值。

 

  三、TESSY Stub策略怎么定

 

  TESSY Stub策略怎么定,这一步不是重复前两段,而是在解决另一个更容易反复出错的问题,也就是为什么很多团队前面会做Stub,后面还是会把测试边界做乱。根本原因通常不是工具不会用,而是没有把不同层级的依赖分开处理。Razorcat官方已经给了普通Stub、Advanced Stub、synthetic variables和链接库这几种手段,真正要做的,是把它们按依赖类型放到合适位置。

 

  1、简单依赖走普通Stub

 

  如果依赖函数只是辅助取值、写状态、回传单个错误码,这类依赖最适合普通stub。它的目标不是精细模拟协议,而是把“测试对象依赖别人”这件事先切断,让单元测试先回到当前函数本身。

 

  2、交互型依赖走Advanced Stub

 

  如果外部函数的参数、返回值和调用次数本身就是验证重点,比如驱动回读、状态机切换、错误注入或重试逻辑,这时更适合Advanced Stub。因为官方已经说明它能把参数和返回值显式放进TDE和报告里,这种依赖更适合被当作测试输入的一部分来设计,而不是藏在手写C代码里。

 

  3、复杂对象交互走synthetic variables

 

  一旦依赖进入复杂结构体、复杂返回对象或每次调用都不同的复合数据,继续用普通写法会很快失控。官方文档直接指出,synthetic variables特别适合为复杂类型参数或返回值提供每次调用都不同的内容,所以这类依赖更应该按“数据建模”去处理,而不是按“写一段stub逻辑”去硬拼。

 

  4、已验证的下层能力再考虑真实链接

 

  如果某些下层函数本身已经经过验证,而且当前测试目标也需要保留这部分真实行为,那么可以改用链接对象文件或库的方式,把它们带进测试驱动。这样既不需要把所有东西都fake掉,也不会把整条调用链全丢给真正的生产环境去跑。换句话说,TESSY里的隔离不是越彻底越好,而是越贴近你的测试边界越好。

  总结

 

  TESSY C单元测试怎么做Stub,关键是先在TIE里识别并创建外部函数的stub,再到TDE里补行为或数据。TESSY C外部依赖怎么隔离,关键则是按依赖复杂度去选普通Stub、Advanced Stub、synthetic variables或链接库这几条路。等这两步都走顺以后,再把TESSY Stub策略怎么定固定下来,单元测试的边界通常就会比“能跑起来”更清楚,也更容易长期复用。

135 2431 0251