软件测试系列之单元测试(1 基本理论)
整理资料时发现以前给兄弟们灌输的单元测试的一些基本知识,放在这里供大家参考。里面参考了网上很多朋友的资料,这里没一一列出,一并谢过。ppt转的,比较乱,ppt已经上传到个人资源的,需要的可以去下载看看。不知道怎么搞的,ppt转成word格式是正确的,word里粘贴到这里,在编辑方式下也是对的,可是浏览文章时就乱七八糟了。只有在记事本里中转了一下,丧失了很多排版上的信息。
现象
? 投入太多的精力,找 bug,而新的代码仍然会出现类似 bug;
? 写完代码,心里没底,是否有大量 bug 等待自己;
? 新修改的代码不知道是否影响其他部分代码;
? 由于牵扯太多,导致不敢进行修改代码;
...
一、软件测试基本理论
? 目的:对软件测试有个整体认识
? 软件测试
? 软件测试分类
? 软件开发全过程检测及测试自动化
? V模型与X模型
? TDD( Test-Driven Development)
什么是软件测试?
在软件投入运行前,对软件需求分析、设计规格说明和编码的最终复审,是软件质量保证的关键步骤。
软件测试的概念:
软件测试是为了发现错误而执行程序的过程。
或者说,软件测试是根据软件开发各个阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期结果),并利用这些测试用例去执行程序,以发现程序错误的过程。
测试的目的
? 测试是程序的执行过程,目的在于发现错误;
? 一个好的测试用例在于能发现至今未发现的错误;
? 一个成功的测试是发现了至今未发现的错误的测试
? 也可以这样说,测试的目标是以较少的用例、时间和人力找出软件中潜在的各种错误和缺陷,以确保系统的质量
? 一个被人忽略的软件测试目的是:测试可以帮助发现当前开发工作所采用的软件过程(也是一个“软件”)的缺陷,以便进行改进。
? 首先,测试并不仅仅是为了要找出错误。分析错误产生的原因和错误在开发的哪一个阶段产生,具有非常重要的意义。
? 通过分析错误产生于哪一个开发阶段、而又在哪一个阶段被发现,我们可以判断从错误的产生到错误的发现,跨越了多少个开发阶段。
? 软件开发的一条重要原则是尽早发现与修正错误。
? 正确分析与利用测试的结果,我们可以非常有效地进行软件过程改进
软件测试原则 2-1
? 完全测试程序是不可能的
-输入量太大
-输出结果太多
-软件实现途径太多
-软件说明书没有客观标准。从不同角度看,软件缺陷的标准不同。
软件测试原则 2-2
? 软件测试是有风险的行为
? 测试无法显示潜伏的软件缺陷
? 找到的软件缺陷越多,就说明软件缺陷越多
? 并非所有软件缺陷都能修复
? 软件测试一项讲究条理的技术专业
软件测试分类
从是否需要执行被测软件的角度,可分为:
-静态测试
-动态测试
从测试是否针对系统的内部结构和具体实现算法的角度来看,可分为 :
-白盒测试
-黑盒测试
软件测试方法-静态和动态
? 静态检查
? 确保系统按照组织的标准和过程运行,主要依赖于评审和非运行的手段来检查。通常包括需求评审、设计评审、代码走查和代码检查。
? 动态检查
? 在生命周期中进行测试(运行)。通常包括单元测试、集成测试、系统测试、用户的验收测试。
静态测试
? 审查 (Inspection)
-软件的一种基本测试方法,它以一系列典型问题为依据进行检测。
? 走查 (Walkthrough)
-一对一的审查,比审查更加仔细。
? 回顾(Review)
-以发现软件中存在的错误和缺陷为目的的一种软件测试方法,它是在软件证实执行之前完成。
静态和动态测试进行结构和功能测试
测试技术
黑盒测试
黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,通过测试来检测每个功能是否都能正常使用,在测试时,把程序看作一个不能打开的黑盆子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数锯而产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。
“黑盒”测试着眼于程序外部结构、不考虑内部逻辑结构、针对软件界面和软件功能进行测试。“黑盒”法是穷举输入测试,只有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错误。实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但是可能的输入进行测试。
它不仅应用于开发阶段的测试,更重要的是在产品测试阶段及维护阶段必不可少。主要用于软件确认测试。
黑盒测试方法主要有:
? 等价类划分
? 边值分析
? 因果图
? 错误推测
白盒测试
白盒测试也称结构测试或逻辑驱动测试,它是知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能。
使用被测单元内部如何工作的信息,允许测试人员对程序内部逻辑结构及有关信息来设计和选择测试用例,对程序的逻辑路径进行测试。基于一个应用代码的内部逻辑知识,测试是基于覆盖全部代码、分支、路径、条件。
白盒测试的主要方法
? 逻辑驱动测试
? 基本路径测试
主要用于软件验证。
使用程序设计的控制结构导出测试用例。
逻辑驱动测试:
主要是测试覆盖率,以程序内在逻辑结构为基础的测试。包括以下6种类型:
? 语句覆盖
? 判断覆盖
? 条件覆盖
? 判定-条件覆盖
? 条件组合覆盖
? 路径测试
白盒测试的主要目的
? 保证一个模块中的所有独立路径至少被执行一次;
? 对所有的逻辑值均需要测试真、假两个分支;
? 在上下边界及可操作范围内运行所有循环;
? 检查内部数据结构以确保其有效性。
概念
? 语句覆盖:语句覆盖就是设计若干个测试用例,运行被测试程序,使得每一条可执行语句至少执行一次;
? 判定覆盖(也称为分支覆盖):设计若干个测试用例,运行所测程序,使程序中每个判断的取真分支和取假分支至少执行一次;
? 条件覆盖:设计足够多的测试用例,运行所测程序,使程序中每个判断的每个条件的每个可能取值至少执行一次;
? 判定-条件覆盖:设计足够多的测试用例,运行所测程序,使程序中每个判断的每个条件的所有可能取值至少执行一次,并且每个可能的判断结果也至少执行一次,换句话说,即是要求各个判断的所有可能的条件取值组合至少执行一次;
? 条件组合测试:设计足够多的测试用例,运行所测程序,使程序中每个判断的所有可能的条件取值组合至少执行一次;
? 路径测试:设计足够多的测试用例,运行所测程序,要覆盖程序中所有可能的路径。
软件开发全过程检测及测试自动化
? 单元测试(unit test )
由编程的开发人员自行计划与完成的,针对单个或相关联的一组程序单元的测试。
? 组装测试(inegration test )
计划于设计阶段,由开发人员与测试人员合作完成的,针对结合起来的不同单元以及它们的接口的测试。
? 系统测试(system test ):(可认为包括“可用性与图形用户界面测试”)
测试整个系统,以证实它满足要求所规定的功能、质量和性能等方面的特性。
? 回归测试(regression test ):
用于验证改变了的系统或其组件仍然保持应有的特性。
? 验收测试(acceptance test ):
测试整个系统,以保证其达到可以交付使用的状态。
V模型
V模型
? 单元测试、集成测试、系统测试、验收测试。是“从小到大”、“由内至外”、“循序渐进”的测试过程,体现了“分而治之”的思想。
? 单元测试的粒度最小,一般由开发小组采用白盒方式来测试,主要测试单元是否符合“设计”。
? 集成测试界于单元测试和系统测试之间,起到“桥梁作用”,一般由开发小组采用白盒加黑盒的方式来测试,既要验证“设计”又要验证“需求”。
V模型
? 系统测试的粒度最大,一般由独立测试小组采用黑盒方式来测试,主要测试系统是否符合“需求规格说明书”。
? 验收测试与系统测试非常相似,主要区别是测试人员不同,验收测试由用户执行。
测试内容
? 测试内容一般包含
? 接口与路径测试。
? 功能测试、健壮性测试、性能测试、用户界面测试、安全性测试、压力测试、可靠性测试、安装/反安装测试…
测试阶段对应表
接口与路径测试 3-1
? 接口测试:数据一般通过接口输入和输出,接口测试一般是白盒测试的第一步。
― 输入参数有“典型值”、“边界值”、“异常值”
― 输出包括函数的返回值和输出参数。
― 实际输出与期望的输出不一致,那么说明程序有错误。
? 一个函数体内的语句可能只有十几条,但逻辑路径可能有成千上万条。所以应该根据经验选择关键的路径测试。
接口与路径测试 3-2
? 路径测试的检查表
? -数据类型、变量值、逻辑判断、循环、内存管理、文件I/O、错误处理
? 预防一些重要的路径没有被测试的措施有:
― 观察是否有程序语句从来没有被执行过。
― 要特别留意函数体内的错误处理程序块。
接口与路径测试 3-3
? 接口与路径测试用例的参考模板
功能测试 3-1
? 功能测试的基本方法是构造一些合理输入(在需求范围之内),检查输出是否与期望的相同。如果两者不一致,即表明功能有误。
? 难点在于如何构造有效的输入。
功能测试 3-2
? 功能测试的测试方法:等价划分法和边界值分析法。
― 等价划分是指把输入空间划分为几个“等价区间”,在每个“等价区间”中只需要测试一个典型值就可以了。等价划分