测试驱动开发TDD培训讲义.ppt_第1页
测试驱动开发TDD培训讲义.ppt_第2页
测试驱动开发TDD培训讲义.ppt_第3页
测试驱动开发TDD培训讲义.ppt_第4页
测试驱动开发TDD培训讲义.ppt_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

1 测试驱动的设计和开发 TestDrivenDesignandDevelopment 基础篇 CharlesHuang WatsonTaoWithcontributionbyEricLaowww chinaxp org 2 你的代码工作吗 这段代码很简单 不可能出错 我试过了 它是正常工作的呀 我用Debugger测试过了 我遍历了所有程序分支 内存中的值都是对的 最好的方法是写一段另外的代码来证明它 让电脑来告诉我们它是工作的 3 XP中的测试 UnitTestAcceptanceTest FunctionalTest RegressionTestNightlyTestStressTest所有的测试都应该独立地自动的运行 4 什么是单元测试 UnitTest 单元测试是一段能够放在批处理中自动运行的 用来测试Classes的程序 单元测试测试一小段代码或一个足够小的功能 单元测试程序调用这小段代码或功能 并验证返回的结果是否符合预先设定的结果 每个单元测试至少应该有两个测试例子 TestCase NegativePositive单元测试是软件工程的一个关键部分 5 什么是AcceptanceTest AcceptanceTestareprogramsorscriptsconfiguredtotestthatpackages groupsofclustersofclasses meetexternalrequirementsandachievegoals suchasperformance Theyincludescreen drivingprogramsthattestGUIsfromwithout AcceptanceTest是对软件做End To End的测试 衡量软件是否符合用户需求的指标 也就是验收测试 6 什么是RegressionTest Regressiontestingistheprocessofvalidatingmodifiedpartsofthesoftwareandensuringthatnonewerrorsareintroducedintopreviouslytestedcode 一句话 RegresstionTest就是要重新测试所有的代码和功能 RegressionTest和DevelopmentTest的不同在于RegressionTest需要重用已经建立的所有的测试单元 UnitTest 和功能测试套件 FunctionalTest RegressionTest的基础是完整的自动单元测试和功能测试 7 什么是NightlyTest NightlyTest就是每晚自动运行所有的UnitTest和AcceptanceTest NightlyTest是XP中的ContinuousTest的一个练习 Practice NightlyTest可以准确的反映项目开发的进度和质量 8 NightlyTest NightlyTest是软件开发中一个保证开发之质量的最有效的方法 也是衡量软件之质量和开发效率的最好的指标 NightlyTest就是每天工作结束 所有的代码都Checkin到SourceControl后 自动运行所有的UnitTest和FunctionTest 测试的结果应该自动分发给开发人员和管理层 两个指标数值 测试例子的通过率 单元测试必须是100 通过 FunctionalTest应该按计划的通过 单元测试的覆盖率 表明有多少Class被测试过和测试的完善程度 9 测试优先的编程 在写任何代码之前 先写它的UnitTest Neverwritealineoffunctionalcodewithoutabrokentestcase KentBeckTest FirstProgramming是一种测试技术吗 Test FirstProgramming首先是一种分析方法 它迫使程序员仔细思考要做什么和不要做什么 而不是如何具体的实现 特别是各种例外的情况 并用程序语言正式的写下来 这就好像在程序员的任务和程序员之间签订了一个清晰的正式合同 Test FirstProgramming是一种设计方法 UnitTest测试的事程序 而不是一个想法 程序员必须清晰的定义程序的界面才能写出它的UnitTest 而这时程序员是不知道 也不需要知道 里面的具体逻辑是如何实现的 程序员只需要考虑Class的界面和功能 Responsibility 啊 你在做OO设计了 Test FirstProgramming是一种质量控制方法 QualityControl 如何控制质量呢 如何知道我的程序是否运行呢 我会不会漏了什么 运行一下UnitTest Test FirstProgramming是一种重构和优化的方法 我们总希望自己的代码可以漂亮 运行的效率高 所以我们会不断地去改进 可是如何保证改进和优化后的质量呢 会不会越改越糟 答案还是UnitTest Test FirstProgramming不是通常意义上的测试技术 它的目的也不是仅仅用来测试你的代码 Test FirstProgramming是一种面向对象的开发方法 10 什么是Test DrivenDesign TDD Test DrivenDesign是一种开发风格 它要求程序员做到 在写产品代码之前 先写它的单元测试 UnitTests 没有单元测试的Class不允许作为产品代码单元测试例子决定了如何写产品代码不断地成功运行所有的单元测试例子不断的完善单元测试例子Test DrivenDesign是把需求分析 设计 质量控制量化的过程 11 为什么会出现TDD 现实中的设计 Design 和测试 Testing 面对一个新的开发任务 往往第一个念头就是如何去实现它呢 好像是这样做的 感觉上差不多了 抓起任务就开始编码 一边写 一边修改和设计 哎 时间很紧 我先把任务实现了 然后再好好测试 还是不工作 时间不多了 做个快速但丑陋的修改吧 等有空来再来重新整理这些代码吧 用Debugger运行几次代码 走完所有的我认为可能的分支 我感觉这些代码应该行了 提交吧 哎 我也知道该写一些自动的单元测试来把刚才在Debugger中的测试走一遍 可是那是很多的活啊 这种情况要作自动测试太复杂了 还是手工作一下测试好了 12 为什么会出现TDD Continue 程序员心中的测试 很郁闷的工作 对啊 程序员该做些新的 有创意的东西嘛 写一些新的功能会更有趣些 我知道这些代码会工作的 我的经验和感觉都这样告诉我 只要没人乱改我的代码 应该就没问题 再说这些边缘情况几乎不可能出现了 测试是QA的工作 自动测试太花时间 我要赶Deadline 不值得 13 如何面对这些现实和想法 Test DrivenDesignandDevelopment真的能行 试一试 14 如何做TestDrivenDesignandDevelopment 再开发一个新的功能之前首先确定你要做什么 不是要如何做 比如说一个论坛的增加用户的功能 我们需要又一个method来增加一个用户 publicvoidaddAccount Accountaccount 当然包括成功增加一个用户 在数据库中插入一条纪录 还包括如果已经由一个相同的用户 应该返回一个用户已存在的消息OK 我们知道这个method中的这段代码要做什么 而且这段代码也足够简单 15 如何做TestDrivenDesignandDevelopment Continue 然后为这个功能 Method 写单元测试例子 UnitTest 单元测试例子要覆盖这个Method的 做什么 所以我们至少有了两个测试例子 TestCase1 测试成功增加一个用户TestCase2 测试增加一个已存在的用户其他边缘情况测试 TestCase3 传入的Account对象为NULL 16 如何做TestDrivenDesignandDevelopment Continue 写Production代码我们清楚知道这段代码需要做什么 因为我们有另一段代码摆在那里 清晰的表明这段代码的Contracts 不用多 也不能少 只需要能实现再UnitTest中的Contracts和能够通过它的UnitTest 17 如何做TestDrivenDesignandDevelopment Continue 运行UnitTest如果顺利通过 你已经很好的完成了你的任务 如果没通过 修补代码直到能通过UnitTest为止 如果出现在UnitTest中没预先设定的结果 在UnitTest中增加一个TestCase 修补代码直到通过所有的TestCase为止 18 TDD和PSP PersonalSoftwareProcess的Development Design Code Build Test Test DrivenDesignandDevelopment Analysis CodeUnitTest Code Build RunTest Analysis Design 19 XP采用了TDD TDD是ExtremeProgramming中必须遵行的一个方法 TDD是XP中PairProgramming的工作模式 XP中把测试驱动的设计和开发做到极致 TDD的整个流程由两个程序员一起执行 XP正是因为采用了TDD才能够做到每天的代码都是ProductionCode和每个小的Release都能提供具备Production质量的代码并投入使用 有了TDD XP才能降低风险 去拥抱变化 有了TDD XP才能在计划的时间内完成计划质量的代码 有了TDD XP才能减少CodeFix环节 从而减少项目成本 有了TDD XPTeam才能对自己的工作充满自信 20 TDD防止Over Engineering 在开发中采用TDD 可以有效的避免过度设计和开发 如果程序员不愿为一个Method写测试例子或者认为现在没有必要测试改Method 那这个Method多半是现在不需要的 21 TDD 程序员和管理层 对程序员来说 通过运行UnitTest和FunctionalTest 每天下班的时候都可以清楚的知道自己的代码是work的 对管理层来说 通过NightlyTest的结果 每天一早都清楚的知道项目的质量和开发进度 22 XP中谁来写Tests Developer UnitTestAcceptanceTest FunctionalTest Customer AcceptanceTestCustomer为每一个UserStory写FunctionalTest 但通常用户并不具备设计和开发FunctionalTest的能力 需要程序员的帮助 23 什么时候写Tests 如果你要写一个新的功能 请先写她的测试例子如果你要在没有经过测试的代码上写新的功能 请先写目前代码的测试例子如果你要Fix一个Bug 请先为这个Bug写一个测试例子如果你要Refactor没有测试过的代码 请先写一个测试例子如果你发现一个边缘例外值 请为她写一个测试例子 24 ExtremeUnit JunitJavaClass的测试FrameworkJFCUnitJavaSwingapp的测试FrameworkCatusJavaServerSide EJB Servlet 的测试FrameworkHTMLUnitHtmlPage的测试FrameworkHTTPUnitHtmlPage的测试FrameworkCPPUnitC 测试Framework NetUnit Netapp的测试Framework 25 Junit Asample Junit是由kentBeck和ErichGamma编写的一个opensource的测试框架 用来编写可重复的测试例子 测试论坛中的增加用户methodpublicclassAccountDAOmySqlimplementsAccountDAO Addauseraccount paramAccount Aaccountobjectthatcontainstheuserinfo likeuserName password email publicvoidaddAccount finalAccountaccount throwsSQLException AccountAlreadyExistException 26 Junit Asample 1 为对应的JavaClass建立一个TestCase UnitTestCase应该放在和BusinessClass相同的Package中 但在不同的的物理位置 packageorg redsoft forum dao mysqlimportjunit framework TestCase importjunit framework TestSuite importjunit framework Test publicclassAccountDAOmySqlTestextendsTestCase publicAccountDAOmySqlTest Stringname super name 27 Junit Asample 2 OverridesetUp andtearDown 如果需要 可以在setUp 中初始化需要的全局变量 资源等 比如DatabaseConnection FileI O或MockObjects等 相应的 可以在tearDown 中释放资源 DatabaseConnection FileI O和MockObjects等 publicclassAccountDAOmySqlTestextendsTestCase privateMysqlFixturemysqlFixtureIns newMysqlFixture publicvoidsetUp throwsException mysqlFixtureIns setUp publicvoidtearDown throwsException mysqlFixtureIns tearDown 28 Junit Asample 3 为被测试的Method写TestCase publicvoidtestAddAccountNormal AccountDAOmySqldao newAccountDAOmySql Accountaccount newAccount USER NAME charles charles hhb try dao addAccount account Accountaccount new dao findByUserName account getUserName assertEquals Expectingcharles account getUserName account new getUserName assertEquals Expectingcharles account getPassword account new getPassword assertEquals Expectingcharles account getEmail account new getEmail dao removeAccount account getUserName catch finalExceptione e printStackTrace fail Unexpectedexception e toString 29 Junit Asample publicvoidtestAddAccountAlreadyExist AccountDAOmySqldao null Accountaccount null try AddanAccount dao addAccount account fail AccountAlreadyExistExceptionexpected catch finalSQLExceptione e printStackTrace fail Unexpectedexception e toString catch finalAccountNotFoundExceptionnotFound notFound printStackTrace fail Unexpectedexception notFound toString catch finalAccountAlreadyExistExceptionex Passtry dao removeAccount account getUserName catch finalSQLExceptionsql sql printStackTrace fail Unexpectedexception 30 Junit ASample 运行这个UnitTest Junit提供两种运行界面 Swing junit swingui TestRunner C sandbox forum java classpath classes lib junit jar lib mysql jdbc jar lib Tidy jar lib struts jarjunit swingui TestRunnerorg redsoft forum dao mysql AccountDAOmySqlTest 31 Junit ASample Text界面 junit textui TestRunner 32 JunitTestSuite TestSuite用来运行所有的UnitTestsTestSuite的数型结构 org redsoft forum AllTest org redsoft forum dao AllTest org redsoft forum dao mysql AllTest org redsoft forum util AllTest每个PackageLevel都由一个AllTestTestSuite在每个TestSuite中 加入在本packagelevel中的所有单元测试例子 UnitTestCases 加入子Packagelevel中的所有AllTestSuite 33 JunitTestSuite packageorg redsoft forum dao publicclassAllTests publicstaticvoidmain Stringargs junit textui TestRunner run suite publicstaticTestsuite TestSuitesuite newTestSuite 加入子package中的AllTestsuitesuite addTest org redsoft forum dao mysql AllTests suite 加入本packagelevel中的UnitTestcasesuite addTestSuite MysqlDataSourceTest class returnsuite EOC 34 JFCUnit 一个Junit的Extension 用来测试Swing based的Application 一个最简单的Sample 测试一个LoginScreen 35 JFCUnit 代码片断 设置测试环境privateLoginScreenloginScreen null privateTestHelperhelper null publicLoginScreenTest Stringname super name protectedvoidsetUp throwsException super setUp helper newJFCTestHelper loginScreen newLoginScreen LoginScreenTest getName loginScreen setVisible true protectedvoidtearDown throwsException loginScreen null helper cleanUp this super tearDown 代码片断 测试图形界面JDialogdialog JButtonexitButton JButton helper findNamedComponent ExitButton loginScreen 0 assertNotNull CouldnotfindtheExitbutton exitButton JButtonenterButton JButton helper findNamedComponent EnterButton loginScreen 0 assertNotNull

温馨提示

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

评论

0/150

提交评论