软件测试的白盒测试(二)之单元测试环境

本章节主要讲解"软件测试的白盒测试(二)之单元测试环境"的内容,单元测试环境是指单元本身不是一个独立的程序,一个完整的可运行的软件系统并没有构成,所以必须为每个单元测试开发驱动单元和桩单元。

一个完整的单元测试环境如图10-2所示。

图10-2 单元测试环境

  • **驱动单元(Driver):**所测函数的主程序,它接收测试数据,并把数据传送给测试单元,最后再输出实测结果。当被测试单元能完成相关功能时,也可以不要驱动单元(如顶层函数就可以不使用驱动单元)。

驱动单元具有如下特点:

  • (1)接收测试数据,包含测试用例输入和预期输出。

  • (2)把测试用例输入传送给要测试的单元。

  • (3)将被测单元的实际输出和预期输出进行比较,得到测试结果。

  • (4)将测试结果输出到指定位置。

  • **桩单元(Stub):**用来代替所测单元调用的子单元。

桩单元具有如下特点:

  • (1)桩单元的功能是从测试角度模拟被调用的单元。

  • (2)桩单元需要针对不同的输入,返回不同的期望值,模拟所替代单元的不同功能。

  • (3)桩单元返回的期望值根据输入和被模拟单元的详细设计来确定。

  • **【实例】**被测试的函数为FuncTest,调用的子函数为加法函数add 和减法函数sub。

函数代码如下:

由于被测试函数FuncTest 调用了加法与减法两个函数,所以应该先写加法和减法的桩函数。

但如果加法和减法这两个函数都已经经过了测试,并且是正确的,那么可以不用写桩函数,直接调用这两个函数即可。

写好后的桩函数代码如下:

复制代码
//模拟加法函数的桩
int stub_add(int a, int b)
{
if((a==1) && (b==1))
{
return 2;
}
if((a==2) && (b==1))
{
return 3;
}
if((a==3) && (b==0))
{
return 3;
}
else return 9999;//只是为了处理异常,而且是自定义的
}
//减法函数的桩
int stub_sub(int a, int b)
{
if((a==1) && (b==2))
{
return -1;
}
if((a==2) && (b==3))
{
return -1;
}
if((a==0) && (b==3))
{
return -3;
}
else return 9999;//只是为了处理异常,而且是自定义的
}

**接下来写驱动模块,一般驱动程序都为main 函数,驱动模块的代码如下:**​​​​​​​

复制代码
int main()
{
int z=0;//接受被测试函数结果
z=FuncTest(1,1);
if(2 == z)
{
printf("测试用例001 通过! ");
}
z=FuncTest(2,1);
if(3 == z)
{
printf("测试用例002 通过!");
}
z=FuncTest(1,2);
if(-1 == z)
{
printf("测试用例003 通过!");
}
return z;
}

从上面的实例中可以看出,桩函数主要用于代替被测试函数(FuncTest 函数)所调用的函数(add函数和sub 函数),之所以设计桩函数就是为了隔离错误。假设如果不设计桩函数,直接调用add函数和sub 函数,当测试结果失败时就无法确定是被测试函数(FuncTest 函数)还是被调用函数(add函数和sub 函数)出错。

那么什么时候需要写桩函数呢?

一般以下两种情况需要写桩函数:

  • (1)被调用的函数未经过测试,不能保证其正确性。

  • (2)被调用的函数虽然已经测试过,但是有一些情况无法模拟,此时也需要写桩函数。

**如函数test:**​​​​​​​

复制代码
int test(int x, int y)
{
...
if(a > 10)
{
return x + y;
}
else return 9999;//只是为了处理异常,而且是自定义的
}

假设被测试函数需要调用该函数,test 函数也经过测试且是正确的,但是在实际使用过程中很难模拟出a<10 时的值,那么测试过程中就可以通过桩函数人为地模拟这种情况。

测试过程中并不是每次都需要写桩函数,通常以下情况不需要写桩函数:

(1)最底层函数,即被测试函数不调用任何的其他函数,此时不需要写桩函数。

(2)被调用的函数已经经过测试,并且是正确的。

测试过程中也并不是每次都需要写驱动函数,对于顶层函数或main函数,测试时就不需要写驱动函数。

本章节关于"软件的白盒测试(二)之单元测试环境"的内容就学习到这里,大家觉得文章有用的话一定要关注我们,每天来这里和小编一起学习涨薪技能哦。

相关推荐
treacle田3 分钟前
达梦数据库-物理备份与还原-(DISQL联机全备+增量备份+归档进行不完全恢复或完全恢复-实践示例)-记录总结
数据库·达梦数据库物理备份还原恢复
许长安5 分钟前
Redis 渐进式 rehash:为什么要分批搬迁哈希表
数据库·redis·散列表
廿一夏11 分钟前
Redis 主从复制、哨兵模式、集群架构
redis
测试员周周12 分钟前
【Appium 系列】第09节-数据驱动测试 — YAML 数据 + parametrize
服务器·数据库·人工智能·python·测试工具·语言模型·appium
一块小土坷垃17 分钟前
# ArchiCAD 29.0.2(畅享版):专为建筑师打造的BIM高效建模工具
前端·数据库·macos·开源软件
小短腿的代码世界17 分钟前
Qt时间日期处理与QTimer高级应用:从毫秒级精度到跨平台定时器的完整架构解析
开发语言·qt·架构
難釋懷19 分钟前
Redis网络模型-单线程和多线程网络模型变更
网络·redis·git
TAN-90°-22 分钟前
Java 6——成员变量初始值 object equals和== toString instanceof 参数传递问题
java·开发语言
中新传媒24 分钟前
德宸堂心理双师同诊
java·前端·数据库
yexuhgu25 分钟前
html如何修改备注
jvm·数据库·python