测试驱动开发课件.ppt

上传人(卖家):晟晟文业 文档编号:5093900 上传时间:2023-02-10 格式:PPT 页数:46 大小:1.14MB
下载 相关 举报
测试驱动开发课件.ppt_第1页
第1页 / 共46页
测试驱动开发课件.ppt_第2页
第2页 / 共46页
测试驱动开发课件.ppt_第3页
第3页 / 共46页
测试驱动开发课件.ppt_第4页
第4页 / 共46页
测试驱动开发课件.ppt_第5页
第5页 / 共46页
点击查看更多>>
资源描述

1、 大纲u1.什么是测试驱动开发u2.测试驱动开发对各个阶段的影响u3.测试驱动开发存在的问题u4.当前面临的问题u5.单元测试u6.测试工具u7.总结u8.相关资料1.什么是测试驱动开发u1.概述 测试驱开发,简称TDD,是一种不同于传统软件开发流程的新型开发方法。要求在编写某个功能代码之前先编写测试代码,然后只编写测试同过的功能代码,通过测试来推动整个开发的进行。这有助于编写简洁可用和高质量的代码,并加速开发过程。1.什么是测试驱动开发 类似于工人师傅砌墙时,会先用桩子拉上线,以便于砖能够垒的笔直,因为垒的时候都是以这根线为基准的。TDD就像这样,先写测试代码,就像工人师傅先用桩子拉上线,然

2、后编码的时候以此为基准,只编写符合这个测试的功能代码1.什么是测试驱动开发u2.背景测试驱动开发(Test Driven Development,英文缩写TDD)是极限编程的一个重要组成部分,它的基本思想就是在开发功能代码之前,先编写测试代码。也就是说在明确要开发某个功能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。然后循环进行添加其他功能,直到完成全部功能的开发。代码整洁可用(clean code that works)是测试驱动开发所追求的目标。1.什么是测试驱动开发u3.测试驱动开发的优点跟测试后进行的开发方式相比,它有如下好处:(1)测试

3、驱动开发最重要的功能还在于保障代码的正确性,能够迅速发现、定位bug。针对 关键代码的测试集,以及不断完善的测试用例,为迅速发现、定位bug提供了条件。(2)通过编写代码的测试用例,对其功能的分解、使用过程、接口都进行了设计。而且这种从使用角度对代码的设计通常更符合后期开发的需求。可测试的要求,对代码的内聚性的提高和复用都非常有益。因此测试驱动开发也是一种代码设计的过程。(3)写单元测试的时候,很容易就可以为一个行为写一个测试用例,让它通过,然后为另一种行为写另一个测试用例。也就是说,整个任务会被划分成很多小的任务,独立完成。如果我们不用TDD而直接实现的话,我们很容易就会同时把所有的行为都实

4、现了。这样花的时间长,而且在这相当长的时间里面,写的代码都是没有测试 过,不能保证准确性的。相反的,用TDD的话,我们只实现要测的行为的代码。它只花费很少的时间(几分钟),而且可以马上测试。1.什么是测试驱动开发(4)为了更容易的写单元测试,我们会广泛的使用接口。这个会让单元测试代码很容易读跟写,因为测试代码里面没有多余的数据。如果我们不用TDD而是直接写实现的话,我们经常会使用现成的类,测试为了调用现成的类,就不得不创建很多多余的数据,创建很巨型的对象。(5)因为广泛的使用接口,我们的类之间就不会藕合,因此重用性更好。(6)发现比传统测试方式更多的Bug。(7)完工时完工。表明我可以很清楚的

5、看到自己的这段工作已经结束了,而传统的方式很难知道什么时候编码工作结束了。1.什么是测试驱动开发u4.测试驱动开发的过程1)明确当前要完成的功能。可以记录成一个 TODO 列表。2)快速完成针对此功能的测试用例编写。3)测试代码编译不通过。4)编写对应的功能代码。5)测试通过。6)对代码进行重构,并保证测试通过。7)循环完成所有功能的开发。简单来说,就是不可运行/可运行/重构。1.什么是测试驱动开发u5.原则(1)测试隔离。不同代码的测试应该相互隔离。对一块代码的测试只考虑此代码的测试,不要考虑其实现细节(比如它使用了其他类的边界条件)。(2)一顶帽子。开发人员开发过程中要做不同的工作,比如:

6、编写测试代码、开发功能代码、对代码重构等。做不同的事,承担不同的角色。开发人 员完成对应的工作时应该保持注意力集中在当前工作上,而不要过多的考虑其他方面的细节,保证头上只有一顶帽子。避免考虑无关细节过多,无谓地增加复杂度。(3)测试列表。需要测试的功能点很多。应该在任何阶段想添加功能需求问题时,把相关功能点加到测试列表中,然后继续手头工作。然后不断的完 成对应的测试用例、功能代码、重构。一是避免疏漏,也避免干扰当前进行的工作。(4)测试驱动。这个比较核心。完成某个功能,某个类,首先编写测试代码,考虑其如何使用、如何测试。然后在对其进行设计、编码。(5)先写断言。测试代码编写时,应该首先编写对功

7、能代码的判断用的断言语句,然后编写相应的辅助语句。1.什么是测试驱动开发(6)可测试性。功能代码设计、开发时应该具有较强的可测试性。其实遵循比较好的设计原则的代码都具备较好的测试性。比如比较高的内聚性,尽 量依赖于接口等。(7)及时重构。无论是功能代码还是测试代码,对结构不合理,重复的代码等情况,在测试通过后,及时进行重构。(8)小步前进。软件开发是个复杂性非常高的工作,开发过程中要考虑很多东西,包括代码的正确性、可扩展性、性能等等,很多问题都是因为复杂性太大导致的。极限编程提出了一个非常好的思路就是小步前进。把所有的规模大、复杂性高的工作,分解成小的任务来完成。对于一个类来说,一个功能一个功

8、能的完成,如果太困难就再分解。每个功能的完成就走测试代码功能代码测试重构的循环。通过分解降低整个系统开发的复杂性。这样的效果非常明显。几个小 的功能代码完成后,大的功能代码几乎是不用调试就可以通过。一个个类方法的实现,很快就看到整个类很快就完成啦。本来感觉很多特性需要增加,很快就会看到 没有几个啦。你甚至会为这个速度感到震惊。(个人理解,是大幅度减少调试、出错的时间产生的这种速度感)1.什么是测试驱动开发u6.怎么编写测试用例测试用例的编写就用上了传统的测试技术。操作过程尽量模拟正常使用的过程。全面的测试用例应该尽量做到分支覆盖,核心代码尽量做到路径覆盖。测试数据尽量包括:真实数据、边界数据。

9、测试语句和测试数据应该尽量简单,容易理解。为了避免对其他代码过多的依赖,可以实现简单的桩函数或桩类(Mock Object)。如果内部状态非常复杂或者应该判断流程而不是状态,可以通过记录日志字符串的方式进行验证。2.测试驱动开发对各个阶段的影响u1.传统软件开发模型 传统的软件开发包括需求分析、设计、编码和测试四个阶段。2.测试驱动开发对各个阶段的影响u2.测试驱动开发对需求分析的影响 1)需求分析是软件开发的一个重要任务,它是系统层软件配置与软件设计之间的桥梁,它主要是用来识别软件的功能、性能的要求及其接口特性。2)测试驱动开发在软件需求分析阶段引入测试。需求分析阶段的测试工作的重点是如何定

10、义测试计划,如何定义接受测试并获得客户的认可,在需求分析阶段结束的时候,必须保证所有的需求都是可测试的,都拥有测试用例,需求阶段另一个重要的测试任务是准备构建测试沙盒,建立一个测试环境,以及这个软件项目所需要的测试数据。通过在需求分析阶段引人测试,开发人员能够清除各种矛盾以满足用户需求。2.测试驱动开发对各个阶段的影响u3.测试驱动开发对设计的影响1.软件设计分为:概要设计和详细设计。概要设计主要是把需求转换为数据和软件体系结构,而详细设计主要集中在体系结构表达式的细化,从而产生详细的数据结构和软件的算法表达式。2.测试驱动开发在测试阶段引入测试,用测试来推进设计。3.坚持测试优先的实践,使设

11、计人员用测试的角度来考虑设计,从一个外部接口和客户端的角度来考虑问题,这样可以保证软件系统各个模块之间能够较好的连接在一起,而设计人员的思考方式,也会逐步地从单纯的考虑实现,转移到对软件结构的思考上来。2.测试驱动开发对各个阶段的影响 4.引用测试驱动开发,因为测试可以实现一部分的设计工作。这样,设计上可以节省一些工作量。5.在设计阶段,测试工作的重点在于如何定义各个模块的详细测试内容,最好的方式是实现测试代码,并构建测试框架,对于一些比较复杂的项目,还需要编写一些测试工具。2.测试驱动开发对各个阶段的影响u4.测试驱动开发对编码的影响 编码就是用编程语言把对软件的设计表达式翻译为计算机能够“

12、懂得”的形式。测试驱动开发在编码阶段引入的观点是:由测试来决定如何编写代码。这种观点强调在写程序之前先写测试,这会使开发人员更清楚应该在程序中加入何种性能,以及如何使这些性能良好的运行。由于许多需求并不明确或并不完整,开发人员不得不花时间把它弄清楚或是根据以往的实践经验来选择一个较好的办法。如果所有不明确的问题都能在写测试的时候首先被解决,那么就会使之后复杂的编写代码工作变得很轻松。2.测试驱动开发对各个阶段的影响u5.测试驱动开发对测试的影响 1)软件测试的概念 软件测试是软件质量保证的主要活动之一,它提供对软件规格说明、设计和编码的最终评审。软件测试的本质是针对要测试的内容确定一组测试用例

13、。我们可以通过维恩图来理解测试。维恩图中的全域表示的是程序行为,集合P是用程序实现的行为,集合S是所描述的行为,集合T是测试用例。S和P相交的部分是“正确”的部分,即既被描述又被实现的行为。测试就是确定既被描述又被实现的程序行为的范围,因此,我们要使S、P和T的相交区域1尽可能地大。如下图。2.测试驱动开发对各个阶段的影响S 1TP2.测试驱动开发对各个阶段的影响2)件测试的方法 软件测试有两种基本的方法:功能性测试和结构性测试。功能性测试把任何程序都看作是从输人定义域取值映射到输出值的函数。它使用的唯一信息是软件的规格说明。结构性测试检查软件内部的逻辑结构,是以仔细检查过程的细节为基础,通过

14、提供一组指定条件和循环的测试用例,对穿过软件的逻辑路径进行测试,可以在不同点检查程序的状态,以确定实际状态与预期状态是否一致。2.测试驱动开发对各个阶段的影响3)传统测试方法存在的问题传统的功能性测试存在着漏洞和冗余,而且同时不能被发现。传统的结构性测试将代码采用有向图表示和程序路径公式化,掩盖了代码中的重要信息,这就在路径分析的方向上走得太远。如果测试编写人员编写测试时所依赖的是文档不是代码时,当文档和代码存在任何不一致的地方就会造成问题。测试不是自动运行的,它们极有可能不会被频繁、经常性地运行,或每次都以相同的方式来运行。2.测试驱动开发对各个阶段的影响4)测试驱动开发解决的问题在测试驱动

15、开发中,由程序员来完成测试。代码是基于测试编写的,就保证了代码的可测试性,有助于确保测试覆盖的完备性及代码与测试的一致性。测试驱动开发把功能性测试和结构性测试覆盖指标相结合,通过这种结合确定测试用例,从而实现功能性测试的置信和结构性测试的度量。测试驱动的开发在整个开发过程中引入自动测试,并不断改进这些测试以适应程序代码的扩展。全面彻底的测试覆盖,如果在调试阶段引入某个错误的话,测试集就能立即发现并查明其位置。测试一调试周期就会被控制在相当短的时间内,从发现错误到修正它就不会再耽搁很长的时间。当系统被发布时,详尽的测试集与系统一起发布,从而使得将来对程序的修改和扩展更加容易。3.测试驱动开发存在

16、的问题 测试驱动开发是单元性测试,不是全局性测试。因此在对模型的验证方面起不到关键作用。如果用测试驱动开发驱动图形用户界面的编写,容易造成资源浪费。测试驱动开发的应用领域问题。对于设计很重要必须提前做好的软件,对于软件质量要求极高的军事或科研产品如神州六号,对于人命关天的软件如医疗设备软件等等不适合用测试驱动开发。4.当前面临的问题1.测试用例不全面2.测试数据依赖于整个系统环境,不能回归3.对于复杂的函数或接口的测试没有实现4.没有建立测试基础类5.系统更新变化快,用例不能及时更新6.测试函数的功能不唯一5.单元测试u1.概述单元测试的目标:确保模块被正确地编码。由谁去做:通常由开发人员执行

17、。怎样去测试:功能测试可以用黑盒测试方法,代码测试可用白盒测试方法。什么时候停止:当开发人员感到代码没有缺陷时。5.单元测试u2.单元测试的重要性一个尽责的单元测试方法将会在产品开发的某个阶段发现很多的Bug,并且修改它们的成本也很低。系统开发的后期阶段,Bug的检测和修改将会变得更加困难,并要消耗大量的时间和开发费用。无论什么时候做出修改都要进行完整的回归测试,在生命周期中尽早的对产品代码进行测试将是效率和质量得到最好的保证。在提供了经过单元测试的情况下,系统集成过程将会大大的简化。开发人员可以将精力集中在单元之间的交互作用和全局的功能实现上,而不会陷入充满很多Bug的单元之中不能自拔。使测

18、试工作的效率发挥到最大化的关键在于选择正确的测试策略,这包含了完全的单元测试的概念,以及对测试过程的良好的管理,还有适当的使用好工具来支持测试过程。5.单元测试u3.为什么要进行单元测试(1)单元测试是不是太浪费时间了?不经过单元测试,直接进入集成测试,系统正常工作的可能性非常低,大量的时间被花费在跟踪那些简单的Bug上,会导致集成为一个系统时增加额外的工期。编写完整计划的单元测试和编写实际的代码所花费的精力大致相同。但是,一旦完成了这些单元测试工作,很多Bug将被纠正,在确信他们手头拥有稳定可靠的部件的情况下,开发人员能够进行更高效的系统集成工作,这才是真正意义上的进步。调试人员的不受控和散

19、漫的工作方式只会花费更多的时间而取得很少的好处。(2)单元测试仅仅是为了证明这些代码作了什么吗?这是那些没有首先为每个单元编写一个详细设计文档而直接跳到编码阶段的开发人员提出的一条普遍的抱怨。这样的测试完全基于已经写好的代码,这无法证明任何事情。单元测试基于详细设计文档,这样的测试可以找到更多的代码错误,甚至是详细设计的错误。因此,高质量的单元测试需要高质量的详细设计文档。5.单元测试(3)我是一个很棒的程序员,是不是可以不进行单元测试呢?每个人都可能犯错误。真正的完整的系统往往是非常复杂的,不能寄希望于没有进行广泛的测试和Bug修改过程就可以正常工作。5.单元测试u4.单元测试的策略单元测试

20、最核心的并不是工具的使用,而是测试的策略和方法。工具也好,实现手段也好,只是开展单元测试的必需品。以下是单元测试常采用的策略:1)哪些是重点模块?2)哪些程序是最复杂、最容易出错的?3)哪些程序是相对独立,应当提前测试的?4)哪些程序最容易扩散错误?5)哪些程序是开发者最没有信心的?6)80-20原则:80的缺陷聚集在20的模块中,经常出错的模块改错后还会经常出错,这种应该列入测试重点。5.单元测试u5.测试用例的设计单元测试的核心是测试用例的设计,测试用例的核心是测试数据的设计。测试用例的设计主要从两方面考虑:(1)功能。我们为了验证一个函数是否实现了它的功能,通常采用黑盒测试的方法。常用的

21、方法有边界值、等价类、因果图,关于黑盒测试方法的详细介绍,参见测试用例设计白皮书.doc。(2)逻辑结构。通常采用白盒测试的方法。常用的方法有判定覆盖、条件覆盖、条件判定组合覆盖,关于白盒测试的方法的详细介绍,参见白盒测试方法.pdf。5.单元测试u6.TDD与单元测试的区别TDD是一种设计手段,而不仅仅是测试手段。TDD的原则是“只做必要的事,不做多余的事”。TDD其实并不是单纯强调测试,它首先是需求分析和设计技术。6.测试工具u1.概述为了完成测试驱动开发以及单元测试,我们需要相应的工具。针对c+的单元测试工具是CppUnit针对c#的单元测试工具是Nunit针对Java的单元测试工具点击

22、JUnit6.测试工具 2.xUnit2.xUnitxUnitxUnit是各种代码驱动测试框架的统称,这些框架可以测试是各种代码驱动测试框架的统称,这些框架可以测试软件的不同内容软件的不同内容(单元单元),比如函数和类。,比如函数和类。xUnitxUnit框架的主优框架的主优点是,它提供了一个自动化测试的解决方案。没有必要多次点是,它提供了一个自动化测试的解决方案。没有必要多次编写重复的测试代码,也不必记住这个测试的结果应该是怎编写重复的测试代码,也不必记住这个测试的结果应该是怎样的。样的。6.测试工具u2.NUnit介绍NUnit是一个单元测试框架,专门针对于.NET来写的.其实在前面有JU

23、nit(Java),CPPUnit(C+),他们都是xUnit的一员.最初,它是从JUnit而来.现在的版本是2.4.8.NUnit最初是由James W.Newkirk,Alexei A.Vorontsov 和Philip A.Craig,后来开发团队逐渐庞大起来.在开发过程中,Kent Beck 和Erich Gamma2位牛人也提供了许多帮助.看来对于NUnit还真是下了一番力气了.JNUnit是xUnit家族种的第4个主打产品,完全由C#语言来编写,并且编写时充分利用了许多.NET的特性,比如反射,客户属性等等.最重要的一点是它适合于所有.NET语言6.测试工具3.JUnit3.JUn

24、it单元测试工具单元测试工具 有两种方式:一种是最直接的方式:配置有两种方式:一种是最直接的方式:配置JUnit,通过命令行来建,通过命令行来建立。另一种择是使用立。另一种择是使用Eclipse中的中的JUnit插件来建立。插件来建立。独立独立JUnit的测试环境建立的测试环境建立(掌握验证安装成功的掌握验证安装成功的3种方式种方式)利用利用Eclipse中的中的JUnit插件插件JUnit单元测试环境的建立单元测试环境的建立 按照按照XP编程开发方法,则应先编写测试代码,再编写工作代码。要编程开发方法,则应先编写测试代码,再编写工作代码。要注意编写那些能通过的测试的测试代码意义不是十分突出,

25、而那些能帮注意编写那些能通过的测试的测试代码意义不是十分突出,而那些能帮助我们发现助我们发现Bug的测试代码才有其价值。此外测试代码还应该对工作代的测试代码才有其价值。此外测试代码还应该对工作代码进行全面的测试。码进行全面的测试。独立独立JUnit应用应用Eclipse中的中的JUnit应用应用JUnit单元测试方法单元测试方法独立JUnit测试环境的建立(1)从)从www.junit.org(JUnit官方网站官方网站)下载最新的下载最新的JUnit包包(2)将)将JUnit的压缩包解压到硬盘上的压缩包解压到硬盘上(3)将)将JUnit的的jar包添加到环境变量包添加到环境变量classpa

26、th中。中。(4)测试安装是否成功。)测试安装是否成功。批处理方式,在批处理方式,在cmd命令行输入如下所示的命令。命令行输入如下所示的命令。java junit.textui.TestRunner利用Eclipse中的JUnit插件由于由于Eclipse中已经集成了中已经集成了JUnit插件,所以可以直接建立测试用例来测插件,所以可以直接建立测试用例来测试代码。若没有集成试代码。若没有集成jUnit,只需要特别的配置就可以了。,只需要特别的配置就可以了。(1)创)创建的一个新的建的一个新的Java项目项目(2)右击在新建的)右击在新建的Java项目,在弹出的菜单中选择项目,在弹出的菜单中选择

27、“Properties”(3)依次选择)依次选择“Java Build Path|Libraries”,单击,单击“Add External JARS”按钮,导航至按钮,导航至JUnit解压缩的目录,选择解压缩的目录,选择junit.jar包,打开包,打开即可。即可。(4)随便建立一个随便建立一个Java文件,右击这个文件,在菜单中选择文件,右击这个文件,在菜单中选择“new”,这,这时候里面会出现有一个时候里面会出现有一个“JUnit Test Case”选项,单击它,就可以选项,单击它,就可以创建创建JUnit测试用例了。测试用例了。独立的Junit应用步骤(1)创建一个简单的)创建一个简

28、单的java类类(2)创建该类的测试类,放于同一个目录下。类代码如下)创建该类的测试类,放于同一个目录下。类代码如下(3)编译测试类)编译测试类(4)执行测试,输入如下命令)执行测试,输入如下命令(注意这是单独的注意这是单独的“.”,表示当,表示当前路径前路径)Java junit.textui.TestRunner.TestCat如果想启动如果想启动Swing或或AWT的的Junit界面来执行测试,则输入命界面来执行测试,则输入命令令Java junit.swingui.TestRunner.TestCat借用经典的售货机借用经典的售货机Java例子来说明例子来说明JUnit测试过程测试过程

29、JUnit单元测试应用举例单元测试应用举例7.总结 测试驱动开发作为一种新的软件开发方式,越来越受到人们的关注,并且已经运用于实际的项目开发中。测试驱动开发的精髓在于:将测试方案设计工作提前,在编写代码之前先做这一项工作;从测试的角度来验证设计,推导设计;同时将测试方案当作行为的准绳,有效地利用其检验代码编写的每一步,实时验证其正确性,实现软件开发过程的“小步陕走”。测试驱动开发是一个很有影响的研究方向,它能够提高代码的质量,帮助设计出可重用和可测试性的代码。8.相关资料1.测试驱动开发.pdf2.NET软件测试实战技术大全.pdf3.The.Pragmatic.Programmers.Pragmatic.Unit.Testing.in.Csharp.Using.NUnit(2004).pdf4.测试用例设计白皮书.doc5.白盒测试方法.pdf6.NUnit2.0详细使用方法.doc7.CppUnit测试框架入门.doc8.CppUnit-Guide.doc9.CppUnit源码导读.doc10.TDD是不是以开发效率换代码质量(原标题:单元测试/TDD的成本和收益)http:/ 谢谢观看

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(测试驱动开发课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|