【回眸】Tessy 单元测试软件使用指南(三)怎么打桩和指针赋值和测试

135 阅读6分钟

 前言

Tessy 如何进行打桩操作

普通桩

高级桩

手写桩

Tessy单元测试之指针相关测试注意事项

 有类型的指针(非函数指针):

 有类型的函数指针:

 void 类型的指针:

一些小经验

结语

前言

进行单元测试之后,但凡稍微复杂一些的软件都难以避免需要在设置中遇到桩函数,今天就来记录一下如何在TESSY中使用桩函数。

首先介绍一下什么是桩函数:

桩函数(Stub)是模拟被测试模块所调用的模块。

桩,或称桩代码,是指用来代替关联代码或者未实现代码的代码。如果函数B用B1来代替,那么,B称为原函数,B1称为桩函数。打桩就是编写或生成桩代码。

Tessy 如何进行打桩操作

在tessy里如何给外部函数进行打桩呢?

首先需要按照正常流程进行分析函数,函数分析没有问题之后再打开TIE,这里可以看到函数里有用到的外部函数,内圈是白色说明该函数虽然使用到了,但是却没有打桩,如果返回值是void型,直接右击点击 Create Stub (for current Testobject),如果返回值非void型,需要右键点击 Create advanced Stub(for current Testobject)

image.png

要注意的是, Create Stub 之后不需要设置passing和target passing,Create Advanced Stub 之后需要设置passing和target passing,默认的passing和target passing很可能不正确。

普通桩

1)函数没有返回值没有形参,可以打普通桩
2) 如果函数不影响后续实现以及变量,可以打普通桩
3) 如果函数本身有返回值但并不使用,可以打普通桩
4) 函数有形参,但不观测可以打普通桩

例如:

extern void STUB_1();
extern hirain_u8 STUB_2();
static hirain_u8 STUB_3(hairain_u8 temp){return temp*temp;};

void test_fun_stub_1(void){


            STUB_1();

}

STUB_1()
在当前 c 文件中没有定义,直接执行会报未定义错误

image.png

要对该函数打普通桩

image.png

高级桩

1) 如果用到函数返回值,需要打高级桩,手动控制其返回值
2) 如果函数有形参,并且需要接口传参检测,需要打高级桩

extern void STUB_1();
extern hirain_u8 STUB_2();
static hirain_u8 STUB_3(hairain_u8 temp){return temp*temp;};

hirain_u8 test_fun_stub_2(void){


            hirain_u8 temp = STUB_2();
            return temp;

}

被测函数中用到了STUB_ 2 函数的返回值, 打普通桩 会报以下错误:

image.png 所以需要打高级桩,在TDE 界面中设置函数调用预期返回值。

image.png

image.png

例如:

extern void STUB_1();
extern hirain_u8 STUB_2();
static hirain_u8 STUB_3(hairain_u8 temp){return temp*temp;};

hirain_u8 test_fun_stub_4(hirain_u8 temp){
            hirain_u8 trm = STUB_3(temp);
            return tem;

}

对STUB_3() 函数进行传参检测,需要给该函数打高级桩,第一个接口为返回值,
其余 为形参接口

image.png

image.png

image.png

手写桩

如果需要让桩函数有额外的功能(传参检测、局部数据处理、多传参检测、函数
实现变更等) 可以进行手写桩:

hirain_u8 loop_test3(hirain_u8 temp){

        for(hirain_u8 i = 0;i<temp;i++){
                        STUB_3(i);
        }
        return 1;
}

想要获取每次函数被调用获取的值,可以创建普通桩,新建变量,然后手写桩函
数完成传参记录。

Tessy单元测试之指针相关测试注意事项

 有类型的指针(非函数指针):

构建 合适 的对象 ,将地址传入指针接口。
例如:

hirain_u8 a;
void TS_FUN_PON_2(hirain_u8 *p,STR *pl)
{
        
           a = *p;
           pl->str2 = pl->strl;



}

 首先进入TIE界面查看passing 和target passing,不能设置的有冲突

image.png

 接着回到TED,选择需要赋值的指针,在表格处右键 Create Pointer Target Value

image.png

创建完指针变量之后需要在 Dynamics里给指针变量赋值

image.png

 有类型的函数指针:

构建与指针类型相同的函数对象,将地址传入指针接口
在 Declarations /Definition 模块写函数的声明和定义 。

例如:

hirain_u32(*T_pon)(hirain_u32 i);
hirain_u32 hirain_stuv(hirain_u32 temp){

            temp = (*T_pon)(temp);
            return temp;
}

image.png

image.png

image.png

 void 类型的指针:

需要新建一个有类型的全局变量,然后将指针 指向该变量,
将变量地址传入指针接口。

例如:

hirain_u8 TS_FUN_PON_1(int *p,void *p1)
{

    hirain_u8 temp = 0;
    int *temp1 = p1;
    a = *p;
    return *temp1;

}

新建一个变量且命名

image.png 在TED界面赋值

image.png

一些小经验

如果被测函数是普通桩,需要编辑桩函数体,反之则不需要。

高级桩需要设置参数和方向,如果函数内部需要做一些语句执行,打普通桩,如果只关心函数的返回值和参数值,则打普通桩。

按需求添加头文件,否则外部函数会非常多。

【最新更新时间】:2025/04/08

结语

本文介绍了当使用Tessy对软件进行单元测试时如何打桩和指针相关测试的注意事项及操作要点,希望能给正在摸索Tessy的网友一点点启发。看到这里的读者朋友们可以点击专栏查看同系列的其他文章,希望能帮到屏幕前的每一位技术人,该博文最初发表在CSDN上,可以联系博主加曲云。