单元测试培训胶片_第1页
单元测试培训胶片_第2页
单元测试培训胶片_第3页
单元测试培训胶片_第4页
单元测试培训胶片_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单元测试UT基本概念UT价值UT方法及工具Gtest使用介绍打桩技术UT总结目录UT基本概念UT价值UT方法及工具Gtest使用介绍打桩技术UT总结目录UT基本概念什么是UT:

UT(UnitTest)即单元测试。UT是软件开发过程中要进行的最低级别的测试活动,在UT活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。UT的对象是软件系统中的最小零件,必须是可信任的,可重复执行的。这个最小零件在面向对象的程序中指的是一个类,在结构化的方法中指的是一个函数。如果测试的范围轻易地就会扩展到其他类或同类的其他方法,那就不再是最小单位,也就不是UT了。对象目的测试依据测试方法单元测试函数消除函数内的逻辑和功能上的错误和缺陷详细设计大量采用白盒测试方法集成测试多个函数的组合找出模块调用关系,模块间接口方面的问题概要设计结合使用白盒与黑盒测试方法,较多采用黑盒方法构造测试用例系统测试整个软件系统对整个系统进行一系列的整体、有效性测试需求规格说明书等黑盒测试几种测试的对比:UT基本概念UT在敏捷开发中UT基本概念UT在持续集成中UT基本概念UT价值UT方法及工具Gtest使用介绍打桩技术UT总结目录UT价值UT价值UT价值它是一种验证行为测试程序中的每一项功能,为后期开发打下高质量的基础;就算是开发后期,我们也可以轻松地增加功能或更改程序结构,而不用担心这个过程中会破坏重要的东西。而且它为代码的重构提供了保障,这样,我们就可以更自由地对程序进行改进。它是一种设计行为编写单元测试将使我们从调用者观察、思考。特别是TDD(Test-DrivenDevelopment)中,先执行测试活动后写代码,迫使我们把程序设计成易于调用和可测试的,即迫使我们解除了软件中的耦合。它是一种编写文档的行为

UT是一种无价的文档,它是展示函数或类如何使用的最佳文档。这份文档是可编译、可运行的,并且它保持最新,永远与代码同步。它具有回归性

完全自动化,在代码出现修改,编写之后,可以及时地快速运行测试。UT基本概念UT价值UT方法及工具Gtest使用介绍打桩技术UT总结目录常用方法静态检查

采用静态代码检查的工具对程序进行内部逻辑的分析,以分析程序中可能的错误或坏味道。这种方式不需要实际运行代码。动态测试通过编写UT程序,设计UT用例,测试每个函数或每个类的逻辑正确性。这种方式需要实际运行被测代码。目前STORWARE平台采用的是这种动态测试方法。UT方法函数功能测试函数入参有效性测试函数异常测试函数极限测试根据覆盖率要求补充测试用例(语句覆盖、分支覆盖、路径覆盖、组合条件等)测试用例设计思路UT方法几个值得考虑的测试思路,它们可以提高你的UT能力。如果代码能够运行正确,我要怎么知道它已经完成了预期的功能了呢?我们可以通过预期结果来测试功能,这些预期结果的完备性也决定了测试用例的有效性。被测函数的返回值和输出参数全局变量的改变配置文件的改变内存等系统资源的使用锁、信号量状态的改变UT方法函数功能测试测试用例设计思路如果代码能够运行正确,我要怎么知道它已经完成了预期的功能了呢?我们可以通过预期结果来测试功能,这些预期结果的完备性也决定了测试用例的有效性。被测函数的返回值和输出参数全局变量的改变配置文件的改变内存等系统资源的使用锁、信号量状态的改变UT方法函数功能测试测试用例设计思路对于某些预期结果我们可以通过反向关联的方法来测试,比如:1.为了检查某条记录是否成功插入了数据库,可以通过查询这条记录来验证2.为了验证创建rg/lun/lv是否成功,可以通过查询是否存在rg/lun/lv的方法来验证小技巧可采用边界值分析方法来判断入参有效性,认真仔细地测试为限制数据处理而设置的边界处,看模块是否能够正常工作。一些可能与边界有关的数据类型如数值、字符、位置、数量、尺寸等,还要注意这些边界的首个、最后一个、最大值、最小值、最长、最短、最高、最低等特征。在n次循环的第0次、1次、n次是否有错误运算或判断中取最大值、最小值时是否有错误数据流、控制流中刚好等于、大于、小于确定的比较值是否出现错误在范围1~5的入参范围内,0(比最小值略小),1(最小值),3(中间某个值),5(最大值),6(比最大值略大)这5种情况下是否出现错误函数入参有效性测试UT方法测试用例设计思路除了观察函数正常功能之外,也需要关注函数在各种非法输入,异常分支下的流程是否正常。UT方法函数异常测试测试用例设计思路入参是空指针的情况下程序是否出现异常?入参为非法,超大/超小值(相对正常值)下程序是否出现异常?查看异常分支,分析引起异常的原因,根据各种原因设计不同的测试用例,测试各种情况下程序是否出现异常?有条件的话,尽量模拟系统真实运行环境下可能出现的异常,如坏盘,网络断等,观察程序处理这些异常的能力。函数在满规格条件或数据定义满等情况下是否可以承受压力,完成正常的功能。UT方法函数极限测试测试用例设计思路disk/rg/lun/lv等个数为满规格情况函数内部数组或其他数据满的情况链表,队列等资源满的情况根据覆盖率情况可以得知哪些代码没有覆盖到,查看这些没有覆盖到的代码设计测试用例。这一点应该在最后才考虑,千万不可为了覆盖率而进行UT。UT方法根据覆盖率补充用例测试用例设计思路UT工具

这是C++单元测试工具的鼻祖,免费的开源的UT框架。

这是Parasoft公司的产品,是一个功能强大的自动化C/C++单元级测试工具,可以自动生成测试用例、测试驱动函数或桩函数,在自动化的环境下极其容易快速地将UT覆盖率达到100%。CppUnitVisualUnitC++test

这是国产的UT工具,自动生成测试代码,快速建立功能测试用例,高效完成白盒覆盖,快速排错,高效调试,详尽的测试报告。GoogleTest

这是一款小巧、开源的UT工具,工作在linux用户态,提供了十分简单而富有弹性的函数级测试功能。占用资源少,启动速度快,运行稳定。UT基本概念UT价值UT方法及工具Gtest使用介绍打桩技术UT总结目录Gtest环境搭建Gtest安装

先到/p/googletest/网站下载最新版本的Gtest源码再将源码放到机器并执行如下步骤进行解压、编译:

最后共享LIB库即完成其安装:覆盖率工具安装rpm-ihvlcov-1.7-1.noarch.rpm将以下两个脚本拷贝至/usr/sbin

:genhtml

geninfo

UT脚本写作测试文件名称

被测函数名_gtest.c,如lun_create_gtest.c。一个函数对应一个xxx_gtest.c文件。头文件

UT脚本写作测试文件名称

被测函数名_gtest.c,如lun_create_gtest.c。一个函数对应一个xxx_gtest.c文件。头文件

注意:系统头文件及被测源代码用到的头文件,c代码编译成c++,调用时注意要用extern"C"UT脚本写作测试文件名称

被测函数名_gtest.c,如lun_create_gtest.c。一个函数对应一个xxx_gtest.c文件。头文件

注意:系统头文件及被测源代码用到的头文件,c代码编译成c++,调用时注意要用extern"C"注意:Gtest本身并不支持函数打桩,加入这个头文件就能实现打桩功能了UT脚本写作函数头

UT脚本写作函数头

预置条件是对测试环境进行准备工作,简而言之,即没有这个准备工作,被测代码是无法运行的。如被测函数调用A函数,而A函数为操作系统内核态函数,则需要对A函数打桩;或者对被测函数用到的全局数据进行设置;或者对配置文件等数据进行设置等。UT脚本写作函数头

输入是被测函数的入参描述,该参数多数情况下决定了测试用例的完备性,因此需要考虑全面。UT脚本写作函数头

预期结果是被测函数运行之后应该有的结果。包括函数的返回值、函数的输出函数、全局变量的改变、配置文件或数据库数据的改变内存等系统资源的使用情况、锁/信号量状态的改变UT脚本写作函数体

以TEST宏来命名一个测试函数。后跟两个参数,一个为测试用例的名称,另一个为测试用例编号技巧:由UT_BEGIN/UT_END宏来实现内存等系统资源检查UT脚本写作Gtest宏

用来对预期结果的判断。各类宏的用法参考下面文档。

UT脚本写作编译被测代码:将被测代码编译成静态库*.a和覆盖率相关文件*.gcda,*.gcno。编译桩代码:将桩代码编译成*.o文件和覆盖率相关文件*.gcda,*.gcno。编译测试代码:将测试代码与上面两步生成的静态库,.o及覆盖率相关文件生成UT可执行程序。编译原理使用makefile将被测代码和测试代码编译成一个最终的可执行程序,运行这个可执行程序,就运行了UT。编译过程有如下三步曲:UT实例演示源码

UT实例演示用例设计

aaa被测函数处理输入预期结果??????是否需要增加预置条件或者打桩???UT实例演示用例设计正常用例1:

构造入参cmd非空,其长度非0,其sg个数为1,其id号为1;无需设置预置条件和打桩;预期有出参cmd结果为CMD_OK,出参num为777,函数返回S_OK,全局变量g_flag变为1。正常用例2:构造入参cmd非空,其长度非0,其sg个数为128,其id号为2;无需设置预置条件和打桩;预期有出参cmd结果为CMD_OK,出参num为888,函数返回S_OK,全局变量g_flag变为2。正常用例3:构造入参cmd非空,其长度非0,其sg个数为127,其id号为100;无需设置预置条件和打桩;预期有出参cmd结果为CMD_OK,出参num为999,函数返回S_OK,全局变量g_flag变为3。

UT实例演示用例设计异常用例1:

构造入参cmd为空;无需设置预置条件和打桩;预期有函数返回S_ERR,全局变量g_flag不变,仍为初始值0。异常用例2:构造入参cmd非空,其长度为0;无需设置预置条件和打桩;预期有出参cmd结果为CMD_LENGTH_NULL,函数返回S_ERR,全局变量g_flag不变,仍为初始值0。异常用例3:构造入参cmd非空,其长度非0,其sg个数为0或者大于128;无需设置预置条件和打桩;预期有出参cmd结果为CMD_SG_INVALID,函数返回S_ERR,全局变量g_flag不变,仍为初始值0。

UT实例演示函数头书写

UT实例演示函数体书写

UT实例演示运行结果

UT实例演示覆盖率生成与查看

覆盖率达到100%UT实例演示其他实例前面的实例较简单,目前在STORWARE平台UT更复杂一些,不但输入和预期结果相当丰富,而且需要考虑预置和打桩的情况。有预置条件的情况:

创建raidgroup时需要预置3块盘及其拓扑信息处理io读请求时需要先创建lun,获取lun的内存节点,并清空命令请求链表UT实例演示需要打桩的情况:

创建rg写硬盘ddf时需要调用下发bio操作,该操作为os函数,故打桩copy_to_user,copy_from_user函数为内核态函数,故打桩Gtest使用注意事项注意事项如果被测代码中有main函数,应将main函数注释掉。因为gtest也有它自己的main函数,存在两个main函数肯定是不行的。

#if0

int

main(INT

argc,CHAR**argv){……}#endif在被测代码中函数为static类型的,由于测试代码需要调用源文件,所以在编译UT执行程序时,要定义一个宏STATIC使其为空,如下:#ifdefUT_TEST#defineSTATIC#else#defineSTATICstatic#endif

有个缺点就是,对于同名的静态函数就没法测了。

UT基本概念UT价值UT方法及工具Gtest使用介绍打桩技术UT总结目录打桩技术原理目前版本的Gtest不支持打桩。使用补丁后可实现打桩。暂存目标函数的第一条语句。修改目标函数的第一条语句,让其跳转到桩函数。桩恢复时,拷回原语句。实现数据结构struct

func_stub

{ void*fn;/*目标函数指针*/charbuf[5];/*目标函数原头五个字节内容*/}接口voidstub_set(struct

func_stub*stub,void*fn,void*fn_stub)voidstub_reset(struct

func_stub*stub)

打桩技术一个打桩的例子

打桩技术打桩原则目前STORWARE平台多数代码运行在内核态,在UT活动中打桩的工作量比较大,打桩不能忽视,它直接影响了整个UT的价值。目前平台

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论