为什么要进行软件测试?
1.软件总存在缺陷,有缺陷的软件也许仅仅给用户带来了不便,也可能是灾难性的。
用户体验差,产生不信任感
无法正常使用
系统崩溃,损害用户的利益
企业形象的下降,产生信任危机
高额的维护费用
产生的隐性商业损失
2.软件的应用越来越广泛
3.软件的工程化程度越来越高,复杂度越来越高
4.竞争越来越激烈的企业生存环境
需要通过“软件测试” ,尽可能减少缺陷,保障软件质量。
软件测试定义的两面性
正向思维——验证软件正常工作——评价一个程序或系统的特性或能力并确定是否达到预期的结果——在设计规定的环境下运行软件的所有功能,直至全部通过。
逆向思维——假定软件有错误——测试是为发现错误而针对某个程序或系统的执行过程——寻找容易犯错误的地方和系统的薄弱环节,试图破坏系统,直至找不出问题。
软件测试的定义
定义1:1979年Glenford J. Myers在《软件测试艺术》 (The art of software testing)书中给出的定义:软件测试是为了发现软件缺陷而执行程序或系统的过程。
定义2:1983年IEEE给软件测试下的定义是:“使用人工或自动的手段来运行或测定某个软件系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别”。
定义3:软件测试就是在软件投入运行前,对软件需求分析、设计规格说明和编码的最终复审,是软件质量保证的关键步骤。
定义4:软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例,并利用这些测试用例去执行程序,以发现软件故障的过程,该定义强调寻找故障是测试的目的。
定义5:软件测试是一种软件质量保证活动,其动机是通过一些经济有效的方法,发现软件中存在的缺陷,从而保证软件的质量。
软件测试的目的
基于不同的立场,存在着两种完全不同的测试目的:
从用户的角度出发
普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,以考虑是否可接受该产品。
从软件开发者的角度出发
希望测试成为表明软件产品中不存在错误的过程,验证该软件已正确地实现了用户的要求,确立人们对软件质量的信心。
软件测试的最终目的
软件测试的目的是想以最少的时间和人力找出软件中潜在各种错误和缺陷。
1.测试是程序的执行过程,目的在于发现错误;
2.测试是为了证明程序有错,而不是证明程序无错误;
3.一个好的测试用例在于能发现至今未发现的错误;
4.一个成功的测试是发现了至今未发现的错误的测试;
软件测试要解决的问题是:软件的行为是否符合“规定的”要求,它有两个方面的含义,其一是软件是否做了规定要做的事,其二是软件是否做了没有规定要做的事。
软件测试的最终目的是确保交给用户的软件产品符合用户的需求。
软件测试的原则
1.所有的软件测试都应追溯到用户需求。
2.尽早地和不断地进行软件测试。
3.完全测试是不可能的,测试需要终止。
4.测试无法显示软件潜在的缺陷。
5.充分注意测试中的群集现象。
6.程序员应避免检查自己的程序。
7.尽量避免测试的随意性。
8.测试用例应包括合理的输入条件和不合理的输入条件。
9.应当彻底检查每个测试的执行结果。
10妥善保存测试相关的文档及数据,为管理提供依据,为维护提供方便。
软件测试的对象
根据软件的定义,软件包括程序、数据、文档,所以软件测试不仅仅是对程序进行测试,软件测试贯穿于整个软件生命周期。
在整个软件生命周期中,各阶段有不同的测试对象,形成了不同开发阶段的不同类型的测试。需求分析、概要设计、详细设计以及程序编码等各阶段产生的文档(包括需求规格说明、概要设计、详细设计)以及源程序,都应作为“软件测试”的对象。
软件测试分类的划分标准
按阶段划分:单元测试、集成测试、系统测试和验收测试。
按是否运行程序划分:静态测试和动态测试
按是否查看代码划分:白盒测试、黑盒测试和灰盒测试
其他划分:兼容测试、安全性测试、回归测试、冒烟测试、随机测试、APP测试,接口测试
单元测试UT( Unit Testing)
单元测试是对软件基本组成单元(软件设计的最小单位)进行正确性检验的测试工作,如模块、过程、函数或一个类的方法。
单元测试属于白盒测试,其主要目的是针对详细设计及编码过程中可能存在的各种错误,主要测试单元内部的数据结构、逻辑控制、异常处理等等。
单元测试内容:
入口和出口函数
输入和输出信息
错误处理信息
部分边界数值测试
集成测试IT( Integration Testing )
集成测试也叫组装测试、联合测试、子系统测试或部件测试,是在单元测试的基础上,将所有模块按照概要设计要求组装成为子系统或系统,验证组装后功能以及模块间接口是否正确的测试工作。
集成测试属于灰盒测试,其主要目的是针对概要设计中可能存在的问题,主要测试各单元与其它程序部分之间的接口、或模块之间的接口和接口数据传递的关系,以及模块组合后的整体功能。
集成测试方法:
非增量式集成:采用一步到位的方法来构造测试。
增量式集成:采用逐步集成方式实现测试。
自顶向下增量式测试 桩程序
自底向上增量式测试 驱动程序入口和出口函数
系统测试ST( System Testing )
系统测试是将已经集成好的软件系统与计算机硬件、外设、网络等其他元素结合在一起,在模拟实际使用的环境下,对软件系统进行一系列的组装测试和确认测试的工作。
系统测试类型:
功能测试:验证软件是否符合用户潜在的或明确的需求
性能测试:主要从时间和空间(响应时间,空间:内存,CPU,IO,网络,)
压力测试:测试系统在一定饱和状态下如:CPU,内存等饱和使用情况
下, 系统能够处理的会话能力,以及系统是否会出现错误
容量测试:确定系统处理同时在线的最大用户数
其他测试分类
安全性测试:身份验证,授权,加密。测试系统在防止非授权的内部和外部用户的访问或故意破坏等情况时怎么样。比如:普通用户不能拥有系统管理员的权限;同一用户登录不同机器,同时操作对数据的破坏;登录网上 银行输入的密码是明文还是密文显示;数据备份和恢复的能力。跨目录文件读取漏洞,SQL注入,跨站脚本漏洞
易用性测试:易学,易操作,易理解等
GUI测试: Graphical user interface图形用户界面测试
配置测试: 通过对被测系统软硬环境的调整,了解各种不同环境对系统性能的影响程度,从而找到系统各项资源的最优分配原则。(该方法在每次执行测试时更换,扩充硬件设备,调整网络环境,从而确定各个因素对系统性能的影响,找出影响最大的因素)。
异常测试:检测系统对异常情况的处理
可靠性测试:在规定时间内,完成规定任务的能力
安装测试:指软件产品在指定环境中被安装的能力。
1.软件的安装类型是文本界面,还是图形导向;
2.绿色软件。
文档测试:主要是对用户手册、操作手册、安装文档等进行的测试
验收测试UAT( User Acceptance Test )
验收测试也称交付测试,是在软件产品完成了单元测试、集成测试和系统测试之后,产品发布之前所进行的最后测试,是一项确定产品是否能够满足合同或用户所规定需求的测试。
验收测试属于黑盒测试,其主要目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务。
验收测试分类:
非正式验收测试:Alpha 测试(α测试)、Beta 测试(β测试)
正式验收测试:有正规的测试过程,需要制定测试计划、定义测试方案、选择测试用例,进行测试,结果提交。着重考虑软件是否满足合同规定的所有功能和性能,文档资料是否完整、准确,人机界面和其他方面。
白盒测试( White Box Testing)
白盒测试又称为结构测试、透明盒测试、逻辑驱动测试或基于程序本身的测试,着重于程序的内部结构及算法,通常不关心功能与性能指标。
白盒测试主要应用在单元测试阶段。
白盒测试设计技术可分为逻辑覆盖和路径覆盖,逻辑覆盖从弱到强又可分为以下几种:
语句覆盖(SC)
判定覆盖(DC)
条件覆盖(CC)
判定/条件覆盖(DCC)
条件组合覆盖(CMC)
路径覆盖(PC)
黑盒测试( Black Box Testing )
黑盒测试又被称为功能测试、数据驱动测试或基于规格说明的测试,注重于测试软件的功能性需求,不关心程序内部逻辑和内部特性,实际上是站在最终用户的立场上,检验输入输出信息及系统性能指标是否符合规格说明书中有关功能需求及性能需求的规定。
黑盒测试主要应用在确认测试、系统测试和验收测试阶段。
黑盒测试设计技术可分为:
等价类划分
边界值分析
场景法
错误推测法
判定表驱动法
因果图法
正交试验法
灰盒测试( Gray Box Testing )
灰盒测试是介于白盒测试与黑盒测试之间的测试,基于程序运行时刻的外部表现同时又结合程序内部逻辑结构来设计用例,执行程序并采集程序路径执行信息和外部用户接口结果的测试技术。
灰盒测试关注于系统内部模块之间的接口和交互,可以这样理解,灰盒测试关注输出对于输入的正确性,同时也关注内部表现,但这种关注不象白盒那样详细、完整,只是通过一些表征性的现象、事件、标志来判断内部的运行状态,有时候输出是正确的,但内部其实已经错误了,这种情况非常多,如果每次都通过白盒测试来操作,效率会很低,因此需要采取这样一种灰盒的方法。
灰盒测试主要应用在集成测试阶段。
兼容性测试( Compatibility Testing)
在特定的或不同的硬件、网络环境和操作系统平台上、不同的应用软件之间,验证软件系统能否正常地运行,以及能否正确存取原先版本的用户数据所进行的测试。
兼容性测试分三大类:硬件兼容性测试、软件兼容性测试、数据兼容性测试。
硬件兼容性测试:与整机兼容、与板卡和外设兼容
软件兼容性测试:操作系统/平台的兼容、应用软件之间的兼容、不同浏览器的兼容、数据库的兼容、软硬件配合兼容、网络环境兼容性测试、分辨率兼容性测试
数据兼容性测试:不同版本间的数据兼容、不同软件间的数据兼容
WEB兼容性测试的侧重点:
操作系统兼容性测试
浏览器兼容性测试
分辨率兼容性测试
C/S兼容性测试的侧重点:
操作系统兼容性测试
客户端版本与服务器版本兼容性测试
APP测试
App是基于移动互联网软件及硬件环境的应用软件。App测试就是要找出App中的Bug,通过人工和测试工具,判断App系统是否能够满足预期标准。移动App,由于增加了终端、外设和网络等多项元素,因此测试内容和类型也相应增加了,主要针对App的功能、性能、安全性、终端适配等方面进行测试
功能测试又包括:安装卸载测试、UI测试、交叉事件测试、升级测试、网络环境测试、回归测试、用户体验测试等
终端适配测试(云测试):通过选择第三方测试平台进行自动化测试,如XXX云平台。 目前可以选择适配300种机型和600种机型,这两种适配方案。在云平台上传app安装包以后(支持android和ios两个平台),就可以等待测试报告。
回归测试RT( Regression Testing )
回归测试是指修改了旧代码后,对软件的新版本测试时,重复执行上一个版本测试时使用的测试用例。防止出现“以前应用没有的问题现在出问题了。
回归测试的策略:再测试全部用例、基于风险选择测试、基于操作剖面选择测试、再测试修改的部分。
冒烟测试BVT( Build Verification Testing )
冒烟测试的对象是每一个新编译的需要正式测试的软件版本,目的是确认软件基本功能正常,可以进行后续的正式测试工作。
随机测试( Ad-hoctesting )
随机测试又名猴子测试( random monkey Testing ),主要是根据测试者的经验对软件进行功能和性能抽查,测试数据是随机产生的,在测试用例之外。只能作为一个测试的补充。
软件测试工程师的职责
配置测试环境
执行软件测试
报告软件缺陷
更新缺陷报告内容
验证修正的缺陷
报告测试状态
完成测试相关的其它任务
软件测试工程师的分类
一般分类:软件测试开发工程师和软件测试工程师。
按职位分类:测试部门经理、测试技术总监、测试主管、测试项目经理、高级测试工程师、中级测试工程师、低级测试工程师、测试设计人员、测试执行人员、测试协助员、测试技术支持。
按测试类型分类:功能测试工程师、自动化测试工程师、性能测试工程师、安全测试工程师等。
按测试对象分类:web测试工程师、数据库测试工程师、C/S测试工程师、APP测试工程师等。
软件测试工程师的基本素质
责任心、细心、耐心、专心、自信心;
沟通能力、幽默感、记忆力(挖掘以往错误)、怀疑精神、自我督促(防止懒散,保证每天正常工作)、洞察力(发现重点)、发现问题的敏锐度;
语言及文字表达能力,问题描述能力;
广泛的经验;
会提问,会寻求帮助;
逻辑思维能力、发散思维能力;
团队协作能力;
处理日常事务的能力和处理紧急突发事件的能力。