软件测试概述
- 格式:doc
- 大小:349.50 KB
- 文档页数:32
软件测试概述范文软件测试是在软件开发过程中,为了评估软件质量而进行的一系列活动。
它旨在发现并纠正与软件需求不一致、设计错误、编码错误和其他缺陷相关的问题。
软件测试的目标是找出软件中存在的问题,并确保软件在实际使用中能够达到预期的质量和可靠性。
软件测试的过程通常涉及以下几个阶段:1.测试计划:在软件测试开始之前,制定一个详细的测试计划是非常重要的。
测试计划包括测试的目标、测试的范围、测试的资源和时间等。
2.测试设计:在测试设计阶段,测试团队会设计测试用例来验证软件的各个方面。
测试用例是一组输入和预期输出的组合,用于测试软件的功能、性能和可靠性等。
3.测试执行:在测试执行阶段,测试团队将根据测试计划和设计的测试用例来执行测试。
测试人员将记录测试结果,包括发现的错误和测试通过的情况。
4.缺陷管理:在测试过程中,测试团队会发现软件中的缺陷。
这些缺陷将被记录、跟踪和报告给开发团队。
开发团队将修复这些缺陷,并重新进行测试来验证修复结果。
5.测试评估:测试评估是对测试活动进行评估和反馈的过程。
这包括评估测试的覆盖范围、测试的质量、测试的效率和测试工具的可用性等。
软件测试可以分为不同的类型和层次。
常见的测试类型包括:1.功能测试:验证软件的功能是否按照需求规格说明书中的要求工作。
2.性能测试:评估软件在不同负载下的性能,包括响应时间、吞吐量和并发用户数等。
3.安全测试:测试软件的安全性,确认软件是否容易受到攻击或数据泄露的风险。
4.兼容性测试:测试软件在不同操作系统、浏览器和设备上的兼容性。
5.回归测试:在对软件进行更改后,重新执行测试,以确保新的更改没有引入新的缺陷。
在软件测试中,还有一些常见的测试技术可以帮助测试人员更好地执行测试。
常见的测试技术包括:1.黑盒测试:根据软件需求规格说明书进行测试,不考虑软件的内部结构和实现细节。
2.白盒测试:根据软件的内部结构和实现细节进行测试。
3.灰盒测试:结合黑盒测试和白盒测试的特点,既考虑软件的功能需求,又关注软件的内部实现。
第一章:软件测试概述①软件缺陷定义:(1)软件未达到产品说明书中已经标明的功能;(2)软件出现了产品说明书中指明不会出现的错误;(3)软件未达到产品说明书中虽未指出但应当达到的目标;(4)软件功能超出了产品说明书中指明的范围;(5)软件测试人员认为软件难以理解、不易使用,或者最终用户认为该软件使用效果不良。
②软件缺陷的特征:•“看不到”——软件的特殊性决定了缺陷不易看到•“看到但是抓不到”——发现了缺陷,但不易找到问题发生的原因所在③软件缺陷产生原因:(1)软件产品说明书(需求)——56%(不专业—专业~~信息传递)(2)设计——27%(设计不规范)(3)编写代码——7%(4)其他——10%(软、硬件设备之间的配备问题)④软件测试发展历程:早期―→测试1957年―→为了确信自己的产品20世纪70年代―→Glenford Myers 《软件测试艺术》——“测试是为发现错误而执行一个程序或系统的过程”20世纪80年代早期―→软件质量、Bill Hetzel 《软件测试完全指南》——“测试是以评价一个程序或者系统属性为目标的任何一种活动。
测试是对软件质量的度量”20世纪90年代―→测试工具盛行2002年―→Rick和Stefan《系统的软件测试》——“测试是为了度量和提高被测软件的质量,对测试件进行工程设计、实施和维护的整个生命周期过程”⑤今天的软件测试面临的挑战:•软件在国防现代化、社会信息化和国民经济信息化中的作用越来越重要,由此产生的测试任务越来越繁重•软件规模越来越大,功能越来越复杂,如何进行充分而有效的测试成为难题•面向对象的开发技术越来越普及,但是面向对象的测试技术却刚刚起步•对于分布式系统整体性能还不能进行很好的测试•对于实时系统来说,缺乏有效的测试手段•随着安全问题的日益突出,信息系统的安全性如何进行有效的测试与评估,成为世界性难题⑥软件开发与软件测试的关系:•测试与开发各阶段的关系项目规划阶段,需求分析阶段,详细设计和概要设计阶段,编码阶段,测试阶段(软件开发生命周期)•测试与开发的并行性⑦软件测试的发展趋势:•测试工作将进一步前移。
软件测试各章知识点总结第一章:软件测试概述软件测试是指为了发现软件中的错误和问题,评估软件质量,确保软件功能正常的过程。
软件测试的目的是验证软件是否符合用户的需求和期望,以及确保软件的质量达到一定的标准。
软件测试在整个软件开发过程中起着非常重要的作用,它能够帮助开发团队及时发现和修复问题,提高软件的稳定性和可靠性。
软件测试的基本原则包括全面性、系统性、可靠性和性能。
全面性指测试应该覆盖所有可能的情况,包括正常情况和异常情况;系统性指测试应该以系统为单位进行,而不是单个模块或功能;可靠性指测试结果应该是可靠的、准确的;性能指测试应该关注软件的性能表现。
软件测试的方法可以分为静态测试和动态测试。
静态测试是指在软件开发的早期阶段进行的,包括代码审查、设计审查和使用静态分析工具进行分析。
动态测试是指在软件开发的后期阶段进行的,包括单元测试、集成测试、系统测试和验收测试。
软件测试的类型包括功能测试、性能测试、安全测试、兼容性测试、可靠性测试等。
功能测试是验证软件功能是否符合用户需求的测试;性能测试是验证软件在各种条件下的性能表现的测试;安全测试是验证软件的安全性和可靠性的测试;兼容性测试是验证软件在不同平台和环境下的兼容性的测试;可靠性测试是验证软件的稳定性和可靠性的测试。
第二章:软件测试流程软件测试的流程包括测试计划、测试设计、测试执行、测试评估和测试报告。
测试计划是在测试开始之前进行的,包括确定测试目标、测试方法、测试资源和测试进度。
测试设计是在测试执行之前进行的,包括确定测试用例、测试数据和测试环境。
测试执行是在测试设计之后进行的,包括执行测试用例、记录测试结果和发现问题。
测试评估是在测试执行之后进行的,包括评估测试结果、计算测试覆盖率和分析测试效果。
测试报告是在测试评估之后进行的,包括总结测试结果、提出改进建议和撰写测试报告。
软件测试的自动化是指利用自动化测试工具进行软件测试的过程。
自动化测试包括测试脚本的编写、测试数据的准备和测试环境的配置。
软件测试技术手册及规范第一章软件测试基础 (3)1.1 软件测试概述 (3)1.2 软件测试目的与原则 (3)1.2.1 软件测试目的 (3)1.2.2 软件测试原则 (3)1.3 软件测试分类 (3)第二章测试用例设计 (4)2.1 测试用例概述 (4)2.2 测试用例设计方法 (4)2.2.1 等价类划分法 (4)2.2.2 边界值分析 (4)2.2.3 错误推测法 (5)2.2.4 因果图法 (5)2.2.5 正交分析法 (5)2.3 测试用例管理 (5)3.1 测试用例的创建 (5)3.2 测试用例的维护 (5)3.3 测试用例的执行 (5)3.4 测试用例的跟踪 (5)3.5 测试用例的评估 (6)第三章功能测试 (6)3.1 功能测试概述 (6)3.2 功能测试方法 (6)3.3 功能测试工具 (7)第四章功能测试 (7)4.1 功能测试概述 (7)4.2 功能测试指标 (7)4.3 功能测试工具 (8)第五章自动化测试 (9)5.1 自动化测试概述 (9)5.2 自动化测试工具 (9)5.3 自动化测试框架 (9)第六章安全测试 (10)6.1 安全测试概述 (10)6.2 安全测试方法 (10)6.2.1 动态应用安全测试(DAST) (11)6.2.2 静态应用安全测试(SAST) (11)6.2.3 交互式应用安全测试(IAST) (11)6.3 安全测试工具 (11)6.3.1 动态应用安全测试工具 (11)6.3.2 静态应用安全测试工具 (11)6.3.3 交互式应用安全测试工具 (12)第七章兼容性测试 (12)7.1 兼容性测试概述 (12)7.2 兼容性测试方法 (12)7.3 兼容性测试工具 (13)第八章稳定性与回归测试 (13)8.1 稳定性与回归测试概述 (13)8.2 稳定性与回归测试方法 (13)8.2.1 稳定性测试 (13)8.2.2 回归测试 (14)8.3 稳定性与回归测试工具 (14)第九章测试管理 (15)9.1 测试管理概述 (15)9.2 测试计划与管理 (15)9.3 测试团队管理 (15)第十章缺陷管理 (16)10.1 缺陷管理概述 (16)10.1.1 缺陷的定义 (16)10.1.2 缺陷管理的目的 (16)10.1.3 缺陷管理的内容 (16)10.2 缺陷跟踪与管理 (16)10.2.1 缺陷记录 (17)10.2.2 缺陷跟踪 (17)10.2.3 缺陷统计与分析 (17)10.3 缺陷分析 (17)第十一章测试文档与报告 (18)11.1 测试文档概述 (18)11.1.1 测试文档的定义 (18)11.1.2 测试文档的分类 (18)11.1.3 测试文档的作用 (18)11.2 测试报告撰写 (18)11.2.1 测试报告的定义 (18)11.2.2 测试报告的结构 (18)11.2.3 测试报告撰写要点 (19)11.3 测试报告评审 (19)11.3.1 测试报告评审的目的 (19)11.3.2 测试报告评审的内容 (19)11.3.3 测试报告评审流程 (19)第十二章测试流程与规范 (20)12.1 测试流程概述 (20)12.2 测试流程优化 (20)12.3 测试规范制定与执行 (21)第一章软件测试基础1.1 软件测试概述软件测试是软件开发过程中不可或缺的一个重要环节,它旨在保证软件产品在实际运行过程中能够满足用户的需求,提高软件质量,降低软件缺陷带来的风险。
第1章 软件测试概述软件测试(Software Testing)是信息系统开发中不可缺少的一个重要步骤,随着软件变得日益复杂,软件测试也变得越来越重要。
软件的基础知识、软件测试的概念(方法、目标和任务)、软件测试的定义是软件测试的基础。
本章重点讨论以下内容:● 软件的相关知识概述 ;● 软件测试的相关知识概述 ;● 测试的目的和原则;● 软件测试的流程 ;● 软件测试人员的要求 ;● 软件测试的前景 。
1.1 软件的相关知识概述做任何事,应从概念入手,才能少走弯路,才能对此概念相关的问题有一个正确的理解分析,最终解决问题。
软件测试的对象就是软件,为了进行软件测试,我们应了解什么是软件?它的内容以及生命周期?1.1.1 软件的定义1. 软件是计算机系统中与硬件相互依存的一部分,它是包括程序、数据及其相关文档的完整集合。
其中,程序是按事先设计的功能和性能要求执行的指令序列;数据是使程序能正常操纵信息的数据结构;文档是与程序开发,维护和使用有关的图文材料。
软件具有8个特点:(1) 软件是一种逻辑实体,而不是具体的物理实体。
因而它具有抽象性。
(2) 软件的生产与硬件不同,它没有明显的制造过程。
对软件的质量控制,必须着重在软件开发方面下功夫。
(3) 在软件的运行和使用期间,没有硬件那样的机械磨损,老化问题。
然而它存在退化问题,必须要对其进行多次的修改与维护。
(4) 软件的开发和运行常常受到计算机系统的制约,对计算机系统有着不同程度的依赖性。
为了解除这种依赖性,在软件开发中提出了软件移植的问题。
(5) 软件的开发至今尚未完全摆脱手工艺的开发方式。
(6) 软件本身是复杂的。
软件的复杂性可能来自它所反映的实际问题的复杂性,也可能来自程序逻辑结构的复杂性。
(7) 软件成本相当昂贵。
软件的研制工作需要投入大量的、复杂的、高强度的脑力劳动,它的成本是比较高的。
(8) 相当多的软件工作涉及到社会因素。
许多软件的开发和运行涉及机构、体制及管理方式等问题,它直接影响到项目的成败。
《软件测试教案》课件第一章:软件测试概述1.1 软件测试的定义解释软件测试的目的和重要性强调测试在软件开发生命周期中的位置1.2 软件测试类型介绍不同类型的软件测试,如单元测试、集成测试、系统测试、验收测试等解释每种测试类型的目的和适用场景1.3 软件测试原则介绍软件测试的基本原则,如测试应尽早和频繁进行、测试用例应覆盖各种情况等解释这些原则的重要性第二章:测试用例设计2.1 测试用例的概念解释测试用例的定义和组成,包括输入数据、操作步骤和预期结果强调测试用例的重要性和编写要求2.2 测试用例设计方法介绍常用的测试用例设计方法,如等价类划分、边界值分析、决策表等解释每种方法的原理和应用场景2.3 测试用例编写实践提供编写测试用例的实例和技巧强调测试用例的清晰性和可维护性第三章:测试执行和管理3.1 测试执行流程介绍测试执行的流程,包括测试计划的制定、测试用例的选择等强调测试执行的规范性和可跟踪性3.2 测试工具的使用介绍常用的测试工具,如缺陷跟踪工具、自动化测试工具等解释如何选择合适的测试工具3.3 测试管理介绍测试管理的概念和方法,如测试计划的制定、测试进度的监控等强调测试管理的重要性第四章:缺陷管理4.1 缺陷的概念解释缺陷的定义和描述强调缺陷的重要性和记录要求4.2 缺陷生命周期介绍缺陷生命周期的各个阶段,如发现、报告、修复、验证等强调缺陷管理的流程和责任4.3 缺陷统计和分析介绍缺陷统计和分析的方法和工具强调缺陷统计和分析对软件质量改进的作用第五章:测试自动化5.1 测试自动化的概念解释测试自动化的定义和目的强调测试自动化的优势和应用场景5.2 自动化测试工具介绍常用的自动化测试工具,如Selenium、JMeter等解释如何选择合适的自动化测试工具5.3 自动化测试实践提供自动化测试的实例和实践技巧强调自动化测试的可持续性和效率第六章:性能测试6.1 性能测试概述解释性能测试的目的和重要性强调性能测试在软件质量保证中的作用6.2 性能测试类型介绍不同类型的性能测试,如负载测试、压力测试、并发测试等解释每种测试类型的目的和适用场景6.3 性能测试工具介绍常用的性能测试工具,如JMeter、LoadRunner等解释如何选择合适的性能测试工具第七章:安全测试7.1 安全测试概述解释安全测试的目的和重要性强调安全测试在保护软件免受攻击中的作用7.2 安全测试类型介绍不同类型的安全测试,如漏洞扫描、渗透测试、安全代码审查等解释每种测试类型的目的和适用场景7.3 安全测试实践提供安全测试的实例和实践技巧强调安全测试的持续性和预防性第八章:移动应用测试8.1 移动应用测试概述解释移动应用测试的目的和重要性强调移动应用测试在移动设备上的特殊性8.2 移动应用测试类型介绍不同类型的移动应用测试,如功能测试、性能测试、兼容性测试等解释每种测试类型的目的和适用场景8.3 移动应用测试工具介绍常用的移动应用测试工具,如Appium、Robot Framework等解释如何选择合适的移动应用测试工具第九章:测试环境和数据管理9.1 测试环境概述解释测试环境的概念和重要性强调测试环境对于软件测试的必要性9.2 测试环境搭建和管理介绍搭建和管理测试环境的方法和最佳实践强调测试环境的一致性和可重复性9.3 测试数据管理解释测试数据的概念和重要性介绍测试数据的管理方法和工具第十章:软件测试趋势和未来发展10.1 软件测试趋势讨论当前软件测试领域的趋势,如在测试中的应用、DevOps测试等强调测试人员需要适应新技术的重要性10.2 软件测试未来发展探讨软件测试的未来发展方向,如自动化测试的进一步发展、测试人员的角色变化等强调软件测试在软件开发中的持续重要性重点和难点解析重点环节一:软件测试的定义及在软件开发生命周期中的位置需要重点关注软件测试的目的和重要性,以及它在软件开发生命周期中的具体位置。
软件测试的概述及方法软件测试是一种广泛使用的技术,用于确保软件系统能够正常、可靠地工作。
它是软件开发过程中的关键环节,旨在检测和纠正代码中的错误及缺陷。
本文将围绕软件测试的概述及其方法进行阐述。
一、软件测试的概述软件测试是用于发现软件缺陷、有问题和风险的一系列操作和过程。
它涉及软件系统的功能、性能、安全等方面,并通过比较其期望行为与实际行为之间的差异来确定软件的质量。
软件测试的目的:确保软件能够满足用户的需求,符合预期的标准和质量要求,并在预定的时间内完成实现。
在实际操作中,软件测试应该是一个早期的过程,以确保前期或中期检测出缺陷,而避免找错过程过于复杂,增加成本和事故风险的发生。
二、软件测试的方法在软件测试中,有很多种不同的测试方法,我们可以根据测试的需求,对其进行不同的选择。
1.白盒测试白盒测试被称为结构性测试,它基于对系统内部工作原理的了解来确定测试案例。
这种方法从程序内部检查代码的行为,可以检测出代码的具体执行过程,从而发现错误。
白盒测试的优点:利用测试人员的技能、知识和经验,全面地检查软件系统的各个部分,并为开发人员提供更好的代码强化点。
2.黑盒测试黑盒测试基于应用程序的外部功能和行为进行测试,而不需要了解其内部实现。
这种方法可以有效地检测系统在已知输入下产生的输出是否与预期相同。
黑盒测试的优点:不需要具备特殊的技术和知识,任何人都能进行测试,并可帮助测试人员从用户的角度测试软件系统。
3.灰盒测试灰盒测试结合了白盒和黑盒测试。
它通过了解系统内部和外部行为,以及用户的期望来确定测试用例。
灰盒测试的优点:综合了白盒和黑盒测试的优点,可以帮助测试人员检查系统的具体功能和内部实现。
4.自动化测试自动化测试基于脚本编写,可以快速、准确地执行测试用例。
当软件变更时,所有相关的测试用例都将自动运行,并从中产生结果数据。
自动化测试有利于提高生产率和软件质量,以及减少测试周期。
5.手动测试手动测试是测试人员通过实际操作软件来确定软件的功能、性能和易用性等。
软件测试概述信息技术的飞速发展,使软件产品应用到社会的各个领域,软件产品的质量自然成为人们共同关注的焦点。
不论软件的生产者还是软件的使用者,均生存在竞争的环境中,软件开发商为了占有市场,必须把产品质量作为企业的重要目标之一,以免在激烈的竞争中被淘汰出局。
用户为了保证自己业务的顺利完成,当然希望选用优质的软件。
质量不佳的软件产品不仅会使开发商的维护费用和用户的使用成本大幅增加,还可能产生其他的责任风险,造成公司信誉下降,继而冲击股票市场。
在一些关键应用(如民航订票系统、银行结算系统、证券交易系统、自动飞行控制软件、军事防御和核电站安全控制系统等) 中使用质量有问题的软件,还可能造成灾难性的后果。
软件危机曾经是软件界甚至整个计算机界最热门的话题。
为了解决这场危机,软件从业人员、专家和学者做出了大量的努力。
现在人们已经逐步认识到所谓的软件危机实际上仅是一种状况,那就是软件中有错误,正是这些错误导致了软件开发在成本、进度和质量上的失控。
有错是软件的属性,而且是无法改变的,因为软件是由人来完成的,所有由人做的工作都不会是完美无缺的。
问题在于我们如何去避免错误的产生和消除已经产生的错误,使程序中的错误密度达到尽可能低的程度。
给软件带来错误的原因很多,具体地说,主要有如下几点:①、交流不够、交流上有误解或者根本不进行交流在应用应该做什么或不应该做什么的细节(应用的需求)不清晰的情况下进行开发。
②、软件复杂性图形用户界面(GUI),客户/服务器结构,分布式应用,数据通信,超大型关系型数据库以及庞大的系统规模,使得软件及系统的复杂性呈指数增长,没有现代软件开发经验的人很难理解它。
③、程序设计错误象所有的人一样,程序员也会出错。
④、需求变化需求变化的影响是多方面的,客户可能不了解需求变化带来的影响,也可能知道但又不得不那么做。
需求变化的后果可能是造成系统的重新设计,设计人员的日程的重新安排,已经完成的工作可能要重做或者完全抛弃,对其他项目产生影响,硬件需求可能要因此改变,等等。
如果有许多小的改变或者一次大的变化,项目各部分之间已知或未知的依赖性可能会相互影响而导致更多问题的出现,需求改变带来的复杂性可能导致错误,还可能影响工程参与者的积极性。
⑤、时间压力软件项目的日程表很难做到准确,很多时候需要预计和猜测。
当最终期限迫近和关键时刻到来之际,错误也就跟着来了。
⑥、自负人更喜欢说:'没问题''这事情很容易''几个小时我就能拿出来'太多不切实际的‘没问题’,结果只能是引入错误。
⑦、代码文档贫乏贫乏或者差劲的文档使得代码维护和修改变的异常艰辛,其结果是带来许多错误。
事实上,在许多机构并不鼓励其程序员为代码编写文档,也不鼓励程序员将代码写得清晰和容易理解,相反他们认为少写文档可以更快的进行编码,无法理解的代码更易于工作的保密(“写得艰难必定读的痛苦”)。
⑧、软件开发工具可视化工具,类库,编译器,脚本工具,等等,它们常常会将自身的错误带到应用软件中。
就象我们所知道的,没有良好的工程化作为基础,使用面向对象的技术只会使项目变得更复杂。
为了更好地解决这些问题,软件界做出了各种各样的努力。
人们曾经认为更好的程序语言可以使我们摆脱这些困扰,这推动了程序设计语言的发展,更多的语言开始流行,为了使程序更易于理解开发了结构化程序设计语言,如PL/1,PASCAL等;为了解决实时多任务需求开发了结构化多任务程序设计语言,如Modula,Ada等;为了提高重用性开发了面向对象的程序设计语言,如Simlasa等;为了避免产生不正确的需求理解,开发形式化描述语言,如HAL/S 等,这使得建立基于自然语言的描述成为可能,人们以形式化语言来描述需求;为了支持大型数据库应用,开发了可视化工具,如Visual Studio、Power Builder 等。
程序语言对提高软件生产效率起到了一定的积极作用,但它对整个软件质量尤其是可靠性的影响,与其他因素相比作用较小。
可能是因为程序语言基于严格的语法和语义规则,人们企图用形式化证明方法来证明程序的正确性。
将程序当作数学对象来看待,从数学意义上证明程序是正确的是可能的。
数学家对形式化证明方法最有兴趣,在论文上谈起来非常吸引人,但实际价值却非常有限,因为形式化证明方法只有在代码写出来之后才能使用,这显然太迟了,而且对于大的程序证明起来非常困难。
受到其他行业项目工程化的启发,软件工程学出现了,软件开发被视为一项工程,以工程化的方法来进行规划和管理软件的开发。
在可以借助许多新的技术和工具进行软件开发的今天,软件开发过程的成熟性问题开始引起人们的重视。
这种产品一致性问题的主要症结在于管理,因此人们将目标转向了管理的改善,一些以改进软件开发过程为目标的活动已经展示出积极的结果。
不论采用什么技术和什么方法,软件中仍然会有错。
采用新的语言、先进的开发方式、完善的开发过程,可以减少错误的引入,但是不可能完全杜绝软件中的错误,这些引入的错误需要测试来找出,软件中的错误密度也需要测试来进行估计。
测试是所有工程学科的基本组成单元,是软件开发的重要部分。
自有程序设计的那天起测试就一直伴随着。
统计表明,在典型的软件开发项目中,软件测试工作量往往占软件开发总工作量的40%以上。
而在软件开发的总成本中,用在测试上的开销要占30%到50%。
如果把维护阶段也考虑在内,讨论整个软件生存期时,测试的成本比例也许会有所降低,但实际上维护工作相当于二次开发,乃至多次开发,其中必定还包含有许多测试工作。
因此,测试对于软件生产来说是必需的,问题是我们应该思考“采用什么方法、如何安排测试?”第一节测试的基本概念一、目的与任务G.J.Myers在他的名著《软件测试技巧》一书中,给出了测试的定义:“程序测试是为了发现错误而执行程序的过程”。
根据这一定义,测试(Testing)的目的与任务可以描述为:目的:发现程序的错误;任务:通过在计算机上执行程序,暴露程序中潜在的错误。
另一个与测试有关的术语叫纠错(Debugging)。
它的目的与任务可以规定为:目的:定位和纠正错误;任务:消除软件故障,保证程序的可靠运行。
测试与纠错的关系,可以用图7.1的数据流图来说明。
图中表明,每一次测试都要准备好若干必要的测试数据,与被测试程序一道送入计算机执行。
通常把程序执行需要的测试数据,称为一个“测试用例(Testing Case)”。
每一个测试用例产生一个相应的“测试结果”。
如果它与“期望结果”不相符合,便说明程序中存在错误,需要用纠错来改正。
图7.1对于长度仅有数百行的小程序,测试与纠错一般由编码者一人完成;但对于大型的程序,测试与纠错必须分开进行。
为了保证大程序的测试不受干扰,通常都把它交给独立的小组进行,等发现了程序有错误,再退回编码者进行纠错。
有人把小程序得测试和纠错合称为“调试”。
一旦编好了一个小程序,先拿到机器上测试,发现错误便进行纠错,修改后再重复测试。
这一交替进行的“测试-纠错-再测试-再纠错”的过程,常被通俗的称为“调试程序”。
其实“调试”在英语中并无相当的词,但纠错时有一种常用的工具叫“Debugger”,通常被称为调试程序,而不译为纠错程序。
二、测试的特性与分析、设计、编码等工作相比,程序测试具有若干特殊的性质。
了解这些性质,将有助于我们正确处理和做好测试工作。
1、挑剔性测试时对质量的监督与保证,所以“挑剔”和“揭短”很自然的成为测试人员奉行的信条。
测试是为了证明程序有错,而不是证明程序无错。
因此,对于被测程序就是要“吹毛求疵”,就是要在“鸡蛋里面挑骨头”。
只有抱着为证明程序有错的目的去测试,才能把程序中潜在的大部分错误找出来。
2、复杂性人们常常以为开发一个程序是困难的,测试一个程序则是比较容易的,这其实是误解。
设计测试用例是一项需要细致和高度技巧的工作,稍有不慎就会顾此失彼,发生不应有的疏漏。
举一个极简单的例子。
假如一个程序的功能是输入3个数作为三角形的3条边,然后鉴别这一三角形的类别。
输入3个”5”时程序回答“等边三角形”,但若输入3个“0”程序也回答“等边三角形”,就真假不分了。
又如,三条便分别为2、3、4时应判断是“不等边三角形”,但如果对2、3、5或2、3、6也判断为“不等边三角形”,也会闹笑话。
可见在设计测试用例时,需要考虑到各种可能出现的情况,对被测程序进行多方面的考核。
切忌挂一漏万,把原本复杂的问题想的过于简单。
小程序尚且如此,大型程序就可想而知了。
所以有人认为,搞好一个大型程序的测试,其复杂性不亚于对这个程序的开发,主张挑选最有才华的程序员来参加测试工作。
3、不彻底性“程序测试只能证明错误的存在,但不能证明错误不存在”。
这句话揭示了测试所固有的一个重要性质――不彻底性。
可能有人认为,测一遍不彻底可以测十遍,十遍不彻底可以测百遍。
需要多少测试用例就用多少测试用例,难道还怕达不到彻底吗?为了回答这个问题,举一个例子。
假如有人开发了一个C语言的编译程序,要对它进行彻底的测试,需要设计多少个测试用例呢?从正面说,该编译程序应能把一切符合语法的C程序正确的翻译为目标程序;从反面说,它应能对一切有语法错误的C程序指出程序的语法。
显然,这两个“一切都是无穷量”,十无法实现的。
所谓彻底测试就是让被测程序在一切可能的输入情况下全部执行一遍。
通常称这种测试为“穷举测试(Exhaustive Testing)”。
实际测试中,穷举测试要不是像上例那样根本无法实现,就是工作量太大(例如一个小程序要连续测试许多年),在实践上行不通。
这就注定了一切实际测试都是不彻底的,当然也就不能保证测试后的程序不存在遗留的错误。
4、经济性既然穷举测试行不通,所以在程序测试中,总是选择一些典型的、有代表性的测试用例,进行有限的测试。
通常把这种测试称为“选择测试(Selective Testing)”,为了降低测试成本(一般占整个开发成本的1/3左右),选择测试用例时应注意遵守“经济性”的原则。
所以,第一,要根据程序的重要性和一旦发生故障将造成的损失开确定它的可靠性等级,不要随意提高等级,从而增加测试的成本;第二,要认真研究测试策略,以便能使用尽可能少的测试用例,发现尽可能多的程序错误。
三、测试的种类静态分析器分析(自动方式)静态分析代码评审走查(程序不执行)办公桌检查程序(人工方式)测试黑盒测试(测试程序功能)动态测试(程序执行)白盒测试(测试程序结构)图7.2测试是一个执行程序的过程,即要求被测程序在机器上运行。
其实,不执行程序也可以发现程序的错误。
为便于区分,一般把前者称为“动态测试”,后者称为“静态分析(Static Analysis)”。
广义的说,它们都属于程序测试,详见图7.2顾名思义,静态分析就是通过对被测程序的静态审查,发现代码中潜在的错误。