测试驱动开发PPT学习课件.ppt_第1页
测试驱动开发PPT学习课件.ppt_第2页
测试驱动开发PPT学习课件.ppt_第3页
测试驱动开发PPT学习课件.ppt_第4页
测试驱动开发PPT学习课件.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

浅谈测试驱动开发 1 大纲 1 什么是测试驱动开发2 测试驱动开发对各个阶段的影响3 测试驱动开发存在的问题4 当前面临的问题5 单元测试6 测试工具7 总结8 相关资料 2 1 什么是测试驱动开发 1 概述测试驱开发 简称TDD 是一种不同于传统软件开发流程的新型开发方法 要求在编写某个功能代码之前先编写测试代码 然后只编写测试同过的功能代码 通过测试来推动整个开发的进行 这有助于编写简洁可用和高质量的代码 并加速开发过程 3 1 什么是测试驱动开发 类似于工人师傅砌墙时 会先用桩子拉上线 以便于砖能够垒的笔直 因为垒的时候都是以这根线为基准的 TDD就像这样 先写测试代码 就像工人师傅先用桩子拉上线 然后编码的时候以此为基准 只编写符合这个测试的功能代码 4 1 什么是测试驱动开发 2 背景测试驱动开发 TestDrivenDevelopment 英文缩写TDD 是极限编程的一个重要组成部分 它的基本思想就是在开发功能代码之前 先编写测试代码 也就是说在明确要开发某个功能后 首先思考如何对这个功能进行测试 并完成测试代码的编写 然后编写相关的代码满足这些测试用例 然后循环进行添加其他功能 直到完成全部功能的开发 代码整洁可用 cleancodethatworks 是测试驱动开发所追求的目标 5 1 什么是测试驱动开发 3 测试驱动开发的优点跟测试后进行的开发方式相比 它有如下好处 1 测试驱动开发最重要的功能还在于保障代码的正确性 能够迅速发现 定位bug 针对关键代码的测试集 以及不断完善的测试用例 为迅速发现 定位bug提供了条件 2 通过编写代码的测试用例 对其功能的分解 使用过程 接口都进行了设计 而且这种从使用角度对代码的设计通常更符合后期开发的需求 可测试的要求 对代码的内聚性的提高和复用都非常有益 因此测试驱动开发也是一种代码设计的过程 3 写单元测试的时候 很容易就可以为一个行为写一个测试用例 让它通过 然后为另一种行为写另一个测试用例 也就是说 整个任务会被划分成很多小的任务 独立完成 如果我们不用TDD而直接实现的话 我们很容易就会同时把所有的行为都实现了 这样花的时间长 而且在这相当长的时间里面 写的代码都是没有测试过 不能保证准确性的 相反的 用TDD的话 我们只实现要测的行为的代码 它只花费很少的时间 几分钟 而且可以马上测试 6 1 什么是测试驱动开发 4 为了更容易的写单元测试 我们会广泛的使用接口 这个会让单元测试代码很容易读跟写 因为测试代码里面没有多余的数据 如果我们不用TDD而是直接写实现的话 我们经常会使用现成的类 测试为了调用现成的类 就不得不创建很多多余的数据 创建很巨型的对象 5 因为广泛的使用接口 我们的类之间就不会藕合 因此重用性更好 6 发现比传统测试方式更多的Bug 7 完工时完工 表明我可以很清楚的看到自己的这段工作已经结束了 而传统的方式很难知道什么时候编码工作结束了 7 1 什么是测试驱动开发 4 测试驱动开发的过程1 明确当前要完成的功能 可以记录成一个TODO列表 2 快速完成针对此功能的测试用例编写 3 测试代码编译不通过 4 编写对应的功能代码 5 测试通过 6 对代码进行重构 并保证测试通过 7 循环完成所有功能的开发 简单来说 就是不可运行 可运行 重构 8 1 什么是测试驱动开发 5 原则 1 测试隔离 不同代码的测试应该相互隔离 对一块代码的测试只考虑此代码的测试 不要考虑其实现细节 比如它使用了其他类的边界条件 2 一顶帽子 开发人员开发过程中要做不同的工作 比如 编写测试代码 开发功能代码 对代码重构等 做不同的事 承担不同的角色 开发人员完成对应的工作时应该保持注意力集中在当前工作上 而不要过多的考虑其他方面的细节 保证头上只有一顶帽子 避免考虑无关细节过多 无谓地增加复杂度 3 测试列表 需要测试的功能点很多 应该在任何阶段想添加功能需求问题时 把相关功能点加到测试列表中 然后继续手头工作 然后不断的完成对应的测试用例 功能代码 重构 一是避免疏漏 也避免干扰当前进行的工作 4 测试驱动 这个比较核心 完成某个功能 某个类 首先编写测试代码 考虑其如何使用 如何测试 然后在对其进行设计 编码 5 先写断言 测试代码编写时 应该首先编写对功能代码的判断用的断言语句 然后编写相应的辅助语句 9 1 什么是测试驱动开发 6 可测试性 功能代码设计 开发时应该具有较强的可测试性 其实遵循比较好的设计原则的代码都具备较好的测试性 比如比较高的内聚性 尽量依赖于接口等 7 及时重构 无论是功能代码还是测试代码 对结构不合理 重复的代码等情况 在测试通过后 及时进行重构 8 小步前进 软件开发是个复杂性非常高的工作 开发过程中要考虑很多东西 包括代码的正确性 可扩展性 性能等等 很多问题都是因为复杂性太大导致的 极限编程提出了一个非常好的思路就是小步前进 把所有的规模大 复杂性高的工作 分解成小的任务来完成 对于一个类来说 一个功能一个功能的完成 如果太困难就再分解 每个功能的完成就走测试代码 功能代码 测试 重构的循环 通过分解降低整个系统开发的复杂性 这样的效果非常明显 几个小的功能代码完成后 大的功能代码几乎是不用调试就可以通过 一个个类方法的实现 很快就看到整个类很快就完成啦 本来感觉很多特性需要增加 很快就会看到没有几个啦 你甚至会为这个速度感到震惊 个人理解 是大幅度减少调试 出错的时间产生的这种速度感 10 1 什么是测试驱动开发 6 怎么编写测试用例测试用例的编写就用上了传统的测试技术 操作过程尽量模拟正常使用的过程 全面的测试用例应该尽量做到分支覆盖 核心代码尽量做到路径覆盖 测试数据尽量包括 真实数据 边界数据 测试语句和测试数据应该尽量简单 容易理解 为了避免对其他代码过多的依赖 可以实现简单的桩函数或桩类 MockObject 如果内部状态非常复杂或者应该判断流程而不是状态 可以通过记录日志字符串的方式进行验证 11 2 测试驱动开发对各个阶段的影响 1 传统软件开发模型传统的软件开发包括需求分析 设计 编码和测试四个阶段 12 2 测试驱动开发对各个阶段的影响 2 测试驱动开发对需求分析的影响1 需求分析是软件开发的一个重要任务 它是系统层软件配置与软件设计之间的桥梁 它主要是用来识别软件的功能 性能的要求及其接口特性 2 测试驱动开发在软件需求分析阶段引入测试 需求分析阶段的测试工作的重点是如何定义测试计划 如何定义接受测试并获得客户的认可 在需求分析阶段结束的时候 必须保证所有的需求都是可测试的 都拥有测试用例 需求阶段另一个重要的测试任务是准备构建测试沙盒 建立一个测试环境 以及这个软件项目所需要的测试数据 通过在需求分析阶段引人测试 开发人员能够清除各种矛盾以满足用户需求 13 2 测试驱动开发对各个阶段的影响 3 测试驱动开发对设计的影响1 软件设计分为 概要设计和详细设计 概要设计主要是把需求转换为数据和软件体系结构 而详细设计主要集中在体系结构表达式的细化 从而产生详细的数据结构和软件的算法表达式 2 测试驱动开发在测试阶段引入测试 用测试来推进设计 3 坚持测试优先的实践 使设计人员用测试的角度来考虑设计 从一个外部接口和客户端的角度来考虑问题 这样可以保证软件系统各个模块之间能够较好的连接在一起 而设计人员的思考方式 也会逐步地从单纯的考虑实现 转移到对软件结构的思考上来 14 2 测试驱动开发对各个阶段的影响 4 引用测试驱动开发 因为测试可以实现一部分的设计工作 这样 设计上可以节省一些工作量 5 在设计阶段 测试工作的重点在于如何定义各个模块的详细测试内容 最好的方式是实现测试代码 并构建测试框架 对于一些比较复杂的项目 还需要编写一些测试工具 15 2 测试驱动开发对各个阶段的影响 4 测试驱动开发对编码的影响编码就是用编程语言把对软件的设计表达式翻译为计算机能够 懂得 的形式 测试驱动开发在编码阶段引入的观点是 由测试来决定如何编写代码 这种观点强调在写程序之前先写测试 这会使开发人员更清楚应该在程序中加入何种性能 以及如何使这些性能良好的运行 由于许多需求并不明确或并不完整 开发人员不得不花时间把它弄清楚或是根据以往的实践经验来选择一个较好的办法 如果所有不明确的问题都能在写测试的时候首先被解决 那么就会使之后复杂的编写代码工作变得很轻松 16 2 测试驱动开发对各个阶段的影响 5 测试驱动开发对测试的影响1 软件测试的概念软件测试是软件质量保证的主要活动之一 它提供对软件规格说明 设计和编码的最终评审 软件测试的本质是针对要测试的内容确定一组测试用例 我们可以通过维恩图来理解测试 维恩图中的全域表示的是程序行为 集合P是用程序实现的行为 集合S是所描述的行为 集合T是测试用例 S和P相交的部分是 正确 的部分 即既被描述又被实现的行为 测试就是确定既被描述又被实现的程序行为的范围 因此 我们要使S P和T的相交区域1尽可能地大 如下图 17 2 测试驱动开发对各个阶段的影响 18 2 测试驱动开发对各个阶段的影响 2 件测试的方法软件测试有两种基本的方法 功能性测试和结构性测试 功能性测试把任何程序都看作是从输人定义域取值映射到输出值的函数 它使用的唯一信息是软件的规格说明 结构性测试检查软件内部的逻辑结构 是以仔细检查过程的细节为基础 通过提供一组指定条件和循环的测试用例 对穿过软件的逻辑路径进行测试 可以在不同点检查程序的状态 以确定实际状态与预期状态是否一致 19 2 测试驱动开发对各个阶段的影响 3 传统测试方法存在的问题 传统的功能性测试存在着漏洞和冗余 而且同时不能被发现 传统的结构性测试将代码采用有向图表示和程序路径公式化 掩盖了代码中的重要信息 这就在路径分析的方向上走得太远 如果测试编写人员编写测试时所依赖的是文档不是代码时 当文档和代码存在任何不一致的地方就会造成问题 测试不是自动运行的 它们极有可能不会被频繁 经常性地运行 或每次都以相同的方式来运行 20 2 测试驱动开发对各个阶段的影响 4 测试驱动开发解决的问题 在测试驱动开发中 由程序员来完成测试 代码是基于测试编写的 就保证了代码的可测试性 有助于确保测试覆盖的完备性及代码与测试的一致性 测试驱动开发把功能性测试和结构性测试覆盖指标相结合 通过这种结合确定测试用例 从而实现功能性测试的置信和结构性测试的度量 测试驱动的开发在整个开发过程中引入自动测试 并不断改进这些测试以适应程序代码的扩展 全面彻底的测试覆盖 如果在调试阶段引入某个错误的话 测试集就能立即发现并查明其位置 测试一调试周期就会被控制在相当短的时间内 从发现错误到修正它就不会再耽搁很长的时间 当系统被发布时 详尽的测试集与系统一起发布 从而使得将来对程序的修改和扩展更加容易 21 3 测试驱动开发存在的问题 测试驱动开发是单元性测试 不是全局性测试 因此在对模型的验证方面起不到关键作用 如果用测试驱动开发驱动图形用户界面的编写 容易造成资源浪费 测试驱动开发的应用领域问题 对于设计很重要必须提前做好的软件 对于软件质量要求极高的军事或科研产品如神州六号 对于人命关天的软件如医疗设备软件等等不适合用测试驱动开发 22 4 当前面临的问题 测试用例不全面测试数据依赖于整个系统环境 不能回归对于复杂的函数或接口的测试没有实现没有建立测试基础类系统更新变化快 用例不能及时更新测试函数的功能不唯一 23 5 单元测试 1 概述单元测试的目标 确保模块被正确地编码 由谁去做 通常由开发人员执行 怎样去测试 功能测试可以用黑盒测试方法 代码测试可用白盒测试方法 什么时候停止 当开发人员感到代码没有缺陷时 24 5 单元测试 2 单元测试的重要性一个尽责的单元测试方法将会在产品开发的某个阶段发现很多的Bug 并且修改它们的成本也很低 系统开发的后期阶段 Bug的检测和修改将会变得更加困难 并要消耗大量的时间和开发费用 无论什么时候做出修改都要进行完整的回归测试 在生命周期中尽早的对产品代码进行测试将是效率和质量得到最好的保证 在提供了经过单元测试的情况下 系统集成过程将会大大的简化 开发人员可以将精力集中在单元之间的交互作用和全局的功能实现上 而不会陷入充满很多Bug的单元之中不能自拔 使测试工作的效率发挥到最大化的关键在于选择正确的测试策略 这包含了完全的单元测试的概念 以及对测试过程的良好的管理 还有适当的使用好工具来支持测试过程 25 5 单元测试 3 为什么要进行单元测试 1 单元测试是不是太浪费时间了 不经过单元测试 直接进入集成测试 系统正常工作的可能性非常低 大量的时间被花费在跟踪那些简单的Bug上 会导致集成为一个系统时增加额外的工期 编写完整计划的单元测试和编写实际的代码所花费的精力大致相同 但是 一旦完成了这些单元测试工作 很多Bug将被纠正 在确信他们手头拥有稳定可靠的部件的情况下 开发人员能够进行更高效的系统集成工作 这才是真正意义上的进步 调试人员的不受控和散漫的工作方式只会花费更多的时间而取得很少的好处 2 单元测试仅仅是为了证明这些代码作了什么吗 这是那些没有首先为每个单元编写一个详细设计文档而直接跳到编码阶段的开发人员提出的一条普遍的抱怨 这样的测试完全基于已经写好的代码 这无法证明任何事情 单元测试基于详细设计文档 这样的测试可以找到更多的代码错误 甚至是详细设计的错误 因此 高质量的单元测试需要高质量的详细设计文档 26 5 单元测试 3 我是一个很棒的程序员 是不是可以不进行单元测试呢 每个人都可能犯错误 真正的完整的系统往往是非常复杂的 不能寄希望于没有进行广泛的测试和Bug修改过程就可以正常工作 27 5 单元测试 4 单元测试的策略单元测试最核心的并不是工具的使用 而是测试的策略和方法 工具也好 实现手段也好 只是开展单元测试的必需品 以下是单元测试常采用的策略 1 哪些是重点模块 2 哪些程序是最复杂 最容易出错的 3 哪些程序是相对独立 应当提前测试的 4 哪些程序最容易扩散错误 5 哪些程序是开发者最没有信心的 6 80 20原则 80 的缺陷聚集在20 的模块中 经常出错的模块改错后还会经常出错 这种应该列入测试重点 28 5 单元测试 5 测试用例的设计单元测试的核心是测试用例的设计 测试用例的核心是测试数据的设计 测试用例的设计主要从两方面考虑 1 功能 我们为了验证一个函数是否实现了它的功能 通常采用黑盒测试的方法 常用的方法有边界值 等价类 因果图 关于黑盒测试方法的详细介绍 参见 测试用例设计白皮书 doc 2 逻辑结构 通常采用白盒测试的方法 常用的方法有判定覆盖 条件覆盖 条件判定组合覆盖 关于白盒测试的方法的详细介绍 参见 白盒测试方法 pdf 29 5 单元测试 6 TDD与单元测试的区别TDD是一种设计手段 而不仅仅是测试手段 TDD的原则是 只做必要的事 不做多余的事 TDD其实并不是单纯强调测试 它首先是需求分析和设计技术 30 6 测试工具 1 概述为了完成测试驱动开发以及单元测试 我们需要相应的工具 针对c 的单元测试工具是CppUnit针对c 的单元测试工具是Nunit针对Java的单元测试工具点击JUnit 31 6 测试工具 2 xUnitxUnit是各种代码驱动测试框架的统称 这些框架可以测试软件的不同内容 单元 比如函数和类 xUnit框架的主优点是 它提供了一个自动化测试的解决方案 没有必要多次编写重复的测试代码 也不必记住这个测试的结果应该是怎样的 32 6 测试工具 2 NUnit介绍NUnit是一个单元测试框架 专门针对于 NET来写的 其实在前面有JUnit Java CPPUnit C 他们都是xUnit的一员 最初 它是从JUnit而来 现在的版本是2 4 8 NUnit最初是由JamesW Newkirk AlexeiA Vorontsov和PhilipA Craig 后来开发团队逐渐庞大起来 在开发过程中 KentBeck和ErichGamma2位牛人也提供了许多帮助 看来对于NUnit还真是下了一番力气了 JNUnit是xUnit家族种的第4个主打产品 完全由C 语言来编写 并且编写时充分利用了许多 NET的特性 比如反射 客户属性等等 最重要的一点是它适合于所有 NET语言 33 6 测试工具 3 JUnit单元测试工具 34 有两种方式 一种是最直接的方式 配置JUnit 通过命令行来建立 另一种择是使用Eclipse中的JUnit插件来建立 独立JUnit的测试环境建立 掌握验证安装成功的3种方式 利用Eclipse中的JUnit插件 JUnit单元测试环境的建立 35 按照XP编程开发方法 则应先编写测试代码 再编写工作代码 要注意编写那些能通过的测试的测试代码意义不是十分突出 而那些能帮助我们发现Bug的测试代码才有其价值 此外测试代码还应该对工作代码进行全面的测试 独立JUnit应用Eclipse中的JUnit应用 JUnit单元测试方法 36 独立JUnit测试环境的建立 1 从www junit org JUnit官方网站 下载最新的JUnit包 2 将JUnit的压缩包解压到硬盘上 3 将JUnit的jar包添加到环境变量classpath中 4 测试安装是否成功 批处理方式 在cmd命令行输入如下所示的命令 javajunit textui TestRunner 37 利用Eclipse中的JUnit插件 由于Eclipse中已经集成了JUnit插件 所以可以直接建立测试用例来测试代码 若没有集成jUnit 只需要特别的配置就可以了 1 创建的一个新的Java项目 2 右击在新建的Java项目 在弹出的菜单中选择 Properties 3 依次选择 JavaBuildPath Libraries 单击 AddExternalJARS 按钮 导航至JUnit解压缩的目录 选择junit

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论