--- slide1.xml --- 软件测试方法和技术 同济大学 朱少民 课程介绍 版权所有 ©️ 仅限于教学使用 --- slide2.xml --- 软件测试全景图 --- slide3.xml --- 系统地理解软件测试 缺陷 指导 测试 软件 阶段 管理 思想 质量 测试用例 方法 目标 源泉 确定 寻求 设计 发现 实施 清除 --- slide4.xml --- 从就业市场看软件测试 --- slide5.xml --- 在敏捷时代,如何看待软件测试? 敏捷开发模式中,提倡整个团队对质量、对测试负责 开发与测试越来越融合,如微软测试人员转型 持续交付倒逼持续测试,但测试最容易成为瓶颈 测试左移、测试前移,让开发做更多的测试 测试驱动开发( TDD ):测试在前、开发在后 --- slide6.xml --- 如何借助这门课培养学生的分析问题和解决问题的能力? 强调分析能力, 如 测试分析是基础 批判性思维,如探索式测试 工程思维,如找到不同的解决方案,从中选出最优的解决方案 --- slide7.xml --- 如何通过实验教学培养学生的实际能力? 软件测试是一门实践性很强的课程 “ 做中学 ” 问题驱动教学与实验 实验就是分析问题、解决问题的过程 --- slide8.xml --- 《 软件测试方法和技术 》 2005 年出版,现在是第 4 版,十一五、十二五国家级规划教材,上海市普通高校优秀教材 300+ 所大学使用,销量超过 20 万册,过去连续三年获得清华大学出版社畅销书奖 本书共分三篇:软件测试的原理与方法、 软件测试 技术和 软件测试项目 实践 --- slide9.xml --- 第 1 篇 软件测试的原理与方法 第 1 章 引论 第 2 章 软件测试的基本概念 第 3 章 软件测试方法 第 4 章 软件测试流程和规范 --- slide10.xml --- 软件测试方法和技术 同济大学 朱少民 第 1 章 引论 版权所有 ©️ 仅限于教学使用 --- slide11.xml --- 1.1 软件测试的必要性 1.2 为什么要进行软件测试 ? 1.3 什么是软件测试 ? 1.4 测试和质量保证的关系 1.5 测试和开发的关系 1.6 测试驱动开发的思想 --- slide12.xml --- 1.1 软件测试的必要性 版权所有 ©️ 仅限于教学使用 --- slide13.xml --- 迪斯尼并不总是带来笑声 1994 年圣诞节前夕,迪斯尼公司发布了第一个面向儿童的多媒体光盘游戏“狮子王童话” 圣诞节后的第一天,迪斯尼客户支持部电话开始响个不停,不断有人咨询、抱怨为什么游戏总是安装不成功,或没法正常使用 这个游戏软件只能在少数系统中正常运行 兼容性问题 --- slide14.xml --- 一个缺陷造成了数亿美元损失 ( 4195835 / 3145727 ) × 3145727- 4195835 = ? 最后 Intel 公司付出很大代价,回收 CPU ,造成 4 亿美元损失 浮点计算问题 --- slide15.xml --- 火星探测飞船坠毁 机械震动在大多数情况下也会触发着地开关,设置错误的数据位。设想飞船开始着陆时,计算机极有可能关闭推进器,而火星登陆飞船下坠 1800 米之后没有反推进器的帮助,冲向地面,必然会撞成碎片 两个小组本身的工作都没什么问题,就是没有合在一起测试,其接口没有被测,而问题就在这里 集成测试不足 --- slide16.xml --- 软件测试走了捷径导致灾难再次发生 波音 公司测试载人飞船星际客机软件系统的程序存在严重缺陷,现在计划对测试程序进行修改。造成程序存在严重缺陷的主要原因就是软件测试走了捷径:该公司缩短了对该飞行器软件的一次关键测试,他们将整个飞行过程分成了几个小单元分别进行测试,但最后却没有做完整的、端到端的集成测试,即没有进行时长为 25 个小时的整体测试。 集成测试不足 --- slide17.xml --- 错误指令造成骑士资本集团损失 4.4 亿美元 2012 年 8 月 1 日上午 9 点,纽约证券交易所开盘交易,骑士资本的第一位散户投资者发出了买卖其投资头寸的指令。仅仅 45 分钟后,骑士资本的服务器就执行了 400 万笔交易,使公司损失了 4.6 亿美元,濒临破产 …… 功能容错性问题 --- slide18.xml --- AWS 宕机整整 4 个小时 2017 年 3 月 2 号, 亚马逊云( Amazon S3 Cloud )出现严重的宕机(中断服务)!亚马逊云之前也出现过宕机,但一般在一个小时之内解决问题,而这次非常严重,宕机整整四个小时 性能、稳定性问题 --- slide19.xml --- Uber 泄漏个人隐私,导致用户要求赔偿 3 亿多元 2017 年 2 月,根据据法国费加罗报报道,一名法国商人起诉 Uber ,要求该公司赔偿 4500 万欧元(按当时汇率 7.4 计算,合计人民币 3.33 亿),以弥补隐私漏洞对自己婚姻造成的伤害,其理由是 Uber 专车 app 中存在这样的安全性漏洞 安全性:隐私保护问题 --- slide20.xml --- 预定的酒店住不进去、露宿街头 正值 2019 年国庆假期出行高峰期,通过某知名旅行网预定酒店的不少网友却遭遇“人在囧途” —— 到达酒店却无法入住,已支付的订单却显示未支付或订单不存在;与此同时,客服电话打不通,想退房也退不掉,有些旅客想重新预定,在这样的出行高峰期,又很难订到房 --- slide21.xml --- 更多的悲剧 放射性治疗仪 Therac-25 中的软件存在缺陷,导致几个癌症病人受到非常严重的过量放射性治疗,其中 4 个人因此死亡 当爱国者导弹防御系统的时钟累计运行超过 14 小时后,系统的跟踪系统就不准确。从而导致拦截伊拉克飞毛腿导弹的几次失败,其中一枚在沙特阿拉伯的多哈爆炸的飞毛腿导弹造成 28 名美国士兵死亡 …… --- slide22.xml --- 1.2 为什么要进行 软件测试? --- slide23.xml --- 为什么要进行软件测试 ? 答案很简单,就是为了保证软件质量 软件总存在缺陷。只有通过测试,才可以发现软件缺陷。也只有发现了缺陷,才可以将软件缺陷从软件产品或软件系统中清理出去。 软件中存在的缺陷给我们带来的损失是巨大的, 软件测试是软件质量保证的关键步骤,测试作为一种“预防和评估成本”的投入,从而降低缺陷造成的劣质成本 软件测试在产品开发中占据着相当重要的位置,也是软件行业几十年的实践所证明的一个道理 --- slide24.xml --- 1.3 什么是 软件测试? --- slide25.xml --- 1.3.1 软件测试学科的形成 1.3.2 正反两方面的争辩 1.3.3 软件测试的定义 1.3.4 软件测试的其它观点 --- slide26.xml --- 1.3.1 软件测试学科的形成 --- slide27.xml --- 从狭义的软件测试到广义的软件测试 软件不只是可执行的程序 ,“需求、设计和代码”都属于软件的组成部分,对“需求、设计和代码”评审属于静态测试 既然提出“动态测试”,这就能说明大家认可“静态测试”,软件测试包含静态测试和动态测试 测试进行得越早,成本越低;相反,缺陷发现得越迟研发成本越高 软件测试 = 程序测试 --- slide28.xml --- 广义的软件测试可以极大地降低研发成本 缺陷发现得越迟,其修复的成本越高,而且是非线性增长 --- slide29.xml --- 软件测试学科的发展 1957 ~ 1978 年,以功能验证为导向,测试是证明软件是正确的(正向思维)。 1978 ~ 1983 年,以破坏性检测为导向,测试是为了找到软件中的错误(逆向思维)。 1983 ~ 1987 年,以质量评估为导向,测试是提供产品的评估和质量度量。 1988 年起,以缺陷预防为导向,测试是为了展示软件符合设计要求,发现缺陷、预防缺陷。 --- slide30.xml --- 不同的阶段划分 初级阶段( 1957 ~ 1971 )测试通常被认为是对产品进行事后检验 ,缺乏有效的测试方法 发展阶段( 1972 ~ 1982 ), 1972 年第一次关于软件测试的正式会议,促进了软件测试的发展 成熟阶段( 1983 到现在),国际标准 Std 829-1983 ,形成一门独立的学科和专业,成为软件工程学科中的一个重要组成部分 --- slide31.xml --- 1.3.2 正反两方面的争辩 --- slide32.xml --- 软件测试的正向思维 Bill Hetzel 博士(正向思维的代表): 软件测试就是为程序或系统能够按预期设想运行而建立信心的过程。 “软件测试是一系列活动以评价一个程序或系统的特性或能力并确定是否达到预期的结果” 测试是为了验证软件是否符合用户需求,即验证软件产品是否能正常工作 --- slide33.xml --- 软件测试的反向思维 Glenford J. Myers (反向思维的代表) 测试是为了证明程序有错,而不是证明程序无错误 一个好的测试用例是在于它能发现至今未发现的错误 一个成功的测试是发现了至今未发现的错误的测试 --- slide34.xml --- 认知决定着行为 评价一个程序或系统的特性或能力并确定是否达到预期的结果 测试是为发现错误而针对某个程序或系统的执行过程 软件测试 正向思维 - 验证软件正常工作 逆向思维 - 假定软件有错误 在设计规定的环境下运行软件的所有功能,直至全部通过 寻找容易犯错误的地方和系统的薄弱环节,试图破坏系统,直至找不出问题 --- slide35.xml --- 1.3.3 软件测试的定义 --- slide36.xml --- 什么是软件测试? 检查、检验 Check ? 验证软件能否正常运行? 发现问题 Detect error ? 证明是对的 Correction proof ? 质量评估 Quality evaluation ? 质量保证 Quality Assurance ? --- slide37.xml --- 软件测试 IEEE/ ISO29119 的定义 An activity in which a system or component is executed under specified conditions , the results are observed or recorded, and an evaluation i s made of some aspect of the system or component. [ISO/IEC 24765, Systems & Software Engineering Vocabulary] 在 特定的条件下 运行系统或组件,观察或记录结果,对系统或组件的某个方面做出 评价 --- slide38.xml --- 软件测试 IEEE/ ISO29119 的定义 – 续 Testing is comparing what the test item does with what it is expected to do 分析某个 软件项 以发现 现存的和要求的条件之差别 (即错误)并 评价 此软件项的特性 --- slide39.xml --- 软件测试 的价值 全面评估产品质量,获得有关产品质量的全面、客观的信息 发现问题,督促问题解决,提高产品质量 持续提供质量反馈、及时揭示质量风险,有助于控制项目风险,提高构建的质量 通过缺陷分析,获得缺陷模式,有助于缺陷预防 --- slide40.xml --- 1.3.4 软件测试的其它观点 --- slide41.xml --- 从质量视角认知软件测试 软件测试被认为是对软件 质量进行全面 评估活动,给出质量信息,从而确定质量是否满足设计和用户的需求 。 用户 要求 / 期望 质量 矛盾 / 对立 发现 Bug ? 软件测试 评估 质量模型 --- slide42.xml --- 从风险视角认知软件测试 软件测试被认为是对软件系统中 潜在的 各种 质量风险 进行评估的活动 。其实,测试是样本实验而不能穷尽,其风险总是存在的。 基于风险的测试强调对软件开发全过程进行检测,随时发现问题、报告问题,减少对客户不利影响的风险 需求 设计 代码 功能 非功能特性 产品经理、项目经理 开发人员 持续反馈质量风险 持续反馈质量风险 测试 交付 --- slide43.xml --- 从经济视角认知软件测试 测试的经济观点 就是以最小的代价获得最高的软件产品质量。经济观点也要求软件测试尽早开展工作,发现缺陷越早,返工的工作量就越小,所造成的损失就越小。测试的成本 < 缺陷造成的损失,测试才有意义。 --- slide44.xml --- 基于 Test Oracle 的认知 输出结果是否正确,需要判断准则 --- slide45.xml --- 基于 批判性思维 的认知 软件测试就是 借助 观 察、 经验 、反思、推理或沟通等收集信息,并 对软件产品相关的质量信息进行 分析 ,以此评估软件质量,并做出结论 不断探索的过程 --- slide46.xml --- 1.4 测试与质量保证的关系 --- slide47.xml --- 什么是 SQA ? 对软件工程各个阶段的进展、完成质量及出现的问题进行评审、跟踪。 审查和验证软件产品是否遵守适用的标准、规程和要求,并最终确保符合标准、满足要求。 建立软件质量要素的度量机制,了解各种指标的量化信息,向管理者提供可视信息。 软件质量保证( Software Quality Assurance , SQA )活动是通过对软件产品有计划的进行评审和审计来验证软件是否合乎标准的系统工程,通过协调、审查和跟踪以获取有用信息,形成分析结果以指导软件过程。 --- slide48.xml --- SQA 活动 技术方法的应用 正式技术评审的实施 软件测试 标准的执行 修改的控制 度量 质量记录和记录保存 --- slide49.xml --- 软件测试 vs. SQA SQA 指导、监督软件测试的计划和执行,督促测试工作的结果客观、准确和有效,并协助测试流程的改进。 软件测试是 SQA 重要手段之一,为 SQA 提供所需的数据,作为质量评价的客观依据。 SQA 是一项管理工作,侧重于对流程的评审和监控 测试是一项技术性的工作,侧重对产品进行评估和验证 --- slide50.xml --- 1.5 测试与开发的关系 --- slide51.xml --- 测试不是开发下一道工序 需求定义 设计 编程 测试 交付 --- slide52.xml --- 测试与开发是并行、协作的关系 --- slide53.xml --- 1.6 测试驱动开发的思想 --- slide54.xml --- 测试驱动开发的思想 TDD ( test driven development ):测试在前,开发在后 --- slide55.xml --- TDD 的实践最早来自极限编程 --- slide56.xml --- TDD 与 UTDD 、 ATDD ATDD UTDD 单元测试 代码 验收测试 验收指标 TDD 成为思想, UTDD 单元测试驱动开发、 ATDD 验收测试驱动开发则成为实践 --- slide57.xml --- 问题 如果开发人员测试自己的产品,会有哪些障碍? TDD 又是如何克服这些障碍的? --- slide58.xml --- 本章小结 理解测试的定义与价值 从不同视角认识软件测试 正向思维、逆向思维,也会决定测试的行为 理解测试、 SQA 、质量、开发等之间的关系 理解先进的 TDD 思想 --- slide59.xml --- 提问、思考与练习 在日常使用软件过程中,遇到哪些软件质量问题? 软件测试的正反两方面 观点会如何影响测试工作 的 ? 软件测试和软件开发的关系是怎样的?如何更好利用这种的关系? 软件测试和质量保证之间的联系和区别 ? --- slide60.xml --- 学习资源推荐 《 软件测试方法和技术(第 4 版) 》 ,清华大学出版社, 2022 《 全程软件测试(第 3 版) 》 ,人民邮电出版社, 2019 《 致命 Bug 软件缺陷的灾难与启示 》 ,人民邮电出版社, 2016 --- slide61.xml --- 感 谢 聆 听 朱少民 / 同济大学