今天一起学习软件测试理论:软件测试目的,软件测试定义,软件测试原则,软件测试分类,软件测试方法,测试基本流程。
软件测试定义:软件测试(英语:software testing),描述一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。换句话说,软件测试是一种实际输出与预期输出之间的审核或者比较过程。软件测试的经典定义是:在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程,为软件产品的质量和评价提供依据。
一、软件测试目的:
1、确保软件完成了它所承诺或公布的功能。
2、确保软件满足性能和效率的要求。
3、确保软件是健壮的、适应用户的环境。
4、提早预防、尽早发现、及时跟踪软件缺陷,满足产品发布需求。
二、软件测试原则:
1、有计划的尽早测试,解决问题的成本越小。测试需求贯穿整个软件的生命周期,缺陷修复成本随着各个阶段的靠后而提升。
2、成功的测试在于发现迄今未发现的缺陷。
3、测试并不能保证软件100%的没有问题。进行测试时可以查找并报告发现的软件缺陷和错误,但是不能保证软件的缺陷和错误能全部找到,继续经一部测试可能还会找到一些,也就是说测试只能证明软件存在错误而不能证明软件没有错误。
4、测试工作的本质都应追溯到用户需求。
5、测试的规模由小而大,从单元测试到系统测试。
6、0 bug,good-enough原则,穷举测试是不可能实现的。即Zero Bug与Good Enough;本条给我们灌输的是一种测试执行通过的标准。显示任何测试通过不可能达到0bug。那我们就应该达到Good Enough。这条原则是一种权衡投入/产出比的原则:测试既不能不充分也能过,我们需要制定测试通过标准和测试内容,比如:遗留的bug数&严重程度,测试用例的执行率&通过率等来解决上面的问题。
8、回归测试的关联性。回归测试的关联性一定要引起充分注意。修改一个错误而引起更多错误出现的现象并不少见。
9、关注程序不该做的事。检查程序应该完成哪些功能,这只是测试工作的一半,测试工作的另一半是,检查程序完成了哪些不应该完成的功能。
三、测试基本流程:
第一步:对要执行测试的产品/项目进行分析,确定测试策略,制定测试计划。该计划被审核批准后转向第二步。测试工作启动前一定要确定正确的测试策略和指导方针,这些是后期开展工作的基础。只有将本次的测试目标和要求分析清楚,才能决定测试资源的投入。
第二步:设计测试用例。设计测试用例要根据测试需求和测试策略来进行,进度压力不大时,应该设计的详细,如果进度、成本压力较大,则应该保证测试用例覆盖到关键性的测试需求。该用例被批准后转向第三步。
第三步:如果满足“启动准则”(EntryCriteria),那么执行测试。执行测试主要是搭建测试环境,执行测试用例。执行测试时要进行进度控制、项目协调等工作。
第四步:提交缺陷。这里要进行缺陷审核和验证等工作。
第五步:消除软件缺陷。通常情况下,开发经理需要审核缺陷,并进行缺陷分配。程序员修改自己负责的缺陷。在程序员修改完成后,进入到回归测试阶段。如果满足“完成准则”(ExitCriteria),那么正常结束测试。
第六步:撰写测试报告。对测试进行分析,总结本次的经验教训,在下一次的工作中改。
需求分析(概念)阶段:阅读需求,理解需求,分析业务需求点,提取测试需求。
计划阶段:编写测试用例计划,参考软件需求规格说明书、项目总体计划,制定测试计划和测试方案内容包括测试范围、进度的安排,人力物力的分配,整体测试策略的制定,风险评估与规避措施,主管编写,参与评审工作。
设计阶段:编写测试用例,参考需求分析、概要设计、详细设计,不明确的与开发、产品经理沟通。编写测试用例完成后进行评审。
开发阶段:首先搭建测试环境,执行预测,判定当前版本是否可测,预测通过,正式进入系统测试,遇到问题提交bug到缺陷管理平台,并对bug进行跟踪,直到被测试软件达到测试需求要求,没重大bug,测试结束。
评估阶段:出测试报告,对整个测试的过程和版本质量做一个详细的评估总结经验和教训。
四、测试对象:
软件(英语:software)是一系列按照特定顺序组织的电脑数据和指示,是电脑中的非有形部分,在这里我们可以将“指示”理解为程序。外设硬件(鼠标,键盘或者其他)给出指令(点击,输入等),操作系统接收指令,再将指令分发给程序,程序再做出响应,反馈给操作系统,操作系统再反馈给硬件。软件并不一定只包括可以在计算机上运行的计算机程序,有些定义中,与计算机程序相关的文档,一般也被认为是软件的一部分。所以测试对象=程序 + 数据 + 文档。
五、软件测试分类:
软件测试按阶段分,可以分为单元测试,集成测试,系统测试,验收测试。
1、单元测试是对软件组成单元(最小可测试单元)进行测试,其目的是检验软件基本组成单位的正确性,测试的对象是软件设计的最小单位:函数。一般来说,最小单元要根据实际情况去判定其具体所指,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
通常,小型测试是由SWE来实现,也会有少量的SET参与,TE几乎不参与小型测试。-《google测试之道》
所以通常而言:谁编写代码,谁负责编写单元测试用例,即单元测试由开发人员自己执行。
2、集成测试是指通过测试的单元模块组装成子系统,然后再进行的测试,主要测试内容是接口。
集成测试大部分是接口测试和交互测试。一般来说集成测试由测试人员完成。
在产品早期开发过程中,在独立模块功能被开发完毕之后,SET会驱动这些测试的实现及运行,SWE会深度参与,一起编码、调试和维护这些测试。-《google测试之道》
3、系统测试是指对整个系统的测试,将硬件、软件、操作人员看作一个整体,检验它是否有不符合系统说明书的地方。主要包括功能测试、界面测试、可靠性测试、易用性测试、性能测试。一般而言:系统测试是测试人员的工作。
功能测试: 对产品的各功能(包括功能可用性、功能实现程度(功能流程&业务流程、数据处理&业务数据处理)方面测试)进行验证,以检查是否满足需求的要求。
性能测试:通过自动化测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。
4、验收测试是部署软件之前的最后一个测试操作。在软件产品完成了单元测试、集成测试和系统测试之后,产品发布之前所进行的软件测试活动。它是技术测试的最后一个阶段,也称为交付测试。验收测试的目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务。主要有Apha和Bta测试:Alpha测试通常是阶段性的开发完成后所开始进行,一直持续到进入Beta测试阶段前的阶段。Alpha测试是一种验证测试,在模拟的环境中以模拟的数据来运行。在这个阶段中,通常是开发人员与测试人员以模拟或实际操作性的方式进行验证测试。在系统测试中通常先进行Alpha测试以验证信息系统匹配用户以及设计需求所期望的功能。当Alpha阶段完成后,开发过程进入到Beta阶段,由公众参与的测试的阶段。Beta测试可称为确认测试,在一个真实的环境中以实际的数据来运行测试,以确认性能,系统运行有效率,系统撤消与备份作业正常,通过测试让信息系统日后可以更趋完善。Bta测试又分为两种:封闭测试和公开测试:由软件的最终用户在一个或多个用户场所来进行的,开发者通常不在现场,用户记录测试中遇到的问题并报告给开发者。
封闭测试(Closed Beta,常简作封测或CB)是软件或服务等产品在开发完成后、将公开上市前的测试过程。相对于公开测试,封闭测试的主要用途是测试软件的功能和检查程序错误等等,因此通常只提供给少数人进行测试。有些公司会要求参与测试者签署保密协议,以避免测试的产品提前外流。MMORPG的封测结束之后,游戏公司常会将角色数据删除,但也有少数不删的。
公开测试(Open Beta,常简作公测或OB),一般常指软件或服务等产品在正式上市前开放给不特定人试用,虽然原意是希望试用者能够提报bug,但并不是把试用者当做真正的验证人员。由于通常为免费性质,故常常能够吸引到大批的试用者参与,可视为另一种营销策略。另一方面也节省下测试人员的成本,和验证稳定度(对于多人使用的带宽及机器是否能负载,又称压力测试)的时间。
另外一个不常提及的是Gmma测试:Gamma测试是一个很少被提及的非正式测试阶段,该测试阶段对应的是对“存在缺陷”产品的测试。考虑到任何产品都可以被称为“存在缺陷”的产品(测试只能发现产品中存在的问题,不能说明产品不存在问题),因此这个概念存在一定的不确定性。
六、软件测试方法
1、按照测试设计分类可以分为 Black box黑盒测试、White box白盒测试、Gray box灰盒测试。
黑盒测试:又称功能测试或数据驱动测试,是针对软件的功能需求/实现进行测试,通过测试来检测每个功能是否符合需求,把软件系统当作一个“黑盒”,不考虑程序内部的逻辑结构,从软件的行为,而不是内部结构出发来设计测试。
常见的黑盒测试方法:等价类划分、边界值分析、因果图、错误推测、场景法。
白盒测试:白盒测试也称结构测试或逻辑驱动测试,设计者可以看到软件系统的内部结构,并且使用软件的内部知识来指导测试数据及方法的选择,通过测试来检测软件内部是否按照需求、设计正常运行。
常见的白盒测试方法:逻辑覆盖(语句覆盖、分支覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖)、循环覆盖(简单循环、嵌套循环、串接循环)。
灰盒测试:介于白盒测试与黑盒测试之间的一种测试,灰盒测试多用于集成测试阶段,不仅关注输出、输入的正确性,同时也关注程序内部的情况。
2、按照是否需要测试人员操作分类分为手动测试(人工测试,比如页面操作的测试)、自动测试(测试人员编写脚本/代码/工具代替人工,来完成相应测试工作)和半自动测试(代码或脚本,与人工结合的测试)。
功能测试:测试软件产品的功能是否能达到预期;
性能测试:通常验证软件的性能在正常环境和系统条件下重复使用是否还能满足性能指标,分为压力测试(评估应用程序在峰值负载和正常情况下的行为)和负载测试(负载测试的目的是通过不断地、稳定地增加系统的负载来测试系统,直到达到阈值。它是性能测试的一个子集)。
接口测试:测试系统组件间接口的一种测试;
安全测试:测试系统在防止非授权的内部或外部用户的访问或故意破坏等情况时怎么样;
兼容性测试:测试软件在一个特定的硬件/软件/操作系统/网络等环境下的性能如何。向上兼容向下兼容,软件兼容硬件兼容;
回归测试:对软件进行修改之后进行的测试,目的是检验对软件进行的修改是否正确。一是所做的修改达到了预定的目的,也就是确认测试,二是还要保证不影响软件的其他功能的正确性。
静态测试:不运行被测程序本身,仅通过分析或检查源程序的文法、结构、过程、接口等来检查程序的正确性。也包括测试文档。
动态测试:通过运行软件来检验软件的动态行为和运行结果的正确性。