在TESSY里测指针,最容易出错的地方不是界面不会点,而是把“指针本身”和“指针指向的目标对象”当成了一回事。Razorcat官方手册写得很清楚,TESSY的测试数据里有一类专门的Dynamic objects,用来表示通过指针访问的目标对象;同时,数组参数也可以被当成指针来处理,并且能在TDE里分配为NULL或具体数组目标。也就是说,测指针时真正要喂给TESSY的,不只是一个地址概念,而是“这个指针现在指向谁,这个目标对象里面有什么值”。
一、TESSY单元测试指针怎么测
指针测试更稳的做法,不是先写很多用例,而是先把接口里哪些是指针、哪些是目标对象分开看清,再决定是测传入值、测返回目标,还是测指针是否指到了正确对象。官方资料里对这条线分得很明确,TDE里会把pointer target作为dynamic object展开显示。
1、先在接口里确认指针参数的方向
如果是普通接口变量,传值方向按输入或输出理解就可以;但官方应用说明特别提醒,指针类型参数在高级桩场景里出于技术原因必须保留IN,哪怕你更关心的是执行后目标值有没有被改掉。这个点如果一开始没理顺,后面测试数据就容易配反。
2、再看是测指针值,还是测指针目标
如果你只是想验证函数有没有把某个指针参数传进来,那重点是参数本身;如果你想验证函数有没有通过这个指针改对数据,那重点就应该落到dynamic object上。官方手册把dynamic object定义为pointer target,本质上就是为了把这两层拆开。
3、指针指向数组时按目标对象来测
TESSY官方手册明确给过“Using an array parameter as pointer”的说明,也就是数组参数可以按指针来处理,并在TDE里选择NULL或数组目标。实际做测试时,像缓冲区、表项、字符串这类参数,更适合按“目标数组内容”来设计测试,而不是只盯着参数名。
4、需要检查指针是否指到正确对象时,优先让目标对象落在测试接口里
Razorcat的高级桩应用说明里写得很直接,检查pointer parameter是否指向正确target,通常只对那些指向测试对象接口内目标对象的指针更有意义,否则结果很容易变成unknown。也就是说,想把指针指向关系测清楚,先让目标对象进入可测接口范围会更稳。
二、TESSY单元测试指针参数怎么构造
指针参数构造的关键,不是手工去拼一个地址值,而是先在TDE里把目标对象建出来,再让指针去引用这个对象。官方手册对输入值分类时写得很清楚,除了全局变量和函数参数,还有一类就是Dynamic objects,而且这些对象会在生成的测试驱动里真正创建出来。
1、先在TDE里创建目标对象
当接口里有指针参数时,TDE会把对应的pointer target作为dynamic object管理。更稳的做法,是先把目标对象建出来,再去填这个对象里的成员值或数组值,这样指针参数的构造就有了落点。
2、空指针和有效目标分开构造
官方手册提到,数组参数按指针处理时,可以在TDE里分配为NULL或数组目标。所以日常用例至少要把这两类情况拆开,一类测空指针分支,一类测正常指向有效对象的分支,不要把它们混在一组数据里。
3、复杂指针或多次调用时别硬靠一个对象撑到底
Razorcat的高级桩说明里明确提到,标量参数可以用向量值覆盖多次调用,但指针目标通常只能对应一个dynamic object;如果是复杂类型或多次调用都要给不同内容,更适合改用synthetic variables这条路,把每次调用的数据拆开。
4、指针返回值或高级桩参数要结合场景构造
如果是高级桩函数,官方说明里会把参数和返回值都映射成虚拟变量,放到TDE里填写;而pointer参数的target依然要靠dynamic object承接。也就是说,构造这类数据时不要只看函数签名,还要同时看TIE里的passing direction和TDE里的目标对象。
三、TESSY指针测试数据怎么收口
TESSY指针测试数据怎么收口,关键不是把所有指针都一股脑铺满,而是把空指针、单对象指向、数组指向和复杂多次调用这几类情况先分层。官方资料已经给出很清晰的边界,dynamic object适合做普通目标对象承接,向量值更适合标量,多次调用且类型复杂时则要考虑synthetic variables。把这几类入口分清以后,指针测试通常会比只在表格里反复改值更稳。
1、先收空指针和正常指针这两类基础场景
这是最基本的分层,前者看异常路径,后者看正常读写路径。只有这层先跑顺,后面再扩到数组和结构体目标才不会乱。
2、再收数组和结构体目标
数组参数按指针处理,结构体目标按dynamic object展开,本质上都是在测“指向目标里的内容”。这一步适合验证边界值、长度值、成员值和写回结果。
3、最后才收复杂多次调用场景
如果同一个指针相关桩函数会被连续调用,而且每次都要喂不同目标内容,官方应用说明已经给出更合适的收口方式,也就是用synthetic variables配合调用次数去拆数据。这样做比强行把所有情况塞进一个pointer target里更稳。
总结
TESSY单元测试指针怎么测,关键不是只看参数名,而是把指针本身和pointer target分开测,真正关心读写结果时要落到dynamic object上。TESSY单元测试指针参数怎么构造,更稳的做法则是先在TDE里建目标对象,再分别构造NULL、有效对象、数组目标和复杂多次调用场景。把“指针”和“目标对象”这两层拆开以后,TESSY里的指针测试通常会清楚很多。