TESSY中文网站 > 使用教程 > TESSY Stub怎么配复杂结构体 TESSY Stub数据构造怎么组织
TESSY Stub怎么配复杂结构体 TESSY Stub数据构造怎么组织
发布时间:2026/04/22 10:45:57

  在TESSY里配Stub,真正容易把人卡住的,往往不是普通整型参数,而是结构体一复杂,里面再套指针、数组、子结构之后,测试数据一下就散了。Razorcat官方资料把这件事说得很清楚,Advanced Stubs会把被调函数的参数和返回值像普通输入输出一样放进TDE里处理,所以复杂结构体能不能配顺,关键不在“有没有Stub”,而在“你有没有把结构体按可输入、可观察、可替换的层级拆开”。

  一、TESSY Stub怎么配复杂结构体

 

  先不要一上来就把整块结构体当成一个整体硬填。更稳的做法,是先把Stub函数建成Advanced Stub,再回到TDE里按成员层级去看接口。官方手册说明,Advanced Stub可以为外部函数和本地函数创建,而且这些参数和返回值会像普通变量一样出现在TDE中。

 

  1、先把目标被调函数改成Advanced Stub

 

  如果这个函数后面要看参数传入、返回值回传,或者要针对不同测试步给不同返回行为,就先把它建成Advanced Stub。官方手册明确写到,Advanced Stub既可以用于external function,也可以用于local function,而且可以按模块全局方式创建。

 

  2、结构体先按成员树展开,不要一格塞完

 

  TDE本身就是按接口树组织数据的。官方手册说明,TDE里会把测试对象接口拆成不同section节点,再往下挂各自的子元素,所以复杂结构体更适合顺着成员层级一层层展开来填,而不是把它当成单一值处理。这个做法不是额外规则,而是顺着TDE的结构来配,后面最不容易乱。

 

  3、带指针成员的结构体先把目标对象单独建出来

 

  官方手册把“pointer targets”单独列成TDE里的一个接口区,这一点很关键。只要结构体成员里带指针,就不要只在父结构体那一行填表面值,而是要继续把指针所指向的目标对象单独展开,否则后面执行时看起来像“结构体传进去了”,其实关键数据并没有真正落到目标内存。

 

  4、数组成员和数组指针不要按Advanced Stub变量硬顶

 

  这一点特别值得先说清。Razorcat的官方手册明确写到,Advanced stub variables不能直接创建给arrays和pointer to arrays;另外较新的发布说明还专门补了一条提示,advanced stub vector values不支持直接填到struct或union的成员上。也就是说,结构体里一旦带数组或数组指针,就不要按“整块成员直接塞进Stub向量”的方式处理,更稳的是拆到普通测试数据层或指针目标层去配。

 

  二、TESSY Stub数据构造怎么组织

 

  数据组织这件事,最怕的不是数据多,而是同一条Stub既想管输入,又想管返回,还想顺手塞进多个测试步里,最后谁对应谁全混了。Razorcat官方手册对TDE的组织方式写得很清楚,测试数据至少分成输入、期望输出和接口节点几个层级,而且测试步本身又是可新增的,所以更稳的做法,是先按“一个测试意图对应一组Stub数据”去组织,再往下扩成多个测试步。

 

  1、先按测试步组织,不要按变量名零散堆

 

  官方手册说明,TDE是按test step录入测试数据的,而且test step可以新增、删除和清空。对复杂Stub来说,更实用的做法就是把每一种调用场景单独放成一个测试步,比如正常返回一步、边界值一步、异常返回一步,这样同一结构体成员在不同场景下的值就不会混到一起。

  2、输入和期望分两边看,不要写成一团

 

  官方手册明确写到,TDE下半部分左右两侧分别用于输入值和输出或期望值。也就是说,Stub数据组织时更适合把“传给Stub的参数”和“Stub应该返回什么、调用后应出现什么结果”分开存,不要全写进一组备注里,不然后面失败时很难一眼看出到底是入参错了还是回传错了。

 

  3、复杂结构体优先按字段职责拆组

 

  如果结构体里既有控制字段、状态字段,又有缓存区指针和长度字段,更稳的组织办法不是按声明顺序死填,而是先把“决定分支的字段”和“随流程变化的字段”拆开理解。前者优先放进每个测试步都显式给值,后者再根据需要补。这个建议是顺着TDE“接口树加测试步”的组织方式得出的,目的就是减少同一结构体在多个测试步里重复填一大坨无关成员。

 

  4、需要系统化组合时再把CTE接进来

 

  如果Stub场景很多,靠手工test step会越来越散,就可以用CTE去组织组合。Razorcat官方资料说明,CTE可以把测试数据直接分配给接口变量并导入TESSY;同时较新手册也提到,可以把test data分配给CTE,而不是每次直接在TDE里逐格填。也就是说,复杂结构体场景一多,CTE更适合拿来管“场景组合”,TDE更适合拿来落“具体值”。

 

  三、TESSY Stub复杂接口先按什么层级拆

 

  真正做复杂Stub时,最容易做反的,不是不会填值,而是拆解顺序反了。明明应该先看函数接口和传递方向,却一上来就填结构体成员;明明指针目标还没建出来,却先在父结构体上反复改值。更稳的顺序,其实很简单,就是先函数、再参数、再指针目标、最后才到测试步组合。这样拆下来,复杂结构体通常不会一下变成一团。这个顺序和Razorcat官方把Advanced Stub、TDE接口区、pointer targets以及CTE分开说明的逻辑是一致的。

 

  1、第一层先拆函数接口

 

  先确认哪个函数需要变成Advanced Stub,哪些参数和返回值是真正要观测和控制的。函数层不先定,后面结构体怎么拆都容易失焦。

 

  2、第二层再拆结构体参数

 

  把结构体按成员树展开,先抓控制行为的关键字段,不要急着把全部成员一次性填满。这样做更容易判断当前测试到底在验证哪条路径。

 

  3、第三层再拆指针和动态对象

 

  只要结构体里有指针,尤其是指向另一块结构体、缓存区或数组的指针,就继续往pointer target那层拆,不要停在父结构体表面。

 

  4、第四层最后再排测试步和组合

 

  等接口树已经站稳,再把正常、边界、异常这些场景分配到不同test step,必要时再交给CTE管组合。这样数据会比一开始就铺很多步再回头补字段稳得多。

  总结

 

  TESSY Stub配复杂结构体,真正难的从来不是“值怎么填”,而是“结构怎么拆”。函数先变成Advanced Stub,参数再按成员树展开,指针成员继续落到pointer target,那些不适合直接做advanced stub variable的数组和数组指针再单独绕开,整条链才会顺。至于Stub数据怎么组织,也没必要一开始就堆成一大片,先按测试步收场景,再按输入和期望分层,场景一多再交给CTE去管组合,复杂结构体这件事通常就不会越来越乱。

读者也访问过这里:
135 2431 0251