您现在的位置是:首页 >学无止境 >Tessy_单元测试网站首页学无止境
Tessy_单元测试
1.单元测试的目的
tessy单元测试是测试单个函数的,主要通过以下方法提高代码质量,减少错误出现:
- 单元测试可以看出函数的圈复杂度,避免无意中出现过于复杂的函数。
- 单元测试可以传入不同的参数,并给出预期结果,查看代码是否能在不同条件下达到期望结果。
- 单元测试可以查看当前调用的函数是否和预期一致
- 单元测试可以测试是否有无法跑到的分支
2.使用Tessy进行单元测试
2.1构建工程
首先创建工程将所需要测试函数的源文件及涉及到的头文件路径包含进来。
点击分析按钮,如果有未包含的头文件,会有错误提示,增加头文件路径直至包含所有需要的头文件。
分析成功后,就可以看到文件中的所有函数都显示在了下面。
为了使结构更加清晰,此处使用了三个模块包含三个源文件中的函数。
2.2 增加测例(Test Case)
单元测试使用的是tessy上面的TDE标签页,刚分析完成后很多地方都是空白的,需要增加测例进行测试。
CC指的就是圈复杂度,一般圈复杂度是多少代表完整测试这个函数需要的测例。以其中一个函数为例,CC为6,所以我们构建6个测例覆盖这个函数的测试。想对应的输入输出界面也出现了6列,代表每个测例给的输入参数(全局变量参数)以及期待得到的输出结果。
此处运行其中的一个测例,可以看到期待的输出结果被标上了绿色,代表输出结果和预期结果一致。红色则代表不一致。
可以从CV标签页看到当前测例走的哪一个分支,以及哪些是执行到的代码。
也可以多个测例同时测试,当有错误结果时会用红色标记。
2.3输入输出与桩函数
以下面这段代码为例,函数单元测试时会有以下需要确定的值:传入参数,全局变量,所调用函数的返回值。这些未知的值会决定函数走哪个分支,最终输出什么结果。
I2C_TEXT_SECTION Std_ReturnType I2c_SyncTransmit(uint8 u8Channel, const I2c_RequestType *pRequestPtr)
{
Std_ReturnType u8RetVal;
uint8 u8I2cIdx;
uint8 u8CoreId;
/* Get core ID of current processor */
u8CoreId = GET_CPU_ID();
u8RetVal = I2c_SyncParameterCheck(u8Channel, pRequestPtr, u8CoreId);
if (E_OK == u8RetVal)
{
u8I2cIdx = (*I2c_pConfig[u8CoreId]->I2c_pParmConfig)[u8Channel].tFCI2c_Config->u8HwIndex;
if ((uint8)0 != pRequestPtr->u16Len)
{
if (pRequestPtr->u8Direction == I2C_DIR_READ)
{
u8RetVal = FCIIC_MasterSyncReceive(u8Channel, u8I2cIdx, pRequestPtr);
}
else
{
u8RetVal = FCIIC_MasterSyncSend(u8Channel, u8I2cIdx, pRequestPtr);
}
}
else
{
u8RetVal = E_NOT_OK;
}
}
return u8RetVal;
}
2.3.1 传入参数与全局变量
在input的选项中有parameter(传入参数)和Globals(全局变量),我们在这儿可以给出这些未确定因素的值。
非指针参数可以直接给值,指针可以直接创建指向内容的变量,创建后会显示在Dynamics一栏里,然后给值即可,如果是结构体依旧包含变量,继续创建即可。
有时候发现无法创建,这个时候需要去TIE标签页查看变量的类型是不是IN,是IN才可以输入,双击更改类型。
也有一些变量对于分支的走向以及预期结果没有影响,右键ignore即可,会在界面上显示“none”,这一列的所有输入输出(非灰掉)必须都有内容才可以测试,不关心的参数忽略掉。
2.3.2 桩函数
除了变量和有一些使用到的函数返回值也会影响分支走向和结果,对于这些函数我们可以在TIE界面打桩让其变为桩函数。打完桩后的函数会变成实心圆,未打桩的函数是空心圆。
打完桩后,在测试界面的桩函数中就可以看到了,可以自己实现桩函数的代码,高级装函数可以有输入。对于一些简单的桩函数给出其期望的返回值就可以了。
2.4测试结果查看
测试后可以查看测试结果,预期结果,分支覆盖,函数调用等等是否都达到预期要求,(打上绿勾即测试通过)。
期望调用
CV标签页可辅助查找未通过的部分。