课程来源:学堂在线 -- 清华大学 -- 软件工程
14.1 软件测试概念
软件测试作为开发过程的最后一个步骤,对软件质量保证具有非常重要的作用。
软件缺陷的产生
软件测试
正向思维:软件测试是验证软件可以正常工作
- 评价一个程序或系统的特性或能力并确定是否达到预期的结果。
- 在设计规定的环境下运行软件的所有功能,直至全部通过。
逆向思维:假定软件具有一定缺陷,通过设计以及执行一系列测试用例,证明程序执行错误的假设
- 测试是为了发现错误而针对某个程序或系统的执行过程。
- 寻找容易犯错地方和系统薄弱环节,试图破坏系统直至找不出问题。
软件测试的目的
直接目标:发现软件错误
以最少的人力、物力和时间找出软件中潜在的各种错误和缺陷,通过修正这些错误和缺陷提高软件质量,回避软件发布后由于潜在的软件错误和缺陷造成的隐患所带来的商业风险。
期望目标:检查系统是否满足需求
测试是对软件质量的度量和评估,以验证软件的质量满足客户需求的程度,为用户选择和接受软件提供有力的依据。
附带目标:改进软件过程
通过分析错误产生的原因,可以帮助发现当前开发所采用的软件过程缺陷,从而进行软件过程改进;通过分析整理测试结果,可以修正软件开发规则,为软件可靠性分析提供依据。
软件测试的局限性
测试的不彻底性
- 测试只能说明错误的存在,但不能说明错误不存在
- 经过测试后的软件不能保证没有缺陷和错误
测试的不完备性
- 测试无法覆盖到每个应该测试的内容
- 不可能测试到软件的全部输入与响应
- 不可能测试到全部的程序分支的执行路径
测试作用的间接性
- 测试不能直接提高软件质量,软件质量的提高要依靠开发
- 测试通过早期发现缺陷并督促修正缺陷来间接地提高软件质量
尽早地在缺陷刚引入时就发现和修复,可以有效地避免缺陷的雪崩效应。
缺陷的集群性
杀虫剂悖论
用同样的测试用例多次重复进行测试,最后将不再能够发现新的缺陷。
如同给果树喷撒农药,为了杀灭害虫只打一种杀虫药,虫子就会有抗体而变得适应,于是杀虫剂将不再发挥作用。
测试用例需要定期评审和修改,同时要不断增加新的不同测试用例来测试软件的不同部分,从而发现更多潜在的缺陷。
软件测试思维
发散思维、两极思维、组合思维、逆向思维、 组合思维、简单思维、系统思维、比较思维
14.2 软件测试类型
软件测试过程
计划:识别测试需求、 分析质量风险、拟定测试方案、制定测试计划
准备:组织测试团队、设计测试用例、开发测试工具和脚本、准备测试数据
执行:获得测试版本、执行和实施测试、记录测试结果、跟踪和管理缺陷
报告:分析测试结果、评价测试工作、提交测试报告
软件测试活动
软件测试类型
测试对象角度: 单元测试、集成测试、系统测试、验收测试
测试技术角度:黑盒测试(功能测试)、白盒测试(结构测试)
程序执行角度:静态测试、动态测试
人工干预角度:手工测试、自动化测试
单元测试
单元测试(Unit Testing)是对软件基本组成单元进行的测试,其测试对象是软件设计的最小单元(模块或者类)。
单元测试一般由编写代码的开发人员执行,用于检测被测代码的功能是否正确。
集成测试
集成测试(Integration Testing)是在单元测试的基础上,将所有模块按照总体设计的要求组装成为子系统或系统进行的测试。
- 一次性集成方式:分别测试每个单元,再一次性将所有单元组装在一起进行测试。
- 渐增式集成方式:先对某几个单元进行测试,然后将这些单元逐步组装成较大的系统,在组装过程中边连接边测试。
集成测试对象是模块间的接口,其主要目的是找出在模块接口(包括系统体系结构)设计上的问题。
功能测试
功能测试(Functional Testing)是在已知产品所应具有的功能基础上,从用户角度来进行功能验证,以确认每个功能是否都能正常使用。
性能测试
性能测试(Performance Testing)是在实际或模拟实际的运行环境下,针对非功能特性所进行的测试,包括压力测试、容量测试、安全测试和可靠性测试等。
验收测试
验收测试是在软件产品完成了系统测试之后、产品发布之前进行的软件测试活动,其目的是验证软件的功能和性能是否能够满足用户所期望的要求。
安装测试
安装测试是系统验收之后,需要在目标环境中进行安装,其目的是保证应用程序能够被成功地安装。
- 应用程序是否可以成功地安装在以前从未安装过的环境中?
- 应用程序是否可以成功地安装在以前已有的环境中?
- 配置信息定义正确吗?
- 在线文档安装正确吗?
- 安装应用程序是否会影响其他的应用程序吗?
- 安装程序是否可以检测到资源的情况并做出适当的反应?
- 考虑到以前的配置信息吗?
黑盒测试与白盒测试
黑盒测试:将测试对象看做一个黑盒子,完全不考虑程序内部的逻辑结构和内部特性,只是依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。
白盒测试:把测试对象看做一个透明的盒子,允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。
静态测试与动态测试
静态测试:通过人工分析或程序正确性证明的方式来确认程序正确性。
动态测试:通过动态分析和程序测试等方式检查程序执行状态,以确认是否有问题。
手工测试与自动化测试
- 手工测试:测试人员根据测试大纲中所描述的测试步骤和方法,手工地输入测试数据并记录测试结果。
- 自动化测试:相对于手工测试而言,主要是通过所开发的软件测试工具或脚本等手段,按照测试工程师的预定计划对软件产品进行的自动测试。
测试用例文档
缺陷报告
缺陷的严重性是指缺陷对软件产品使用的影响程度。
缺陷的优先级是指缺陷应该被修复的紧急程度。
14.3 软件功能测试
功能测试
功能测试(Functional Testing)是在已知产品所应具有的功能基础上,从用户角度来进行功能验证,以确认每个功能是否都能正常使用。
功能测试方法
黑盒测试方法
场景法
通过运用场景对系统的功能点或业务流程进行描述,对应不同的业务场景生成相应的测试用例,从而发现需求和实现中存在的问题。
错误推测法
人们根据经验或直觉推测程序中可能存在的各种错误,从而有针对性地编写检查这些错误的测试用例的方法。
- 软件缺陷具有空间聚集性,80%的缺陷常常存在于20%的代码中。因此,应当记住常常光临代码的高危多发“地段”,这样发现缺陷的可能性会大得多。
- 列举程序中所有可能的错误和容易发生错误的特殊情况,根据可能出现的错误情况选择测试用例。
Web应用功能测试
主要用来测试Web应用软件是否履行了预期功能,包括内容测试、链接测试、表单测试、Cookies测试、设计语言测试、数据库测试等。
网页测试:内容测试、表单测试、链接测试、Cookies测试
网站测试:设计语言测试、数据库测试、特定功能测试
内容测试
内容测试用于检测Web应用系统提供信息的正确性、准确性和相关性。
- 正确性:信息是真实可靠的还是胡乱编造的。例如,一条虚假的新闻报道可能引起不良的社会影响,甚至会让公司陷入麻烦之中,也可能惹上法律方面的问题。
- 准确性:网页文字表述是否符合语法逻辑或者是否有拼写错误。在Web应用系统开发的过程中,开发人员可能不是特别注重文字表达,因此测试人员需要检查页面内容的文字表达是否恰当以及页面样式是否看起来更舒服。
- 相关性:能否在当前页面可以找到与当前浏览信息相关的信息列表或入口,也就是一般Web站点中所谓的“相关文章列表”。测试人员需要确定是否列出了相关内容的站点链接。
链接测试
链接使用户可以从一个页面浏览到另一个页面,是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。
需验证的问题
- 用户点击链接是否可以顺利地打开所要浏览的内容,即链接是否按照指示的那样确实链接到了要链接的页面。
- 所要链接的页面是否存在。实际上,好多不规范的小型站点,其内部链接都是空的,让用户感觉很差。
- 保证Web应用系统上没有孤立的页面,所谓孤立页面是指没有链接指向该页面,只有知道正确的URL地址才能访问。
表单测试
当用户给Web应用系统提交信息时,就需要使用表单操作。表单测试主要是模拟表单提交过程,检测其准确性,确保提交信息在整个过程中是正确的。
考虑的方面
- 表单提交应当模拟用户提交,验证是否完成功能。
- 测试提交操作的完整性,以校验提交给服务器的信息的正确性。
- 验证数据的正确性和异常情况的处理能力,注意是否符合易用性要求。
- 在测试表单时,会涉及到数据校验问题。如果根据给定规则需要对用户输入进行校验,需要保证这些校验功能正常工作。
Cookies测试
Cookies通常用来存储用户信息和用户在某些应用系统上的操作序列,当一个用户使用Cookies访问了某一应用时,Web服务器将发送有关用户信息,并把该信息以Cookies形式存储在客户端计算机上,可用来创建动态和自定义页面或者存储登录等信息。
特定功能测试
测试人员需要对Web网站特定的功能需求进行验证,需要强调的是应该从客户或用户的角度,而不是从产品本身呈现的进行评判。
数据库测试
在Web应用技术中,数据库起着很重要的作用,它为Web应用系统的管理、运行、查询和实现用户对数据存储的请求等提供空间。在Web应用中,最常用的数据库类型是关系型数据库,可以使用SQL对信息进行处理。
设计语言测试
Web设计语言版本的不同会引起客户端或服务器端比较严重的问题,例如使用哪种版本的HTML等。此外,使用Java、JavaScript、ActiveX、VBScript或Perl等开发的应用程序也要在不同的版本上进行验证。
兼容性测试
- 平台测试:市场上有很多不同的操作系统,常见的有Windows、Unix、Mac OS、Linux等,同一个应用可能在某些操作系统下能正常运行,但在另一些操作系统下可能会运行失败。
- 浏览器测试:浏览器是Web系统客户端最核心的软件,来自不同厂商的浏览器对Java、JavaScript、ActiveX、plug-ins或不同的HTML有不同的支持,并且有些 HTML 命令或脚本只能在某些特定的浏览器上运行。
- 分辨率测试:应检查页面版式在不同的分辨率模式下是否显示正常、字体大小是否合适于浏览、文本和图片是否对齐等。
- 打印机测试:用户可能会将网页打印下来,需要验证网页打印是否正常。有时在屏幕上显示的图片和文本的对齐方式可能与打印出来的东西不一样,测试人员至少需要验证订单确认页面打印是正常的。
14.4 软件性能测试
软件性能
一种非功能特性,它关注的不是软件是否能完成特定功能,而是完成功能时展示出的及时性、资源占用、稳定性、安全性、兼容性、可扩展性、可靠性等。
性能指标
用户数
- 注册用户数:所有在系统注册的用户数目
- 在线用户数:所有正在访问系统的用户(不一定做操作)数目
- 并发用户数:在某一给定时间内某特定时刻进行会话操作的用户数
响应时间
从客户端发出请求到获得响应的整个过程所经历的时间
吞吐量
吞吐量(Throughout)是指单位时间内系统处理的客户请求的数量,直接体现软件系统的性能承载能力。
从业务的角度,吞吐量可以用请求数/秒、页面数/秒、访问数/秒或处理业务数/小时等来衡量。
资源利用率
系统资源的使用程度,例如服务器CPU利用率、内存利用率、磁盘利用率、网络带宽利用率等。
一般由“资源实际使用/总的资源可用量”表示,如CPU利用率68%、内存利用率55%等。
性能测试
通过自动化测试工具或手段模拟多种正常、峰值以及异常负载条件对系统的各项性能指标进行的一种测试。
压力测试类型
- 稳定性压力测试:高负载下持续运行24小时以上。
- 破坏性压力测试:通过不断加载的手段快速造成系统崩溃,让问题尽快暴露出来。
- 渗入测试:通过长时间运行,使问题逐渐渗透出来,从而发现内存泄漏、垃圾收集或系统的其他问题,以检验系统的健壮性。
- 峰谷测试:采用高低突变加载方式进行,先加载到高水平的负载,然后急剧降低负载,稍微平息一段时间,再加载到高水平的负载,重复这样过程,容易发现问题的蛛丝马迹,最终找到问题的根源。
大数据量测试
- 独立数据量测试是对某些系统存储、传输、统计、查询等进行的大数据量测试。
- 综合数据量测试是系统在具备一定数据量时,在负载压力测试下考察业务是否能够正常进行的测试。
目标:测试数据量较大时系统的性能状况。
疲劳强度测试
采用系统稳定运行情况下,长时间运行系统的测试。
目标:通过综合分析交易执行指标和资源监控指标来测试系统长时间无故障稳定运行的能力。
性能测试策略
性能测试工具
HP LoadRunner是一种预测系统行为和性能的负载测试工具,它通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题。LoadRunner能够对整个企业的架构进行测试,通过使用该工具,企业能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。
JMeter是Apache组织开发的基于Java的压力测试工具,不仅用于Web服务器的性能测试,也涵盖数据库、FTP、LDAP服务器等各种性能测试,可与Junit、Ant等工具集成。它可以针对服务器、网络或其他被测试对象等大量并发负载进行强度测试,分析在不同压力负载下系统的整体性能。