您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 测试驱动开发培训讲义
1测试驱动开发2主题测试驱动开发的基本概念测试驱动的基本流程测试驱动的所采用的技术及工具DEMO3测试驱动开发的基本概念为什么会出现测试驱动开发什么是测试驱动测试驱动所要达到的目标4测试驱动蕴含的哲学原理将复杂事情简单化–让注意力关注在单一的事物上–分解–Hardcode–重构5为什么会出现TDD—程序员当有一个新的开发任务时,往往第一个念头就是如何去实现它呢?“应该是这么做的吧,嗯,差不多就是这样的”。抓起任务就开始编码,一边写,一边修改和设计。时间这么紧!我还是先实现任务吧,然后再好好测试。还是不工作,时间不多了。不管了,还是先做个实现,以后再来整理代码吧。我已经单步调试了好几次了,遍历了所有可能的分支,应该不会有问题了,提交,今天可以好好休息一下了要不要写单元测试把我刚才单步调试的步骤写下来啊?那样是很好,但工作量很大哦这样的情况要作自动测试太复杂了。还是手工测试一下吧。程序员应该做些有创意的东西,这样才有趣啊测试是QA的事,我为什么要做啊,我做了他们干什么啊6为什么会出现TDD—程序员奇怪了,怎么代码跟开发文档上有这么大的差别啊?这段代码究竟想表达什么意思?代码现在越来越乱了,我都不敢修改代码了,修改了这个地方,天晓得会引起多少别的地方出错啊!这个地方的代码怎么好象在那个地方看到过啊?这个程序里怎么会有这么多的重复代码呢?7为什么会出现TDD—QA开发部在干什么啊,BUG怎么这么多,他们有没有自己先测试一下啊这下好了,让他们修改了一个BUG,现在一下子来了这么多的BUG他们到底在搞什么啊,有没有从用户的角度考虑啊,我新增一个采购订单,订单项竟然可以输入负数。8有办法可以解决上面的矛盾吗?9XP中的测试UnitTest(基本不提倡,只对特别功能)FunctionalTest(AcceptanceTest)RegressionTestNightlyTestIntegrationTestStressTest所有的测试都应该独立地自动的运行10什么是FunctionTest11什么是RegressionTest“Regressiontestingistheprocessofvalidatingmodifiedpartsofthesoftwareandensuringthatnonewerrorsareintroducedintopreviouslytestedcode.”一句话,RegresstionTest就是要重新测试所有的代码和功能。RegressionTest和DevelopmentTest的不同在于RegressionTest需要重用已经建立的所有的测试单元(UnitTest)和功能测试套件(FunctionalTest)。RegressionTest的基础是完整的自动单元测试和功能测试。12什么是NightlyTestNightlyTest就是每晚自动运行所有的UnitTest和AcceptanceTest。NightlyTest是XP中的ContinuousTest的一个练习(Practice)。NightlyTest可以准确的反映项目开发的进度和质量。13NightlyTestNightlyTest是软件开发中一个保证开发之质量的最有效的方法,也是衡量软件之质量和开发效率的最好的指标。NightlyTest就是每天工作结束,所有的代码都Checkin到SourceControl后,自动运行所有的UnitTest和FunctionTest。测试的结果应该自动分发给开发人员和管理层。两个指标数值:测试例子的通过率–单元测试必须是100%通过。FunctionalTest应该按计划的通过。单元测试的覆盖率–表明有多少Class被测试过和测试的完善程度。14测试优先的编程在写任何代码之前,先写它的FunctionTest。“Neverwritealineoffunctionalcodewithoutabrokentestcase”KentBeckTest-FirstProgramming是一种测试技术吗?Test-FirstProgramming首先是一种分析方法。它迫使程序员仔细思考要做什么和不要做什么(而不是如何具体的实现)。特别是各种例外的情况,并用程序语言正式的写下来。这就好像在程序员的任务和程序员之间签订了一个清晰的正式合同。Test-FirstProgramming是一种设计方法。FunctionTest测试的是程序,而不是一个想法。程序员必须清晰的定义程序的验收条件才能写出它的FunctionTest。而这时程序员是不知道(也不需要知道)里面的具体逻辑是如何实现的。程序员只需要考虑Class的界面和功能(Responsibility)。啊,你在做OO设计了。Test-FirstProgramming是一种质量控制方法(QualityControl)。如何控制质量呢?如何知道我的程序是否运行呢?我会不会漏了什么?运行一下FunctionTest。Test-FirstProgramming是一种重构和优化的方法。我们总希望自己的代码可以漂亮,运行的效率高,所以我们会不断地去改进。可是如何保证改进和优化后的质量呢?会不会越改越糟?答案还是FunctionTest。Test-FirstProgramming不是通常意义上的测试技术,它的目的也不是仅仅用来测试你的代码。Test-FirstProgramming是一种面向对象的开发方法。15什么是Test-DrivenDesign(TDD)Test-DrivenDesign是一种开发风格,它要求程序员做到:在写产品代码之前,先写它的功能测试(FunctionTests)没有功能测试的Class不允许作为产品代码功能测试例子决定了如何写产品代码不断地成功运行所有的功能测试例子不断的完善功能测试例子Test-DrivenDesign是把需求分析,设计,质量控制量化的过程!16什么是测试驱动测试驱动是一种开发形式:1.首先要编写测试代码2.除非存在相关测试,否则不编写任何的产品代码3.由测试来决定需要编写什么样的代码4.利用IDE,根据测试代码驱动功能代码编译成功,再运行成功5.要求维护一套详尽的测试集17测试驱动所要达到的目标cleancodethatwork测试驱动所追求的目标就是代码整洁可用,其实现的规则就是:1.只有测试失败时,我们才写代码2.消除重复设计,优化设计结构3.测试代码的业务含义明确(DSL)18测试驱动开发的基本流程定义应用程序的要求熟悉应用程序的功能区域,确定要使用的单项功能项或功能要求创建验证要求的测试列表为功能或要求定义接口和类编写测试代码运行测试根据测试生成产品代码重新运行测试,根据测试修改产品代码,直到所有测试都通过整理代码重复上面的步骤19测试驱动开发的基本流程20测试驱动编码时的典型场景根据需求的验收条件编码测试用例根据编译结果(编译不通过),将编译不通过的地方,驱动功能代码的编码,视编译通过在编译全部通过后,运行测试用例,修改测试不通过部分的功能代码(hardcode),使测试代码运行成功将hardcode部分逐个修改为真实的业务逻辑,并运行测试代码通过重构21测试驱动的工具与技术功能测试重构的基本概念,及在测试驱动中的地位重构的时机每日构建代码质量API(Findbug、checkstyle、Jester、代码统计、测试数据统计)模拟对象(建议只在单元测试中使用)22功能测试什么是功能测试?_是黑盒测试,单元测试是白盒测试–功能测试是开发者编写的一小段代码,用来验证被检测代码的一个很小的,很明确的功能是否正确功能测试的优点–可以明确地验证功能的正确性,提高开发速度和质量,加速了代码重构的过程–是一种设计行为–功能测试可以表现为文档化–具有回归性,可以随时随地的快速的运行测试来验证代码的准确性23重构的基本概念什么是重构?重构是一个过程:在不改变软件的外在行为的前提下,对代码做出修改,以改进程序的内部结构。提高其可理解性,降低其修改成本。24重构的好处重构可以改进软件设计重构使软件更加容易理解重构可以帮助找出BUG重构可以提高编程速度25重构的时机存在重复的时候当我们觉察到代码或代码所表达的意图不明确的时候代码有味道的时候(我们的代码可能存在问题的时候)26DEMO:货币算法27ToDOList当法郎与美元的兑换率为2:1的时候,5美元+10法郎=10美元5美元*2=10美元28总结(1)TDD的通用过程–快速新增一个测试–运行所有的测试–针对测试不通过的地方进行修改–运行所有的测试,并且全部通过–重构–运行所有的测试,并且全部通过29总结(2)积累代码质量API–建立测试与需求的对应关系,需求测试度–测试完成时,编译运行的次数、变动代码行数–测试运行的时间曲线(间隔)–重构的次数,每次重构的代码行数–质量控制工具的运行次数、相关参数30TDD防止Over-Engineering在开发中采用TDD,可以有效的避免过度设计和开发。如果程序员不愿为一个Method写测试例子或者认为现在没有必要测试改Method,那这个Method多半是现在不需要的。31TDD,程序员和管理层对程序员来说,通过运行UnitTest和FunctionalTest,每天下班的时候都可以清楚的知道自己的代码是work的。对管理层来说,通过NightlyTest的结果,每天一早都清楚的知道项目的质量和开发进度。32XP中谁来写TestsDeveloper:UnitTestAcceptanceTest(FunctionalTest)Customer:AcceptanceTest用户为每一个UserStory写FunctionalTest。但通常用户并不具备设计和开发FunctionalTest的能力,需要程序员的帮助。可以开发工具把需求的验收条件翻译为功能测试用例代码33什么时候写Tests?如果你要写一个新的功能,请先写她的测试例子如果你要在没有经过测试的代码上写新的功能,请先写目前代码的测试例子如果你要Fix一个Bug,请先为这个Bug写一个测试例子如果你要Refactor没有测试过的代码,请先写一个测试例子如果你发现一个边缘例外值,请为她写一个测试例子34预告:基于web页面的测试驱动PageObject模式webdriver35谢谢大家!
本文标题:测试驱动开发培训讲义
链接地址:https://www.777doc.com/doc-2318895 .html