软件测试的目的
1、 测试是程序的执行过程,目的在与发现错误;
2、 一个好的测试用例在于能发现至今未发现的错误;
3、 一个成功的测试是发现了至今未发现的错误的测试。
软件测试原则
1、 应当把“尽早地和不断地进行软件测试”作为软件开发者的座右铭。
2、 测试用例应由测试输入数据和对应的语气输出结果这两部分组成。
3、 程序员应避免检查自己的程序。
4、 在程序设计用例时,应当包括合理的输入条件和不合理的输入条件。
测试信息流
a软件配置
b测试配置
c测试工具
d测试结果分析
e排错(调试)
f修正后的文档在测试
测试与软件可发各阶段的关系
1、 软件开发过程是一个自顶向下,逐步细化的过程
2、 测试过程是依相反顺序安排的自顶向上,逐步集成的过程。
测试用例设计
常用的测试方法:黑盒测试,白盒测试
黑盒测试:这种方法是把测试对象看做一个黑盒子,检查程序的功能是否符合它的功能说明。
白盒测试:此方法把测试对象看做一个透明的盒子,对程序所有逻辑路径进行测试。
逻辑覆盖
逻辑覆盖是以程序内部的逻辑结构为基础的设计测试用例的技术。它属于白盒测试。
*语句覆盖 判定—条件覆盖
*判定覆盖 条件组合覆盖
*条件覆盖 路径覆盖
语句覆盖:就是设计若干个测试用例,运行被测程序,使得每一可执行语句至少执行一次。
判定覆盖:就是设计若干个测试用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次。
条件覆盖:就是设计若干个测试用例,运行被测程序,使得程序中每个判断的每个条件的可能取值至少执行一次。
判定—条件覆盖:就是设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次,同时每个判断中的每个条件的可能取值至少执行一次。
条件组合覆盖:就是设计足够的测试用例,运行被测试程序,使得每个判断的所有可能的条件取值组合至少执行一次。
路劲测试:就是设计足够的测试用例,覆盖程序中所有可能的路径。
条件测试路径选择
当程序判定多于一个时,形成的分支结构可以分为两类:嵌套型分支结构和连锁型分支结构。
循环测试路径选择
循环分为4种不同类型:简单循环、连锁循环、嵌套循环和非结构循环。
黑盒测试的测试用例设计
1、 等价类划分
2、 边界值分析
3、 错误推测法
4、 果因图
等价类划分方法把所有可能的输入数据,即程序的输入域划分成若干部分,然后从每一部分中选取少数有代表性的诗句作为测试用例。
等价类的划分有两种不同的情况:有效等价类和无效等价类。
划分等价类的原则:1、如果输入条件规定了取值范围,或值的个数,则可以确立一个有效等价类和两个无效等价类。2、如果输入条件规定了输入值的集合,或者是规定了“必须如何”的条件,这时可确立一个有效等价类和一个无效等价类。3、如果输入条件是一个布尔量,则可以确定一个有效等价类和一个无效等价类。4、如果规定了输入数据的一组值,而且程序要对每个输入值分别进行处理。5、如果规定了输入数据必须遵守的规则,则可以确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。
边界值分析
使用边界值分析方法设计测试用例,首先应确立边界条件。应当选取正好等于,刚刚大于,或刚刚小于边界的值作为测试数据。
用边界值分析设计测试用例应遵循原则:1、如果输入条件规定了取值范围,则应对该范围的边界内附近,恰好在边界和边界外附近(无效等价类中)设计测试用例。2、如果输入条件规定了数据的个数,则应对最小个数,最大个数,比最少个数少1,比最大个数大1等情况设计测试用例。3、针对规格说明中的每个输出条件使用前面的1和2原则。4、如果程序规格说明中提到的输入或输出域是个有序的集合(如顺序文件,线性表等)。应选有序的第一个和最后一个元素作为测试用例。
等价类和边界值方法的区别:
1、 边界值不是从等价类中随便取一个数据作为代表,而是选一个或几个特定值,使这个等价类的每个边界都作为测试的目标。
2、 边界值分析不仅要考虑输入条件,而且要考虑输出条件(输出等价类)。
一般联合使用等价类划分和边界值分析二种方法。
错误推测法
错误推测法德基本想法是:列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择测试用例。
因果图:
因果图的适用范围:如果在测试时必须考虑输入条件的各种组合,可使用一种适合于描述对于多种条件的组合,相应产生多个动作的形式来设计测试用例,这就需要利用因果图。
因果图方法最终生成的就是判定表。
用因果图生成测试用例的基本步骤:1.分析软件规格说明描述中,哪些是原因(即输入条件或输入条件的等价类),哪些是结果(即输出条件),并给每个原因和结果赋予一个标识符。2。分析软件规格说明描述中语义,找出原因与结果之间,原因与原因之间对应的是什么关系?根据这些关系,画出因果图。3、由于语法或环境限制,有些原因与原因之间,原因与结果之间的组合情况不可能出现。为表明这些特殊情况,在因果图上用一些记号标明约束或限制条件。4。把因果图转换成判定表。5。把判定表的每个列拿出来作为依据,设计测试用例。
在因果图中出现的基本符号:通常在因果图中Ci表示原因,用Ei表示结果,各结点表示状态,可取值“0”或“1”。0表示某状态不出现,1表示末状态出现。
软件测试的策略:
测试过程按4个步骤进行,即单元测试、组装测试、确认测试和系统测试。
单元测试(Unit Testing)又称模块测试,是针对软件设计的最小单元——程序模块,进行正确性检验的测试工作。
单元测试步骤:测试模块时,同时要考虑它和外界的联系,用一些辅助模块去模拟与被测模块相联系的其它模块。驱动模块(driver)和桩模块(stub)
部分常见错误清单
一、 模块接口检查表
1. 模块接受的输入参数个数与模块的变元个数是否一致?
2. 参数与变元的属性是否匹配?
3. 参数与变元所用的单位是否一致?
4. 传递给被调用模块的变元的数目是否等于那个模块的参数的数目?
5. 传递给被调用模块的变元属性和参数的属性是否一致?
6. 传递给被调用的模块的变元的单位和该模块参数的单位是否一致?
7. 传递给内部函数的变元属性、数目和次数是否正确?
8. 是否修改了只是作为输入用的变元?
9. 全程变量的定义在各个模块中是否一致?
10. 有没有把常数当做变量来传递?
二。完成外部输入/输出时的检查表
1、文件属性是否正确?
2、Open语句是否正确?
3、格式说明与输入/输出语句给出的信息是否一致?
4、缓冲区容量与记录长度是否匹配?
5、在进行读写操作之前是否打开了文件?
6、队结束文件条件的判断和处理是否正确?
7.对输入/ 输出错误的处理是否正确?
8、有没有输出信息中有正文错误?
三、模块局部数据结构检查表
1.不正确或不一致说明?
2、错误的初始值或错误的缺省值?
3、变量名拼写错或缩写错?
4.不相容的数据类型?
5、下溢、上溢或是地址错误?
组装测试(Integrated Testing)
通常,把模块组装成为系统的方式有两种:一次性组装方式和增殖式组装方式
增值式组装方式:1、自顶向下的增值方式2、自底向下的增值方式3、混合增值式测试
自顶向下增值的方式和自底向上增值方式各有优缺点。
一般来讲,一种方式的优点是另一种方式的缺点。
确认测试(Validation Testing)又称有效性测试,任务是验证软件的功能和性能及其他特性是否与用户的要求一致。
1、 进行有效性测试(黑盒测试)
有效性测试是在模拟的环境(可能就是开发的环境)下,运用黑盒测试的方法,验证被测软件是否满足需求规格说明书列出的需求。
2、 软件配置复查
软件配置复查的目的是保证
软件配置的所有成分都齐全
各方面的质量都符合要求
具有维护阶段所必须的细节;
而且已经编排好分类的目录。
验收测试(Acceptance Testing)是以用户为主的测试。软件开发人员和QA(质量保证)人员也应参加。由用户参加设计测试用例,使用生产中的实际数据进行测试。
系统测试(System Testing)是将通过确认测试的软件,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其他系统元素结合在一起,在实际运行环境下,对计算机系统进行一系列的组装测试和确认测试。
α测试和β测试
α测试是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的测试。
β测试是由软件的多个用户在实际使用环境下进行的测试。这些用户返回有关错误信息给开发者。
测试种类:
软件测试是由一系列不同的测试组成。主要目的是对以计算机为基础的系统进行充分的测试。
功能测试:功能测试是在规定的一段时间内运行软件系统的所有功能,以验证这个软件系统有无严重错误。
可靠性测试:如果系统要求说明书中有对可靠性的要求,则需进行可靠性测试。
强度测试:强度测试是要检查在系统运行环境不正常乃至发生故障的情况下,系统可以运行到何种程度的测试。
性能测试:是要金叉系统是否满足在需求说明书中规定的性能。特别是对于实际系统或嵌入式系统。
恢复测试:恢复测试是要证实在克服硬件故障(包括掉电、硬件或网络出错等)后,系统能否正常地继续进行工作,并不对系统造成任何损害。
启动/停止测试:这类测试的目的是验证在机器启动及关机阶段,软件系统正确处理的能力。
配置测试:这类测试是要检查计算机系统内各个设备或各种资源之间的相互联结和功能分配中的错误。
安全性测试:是要检验在系统中已经存在的系统安全性、保密性搓洗是否发挥作用,有无漏洞。
可使用性测试:主要从使用的合理性和方便性等角度对软件系统进行检查,发现人为因素或使用上的问题。
可支持性测试:是要验证系统的支持策略对于公司与用户方面是否切实可行。
安装测试:它的目的不是找软件错误,而是找安装错误。
过程测试:在一些大型的系统中,部分工作由软件自动完成,其他工作则需由各种人员,包括操作员,数据库管理员,终端用户等,按一定规程同计算机配合,靠人工来完成。
互联测试:是要验证两个或多个不同的系统之间的互连性。
兼容性测试:这类测试主要验证软件产品在不同版本之间的兼容性。
容量测试:是要检验系统的能力最高能达到的什么程度。
在使系统的全部资源达到“满负荷”的情形下,测试系统的承受能力。
文档测试:这种测试是检查用户文档(如用户手册)的清晰性和精确性。
调试(Debug)
软件调试是进行了成功的测试之后才开始的工作。它与软件测试不同,调试的任务是进一步诊断和改正程序中潜在的错误。
调试的步骤:
1、 从错误的外部表现形式入手,确定程序中出错位置。
2、 研究有关部分的程序,找出错误的内在原因。
3、 修改设计和代码,以排除这个错误。
4、 重复进行暴露了这个错误的原始测试或某些有关测试。
几种主要的调试方法:
调试的关键在于推断程序内部的错误位置及原因,可以采用以下方法:
强行排错:这种调试方法目前使用较多,效率较低。他不需要过多的西靠,比较省脑筋。
回溯法调试:这是在小程序中常用的一种有效地调试方法。一旦发现了错误,人们先分析错误征兆,确定最先发现“症状”的位置。
归纳法调试:它的基本思想是:从一些线索(错误征兆)着手,通过分析它们之间的关系来找出错误。
常以3W1H形式组织可用的数据:
“What”列出一般现象,“Where”说明发现现象的地点,“When”列出现象发生时所有已知情况“How”说明现象的范围和量级。
演绎法调试:演绎法是一种从一般原理或前提出发,经过排除和精化的过程来推导出结论的思考方法。
调试原则:
在调试方面,许多原则本质上是心理方面的问题,调试由两部分组成,调试原则也分成两组。
确定错误的性质和位置的原则
用头脑去分析思考与错误征兆有关的信息。避开死胡同。
只把调试工具当做辅助手段来使用。避免用试探法,最多只能把它当做最后手段。
修改错误的原则:
在出现错误的地方,很可能还有别的错误。当心修正一个错误的同时有可能会引入新的错误。