第一章 引论
软件测试定义
使用人工或者自动的手段来运行或测定某个系统的过程,其目的在于检验它是否满足规定需求或是弄清预期结果和实际结果之间的差别。
为什么要进行软件测试:为了确保软件系统达到预期的质量、健壮性和可靠性,以满足用户或客户的需求,避免软件系统存在缺陷并减少故障率。
软件过程简单示意图
需求分析 ——> 设计——>编程——>测试——>维护
V模型
第二章 软件测试的基本概念
软件缺陷的定义
(1) 从产品内部看,软件缺陷是软件产品开发或维护过程中所存在的错误、毛病等各种问题。
(2) 从产品外部看,软件缺陷是系统所需要实现的某种功能的失效或违背。
修复软件缺陷的代价
问题越早发现越好,缺陷发现或解决得越迟,成本也就越高。代价不是简单的线性增长,而是呈指数型增长。
软件测试的分类
1.按测试层次分
底层测试:单元测试
接口层次:集成测试
系统层次:系统测试
用户层次:用户测试
2.按被测试的对象分
单元测试:
程序测试
系统测试
文档测试
Web应用测试、客户端测试
数据库测试、服务器测试
3.按测试阶段分
对于传统的软件测试流程,一般分为需求评审、设计评审、单元测试、集成测试、系统测试、验收测试、a测试、β测试等阶段。如果是敏捷测试流程,一般分为测试需求分析、迭代测试计划、持续的单元和系统测试、验收测试等。按阶段划分不一定科学,不同的测试流程则可能得到不一样的结果,如传统测试流程和敏捷测试流程就美别较大。
4.按测试目的分
功能测试、压力测试、性能测试、可靠性测试、灾难恢复性测试、兼容性测试、回归测试、安装测试
5.其它分类
静态测试与动态测试
黑盒测试与白盒测试
手工测试和自动化测试
静态测试与动态测试
区别:根据程序是否运行来区分。
静态测试:包括对软件产品的需求和设计规格说明书的评审、对程序代码的审查以及静态分析。
动态测试:
1.通过运行程序发现错误。
2.通过观察代码运行的过程,来观察系统行为、变量实时结果、内存、堆栈、线程、以及 > 测试覆盖度等方面的信息,来判断系统是否存在问题。
3.通过有效的测试用例,对应的输入输出关系来分析被测试程序的运行情况来发现缺陷。
主动测试与被动测试
主动测试:比较常见的测试方法,测试人员主动向被测对象发送请求、或者借助数据、事件驱动被测试对像的行为从 而验证被测试对象的反应或输出结果。
被动测试:软件产品运行在实际环境中,测试人员不干预产品的运行,而是被动的监控产品的运行,通过一定的被动机制来获取系统运行的数据,包括输入和输出数据。
区别:在主动测试中,测试人员需要设计测试用例、尽力输入各种数据,被动测试则不需要设计测试用例,只需要设法获取系统运行的各种数据,但是无法保证程序的完整性。在被动测试中,关键建立监控程序,并通过数据分析掌握系统的状态。
黑盒测试与白盒测试
黑盒测试:指在不考虑程序内部结构和实现细节的情况下,从用户的角度出发,通过输入测试数据或用户操作界面等方式对软件进行测试,以检查软件是否符合需求规格说明书。黑盒测试的目的是评估软件的功能性、易用性、性能等方面的质量特性,同时也可以发现软件中的缺陷和错误。
白盒测试:在了解程序内部结构和代码实现细节的基础上,通过分析代码逻辑、路径覆盖等方式对软件进行测试,以发现可能存在的错误和缺陷。白盒测试的目的是评估软件的正确性、可靠性、安全性等方面的质量特性,同时也可以帮助开发人员改进代码设计和编写质量,提高软件的可维护性和可扩展性。
区别:要在于它们的测试对象、测试方法和测试目的不同。
测试对象:
黑盒测试的测试对象是软件的外部行为,即从用户的角度出发,测试软件的功能性、易用性、> > 性能等方面的质量特性。而白盒测试的测试对象是软件的内部实现,即通过分析代码逻辑、路径覆 > 盖、数据流等方式,测试软件的正确性、可靠性、安全性等方面的质量特性。
测试方法:
黑盒测试的测试方法是在不考虑程序内部结构和实现细节的情况下,通过输入测试数据或用户 > 操作界面等方式对软件进行测试。而白盒测试的测试方法则是在了解程序内部结构和代码实现细节> > 的基础上,通过分析代码逻辑、路径覆盖等方式对软件进行测试。
测试目的:
黑盒测试的测试目的是评估软件的功能性、易用性、性能等方面的质量特性,同时也可以发现>> 软件中的缺陷和错误。而白盒测试的测试目的是评估软件的正确性、可靠性、安全性等方面的质量>> 特性,同时也可以帮助开发人员改进代码设计和编写质量,提高软件的可维护性和可扩展性。
软件测试级别
1.单元测试
在编码阶段,针对每个程序单元进行的测试,其测试的对象是程序系统中最小的单元——类、函数、模块或组件。
2.集成测试
又称组装测试、联合测试、子系统测试,在单元测试的基础上,按照设计要求对不断进行集成而进行相应的测试,目的在于发现单元间的接口问题。
3.系统测试
针对其系统的非功能性所进行的测试,目的是检验它能否与系统的其它部分协调工作。
4.验收测试
检验软件产品质量的最后一道工序。主要突出用户的作用,验证软件的功能和性能以及其它特性是否与用户要求的一致。
测试用例
定义:是指为了特定的测试目的而设计的测试条件、测试数据及与之相关的测试规程的一个特定的使用实例或场景。
测试用例的作用:
1.是测试人员在测试过程中重要的参考依据。
2.可以帮助实施有效的测试。
3.良好的测试用例不断地重复使用,使得测试过程事半功倍。
4.测试用例是一个知识累积的过程。
测试用例的设计流程:
1.制定测试用例设计的策略和思想,在测试计划中描述出来。
2.制定测试用例的框架,也就是测试用例的结构。
3.细化结构,逐步设计出具体的测试用例。
4.通过测试用例评审,不断优化测试用例。
优秀的测试工程师应该具备的素质
责任感、沟通能力、技术能力、自信心、耐心、怀疑精神、适度的好奇心、洞察力、反向思维和发散性思维、记忆力
第三章 软件测试方法
等价类划分法(可能考应用题)
概念:一种黑盒测试方法,旨在将各种可能的输入值划分为等效的类别,并从每个等效类别中选择一组代表性的测试数据进行测试,以减少测试工作量和提高测试效率
有效等价类
指输入完全满足程序输入的规格说明、有意义的输入数据所构成的集合
无效等价类
与有效等价类相反,即不满足程序输入要求或者无效的输入数据构成的集合。
解题步骤
1.用等价类划分法,建立输入等价类表,其中包括:
|输入条件|有效等价类|编号|无效等价类|编号|
2.根据划分的等价类,设计测试用例表,其中包括:
|测试用例编号|输入数据|期望输出|覆盖等价类|
边界值分析法(可能考应用题)
概念:在某个输入输出范围的边界上,验证某个系统功能是否正常运行的测试方法。通常与等价类划分法同时使用。
解题步骤
1.用等价类划分法,建立输入等价类表,其中包括:
|输入条件|有效等价类|编号|无效等价类|编号|
2.判断每个等价类所存在的边界值
3.设计测试用例表,其中包括
|测试用例编号|边界值选取|期望输出|覆盖等价类|
判定表法(可能考应用题)
概念:一种黑盒测试技术,通过建立判定表来表示系统的状态转移规则,并针对判定表中各个条件和动作列设计测试用例,以验证系统的正确性和完整性的。
判定表设计步骤:
1.列出所有的条件桩(C)和动作桩(E)。
2.确定规则数:条件取值个数 ^ 条件数。
3.填入条件项。
4.填入动作项,得到初始化判定表。
5.简化判定表。
因果图法(了解即可)
概念:一种黑盒测试技术,通过绘制因果图来分析系统的输入和输出之间的逻辑关系,以设计有效的测试用例。
Pair-wise方法(可能考应用题)
概念:是一种黑盒测试技术,它通过选择两个或多个输入参数的所有可能的组合来生成测试用例,以覆盖各种输入条件的情况,同时减少测试用例的数量,提高测试效率。
正交试验法(可能考应用题)
概念:是一种黑盒测试技术,它通过选择代表系统的关键因素和因素水平,并设计部分因素水平组合的方式来进行测试,以尽可能少的测试用例覆盖尽可能多的场景。
逻辑覆盖(一定考应用题)
判定覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖、基本路径覆盖 P67 第4题
语句覆盖:
选择足够多的测试用例,使得程序中每个语句至少都能被执行一次。
判定覆盖:
选择足够多的测试用例,使得程序中的每一个分支至少都执行一次。
条件覆盖:
执行足够多的测试用例,使得判定中的每个条件获得各种可能的结果。
判定条件覆盖:
既要满足判定覆盖,又要满足条件覆盖。
条件组合覆盖:
所有可能的条件取值组合至少执行一次。
基本路径覆盖
概念:设计足够的测试用例,覆盖程序中所有可能的路径。
基本结构:顺序、选择、循环
选择:嵌套型分支结构(n个判定语句,则有n+1个测试用例)、连锁型分支结构(n个判定语句,则有2^n个测试用例)
循环:
简单循环
连锁循环
嵌套循环
非结构循环
基本路径测试思路:
在程序控制流图的基础上,分析控制构造的环路复杂性,导出基本可执行路径集合,设计测试用例的方法。
环路复杂度:
V(G)= 区域数
V(G)= P + 1 (P:判定结点数)
独立路径:
a.至少报警有一条在其它独立路径中从未有过的边的路径。
b.从短到长。
基本路径测试法的操作步骤:
1.导出控制流图。
2.计算环路复杂度。
3.确定基本路径集。
4.生成测试用例。
第四章
W模型
基于脚本测试和探索式测试
基于脚本测试(ST):先设计脚本,之前也没有可执行的程序,这段时间先完成设计,一旦程序可以运行,就进行大规模测试。
探索式测试(ET):强调测试的学习、设计和执行同时展开,也就是没有测试用例,靠头脑想,一面想一面测试。
两者区别:两者最大的区别在于测试用例的设计方式和测试人员的角色。基于脚本测试侧重于测试用例的规范化和执行效率,而探索式测试则更注重测试人员的经验和发现能力。
第五章 单元测试与集成测试
单元测试
概念:在编码阶段,针对每个程序单元进行的测试,其测试的对象是程序系统中最小的单元——类、函数、模块或组件。
单元测试的主要任务:对单元功能、逻辑控制、数据和安全性等各方面进行必要的测试。
测试任务有:
1.单元独立执行路径的测试
2.单元局部数据结构的测试
3.单元接口测试
4.单元边界条件测试
5.单元容错性测试
6.内存分析
静态测试
编码的标准和规范
写代码的要求:可靠性、可读性和维护性、移植性。
代码审查
概念:是一种静态测试方法,指的是通过检查源代码中的错误、漏洞、安全问题和不良实践等缺陷,以提高代码质量和可维护性的过程。
作用:代码审查,不仅能够有效地发现缺陷,而且为缺陷预防获取各种经验,为改善代码质量,打下坚实的基础。
代码评审流程:
1.代码走查
2.正式会议审查
3.走查与会议审查的对比
4.缺陷检查表
动态测试
驱动程序和桩程序
驱动程序:也称驱动模块,用以模拟被测模块的上级模块,能够调用被测模块。
桩程序:也称桩模块,用以模拟被测模块工作过程中所调用的下层模块。
类测试
概念:一种黑盒测试技术,它侧重于测试软件系统中的类和对象。通过检查类接口、状态转换、和方法行为等因素,检测类是否满足预期的功能要求和性能指标。类测试可以通过手动或自动化测试进行实施,并可结合其他测试方法使用。
系统集成的模式与方法
集成测试的模式
概念:软件开发过程中的一个阶段,指的是将已经独立进行单元测试的模块或组件整合起来,在实际环境中进行测试。
分类:
(1)非渐增式测试模式:先分别测试每个模块,再把所有模块按设计要求放在一起结合成所要的程序,如大棒模式。
(2)渐增式测试模式:把下一个要测试的模块同已经测试好的模块结合起来进行测试,测试是在模块一个一个的扩展下进行,其测试范围逐步扩大。
自顶向下和自底向上集成方法
自顶向下法:
概念:从主模块(”主程序“)开始,沿着软件的控制层次向下移动,从而逐渐把各个模块集合起来。
优点:不需要测试驱动程序,能够在测试阶段的早期实现并验证系统的主要功能,而且能在早期发现上层模块的接口错误。
缺点:需要桩程序,可能遇到与此相联系的测试困难,低层关键模块中的错误发现较晚,而且用这种方法在早期不能充分展开人力。
自底向上法:
概念:测试从”原子“模块(即在软件结构最底层的模块)开始集成进行测试,并渐进性地不断加入高层功能。
优缺点:与自顶向下法刚好相反。
第六章 系统测试
系统集功能测试
功能测试概念:根据产品规格说明书,来检验被测的系统是否满足各方面功能的使用需求。
功能测试要求
功能测试的内容:界面、数据、操作、逻辑、接口等。
常见的功能测试类型:GUI测试、冒烟测试、回归测试。
非功能性测试:在软件测试过程中,测试不涉及到功能需求的软件特性,如性能、可靠性、安全性、易用性、可维护性等。它们是对软件的质量和性能指标进行验证和评估。
回归测试
定义:是指在软件项目中,开发人员在修改了软件的代码以修复已经发现的bug后,测试人员在需要重新测试前面已经测试过的内容,以确认此次修改没有引入新的错误。
目的:检查开发人员在修复已有bug时是否又导致了新的bug。
策略及方法:
- 选择性回归测试(Selective Regression Testing):根据变更的影响范围和相关风险,选择性地执行回归测试。通过分析变更的需求、设计和代码,确定需要重新执行的测试用例,以最大程度地覆盖受到影响的功能和模块。
- 测试套件维护(Test Suite Maintenance):建立和维护一个全面的测试套件,包含了系统的所有功能和相关的测试用例。当有变更发生时,根据变更的性质和影响,更新测试套件中的相关用例,并确保用例的正确性和有效性。
- 自动化回归测试(Automated Regression Testing):利用自动化测试工具和脚本执行回归测试。自动化回归测试可以提高测试的效率和准确性,特别是针对频繁变更的系统或需要大规模执行的测试用例。
- 回归测试优先级排序(Regression Test Prioritization):根据测试的重要性和变更的影响程度,对回归测试的用例进行优先级排序。高优先级的测试用例将首先执行,以尽早发现可能的问题,从而最大限度地减少对系统的影响。
- 回归测试环境管理(Regression Test Environment Management):确保回归测试所需的环境与生产环境一致。包括软件版本、硬件配置、数据库状态等。通过管理和维护回归测试环境的一致性,可以提高测试的可靠性和可重复性。
- 引入冒烟测试(Smoke Testing):在执行完整的回归测试之前,进行快速的冒烟测试,验证系统的基本功能是否正常。冒烟测试可以帮助筛选出显著的问题,节省回归测试的时间和资源。
- 定期执行回归测试(Regular Execution):建立回归测试的执行计划,根据项目的进度和变更的频率,定期执行回归测试。持续的回归测试可以帮助尽早发现和解决潜在的问题,确保系统的稳定性和可靠性。
性能测试
概念:一般在真实环境、特定负载条件下,通过工具模拟实际软件系统的运行及操作,同时监控性能各项指标,最后对测试结果进行分析来确定系统的性能状况,整个过程就是性能测试。
性能测试指标:
(1)请求响应时间
(2)事物响应时间
(3)数据吞吐量
系统负载及其模式
系统负载概念:可以看作”并发用户并发数量 + 思考时间 + 每次请求发送的数据量 + 负载模式“
负载模式:即加载方式,如一次加载方式,递增加载方式
压力测试
概念:也称强度测试或负载测试,模拟实际应用的软硬件环境以及用户使用过程中的系统负荷,长时间或者超大负荷地运行测试软件,来测试被测系统的性能、可靠性、稳定性等。
容量测试
概念:通过测试预先分析出反映软件系统应用特征的某项指标的极限值(如最大并发用户数、数据库记录数等),系统在其极限状态下没有出现任何软件故障或还能保持主要功能正常运行。
安全性测试
概念:旨在评估系统的安全性和抵御潜在安全威胁的能力。它是为了发现系统中的漏洞、弱点和潜在的安全风险而进行的测试。
安全性测试分类:
安全功能测试
安全漏洞测试
容错性测试
概念:主要是检查系统的容错能力,检查软件在异常条件下自身是否具有防护性的措施或者某种灾难性恢复的手段。首先就是要通过各种手段,让软件强制性地发生故障,然后验证系统是否能尽快恢复。
容错性测试的两个方面:
1.输入异常数据或进行异常操作,以检验系统的保护性。
2.灾难恢复性测试。通过各种手段,让软件强制性地发生故障,然后验证系统已保存的用户数据是否丢失、系统和数据是否能尽快恢复。
兼容性测试
包括软件兼容性、数据共享兼容性、硬件兼容性
可靠性测试
可靠性:产品在规定条件下和规定时间内完成规定功能的能力,它的概率度量称之为可靠度。
软件可靠性:软件在规定环境下和规定时间内完成规定功能的能力。
软件可靠性三要素:规定的时间、规定的环境条件、规定的功能
第七章 验收测试
概念:在软件产品完成了系统功能和非功能测试之后、软件产品发布之前所进行的软件测试活动,它是技术测试的最后一个阶段,也称交付测试。
步骤:
1.建立测试计划。
2.建立测试环境。
3.准备测试数据、执行测试用例、记录测试结果。
4.分析测试结果
α测试与β测试
α测试:
属于内部测试,简称“内测”,公司组织内部人员模拟各类用户对即将面市软件产品(α版本)进行测试,试图发现错误并纠正。
特点:尽可能逼真地模拟实际运行环境和用户对软件产品的操作并尽最大努力涵盖所有用户可能的操作方式。
β测试:
属于面向公众测试,简称“公测”,公司组织各方面的典型用户对该系统进行实际操作的测试,并要求用户报告情况、提出批评意见。
特点:测试的环境是不受开发方控制的,谁也不知道用户如何折磨软件,用户数量相对比较多,时间不集中。
产品规格说明书
概念:是基于需求的定义,详细描述将要开发出一个什么样的产品,包括产品的用途、有哪些功能、用户界面的表现形式及其交互特性等。