第21部分测试驱动开发重构.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第21部分测试驱动开发重构

第21章 测试驱动开发与重构 暨南大学计算机科学系 黄战 目标 在案例研究的语境中介绍这两种重要的开发实践。 overview 简介 极限编程(XP)所提倡的重要测试实践是:首先编写测试。 它还提倡不断地重构代码以改进质量,包括降低冗余、提高清晰度等。 现代工具都支持这两种实践,并且有许多OO开发者信赖这些实践的价值。 测试驱动开发(测试优先开发) 测试驱动开发(TDD)迭代和敏捷XP方法提倡的优秀实践。 在TDD风格的OO单元测试中,要在测试类之前编写测试代码,并且开发者要为几乎所有的产品代码编写单元测试。 TDD的基本规律是编写一小段测试代码,然后再编写一小段产品代码,保证其通过测试,然后再编写更多的测试代码,依此类推。 先写测试代码,此时不妨想象被测代码已经写出来了。 测试驱动开发的优点 能够保证编写测试--人们往往会忽略单元测试。 使程序员获得满足感从而更始终如一地坚持编写测试(我能够编写通过这一测试的代码吗?) 有助于澄清接口和行为的细节 可证明、可再现、自动的验证 改变事物的信心 示例 遵循以下模式完成每个测试方法: 1)创建测试固件。 2) 对其完成某些操作(你所希望测试的某些操作) 3) 评估结果是否为期望值。 我们没有先编写所有的单元测试,而是只编写了一个测试方法,在类中实现该方法并确保通过测试,然后再反复这一过程。 重构 重构是重写或重新构建已有代码的结构化和规律性方法,但不会改变已有代码的外在行为,而是采用一系列少量转换的步骤,并且每一步都结合了重新执行的测试。 不断地重构代码也是XP的一个实践,该实践也适用于所有的迭代方法(包括UP)。 重构 重构的本质是: 一次实行一小步保留行为的转换(每次转换都称为“重构”)。 每次转换后,要重新执行单元测试,以保证重构不会导致错误。 重构和TDD具有关系--所有的单元测试要支持重构过程。 重构 每次重构是: 少量的但是一系列的改变。 每次重构都伴随着重新执行的单元测试。 会对代码和设计产生主体性的重新构造,同时所有的重构都要保证代码的行为与过去一致。 重构的命名 提炼方法(Extract Method) 将较长的方法转换为短小的方法,其中将原有方法,其中将原有方法中的部分内容分解为私有的帮助者方法(helper method) 提炼常量(Extract Constant) 使用常量变量(constant variable)替换字面常量 引入解释变量(提炼局部变量的特化) 将表达式的部分或完整结果置入临时变量,该变量的名字应该能够说明其目的 使用工厂方法替代构造器调用 例如Java中,调用创建对象的帮助者方法(helper method)来代替对新操作和构造器的调用(隐藏细节) Fig. 21.1 Fig. 21.2 public class Player { private Piece piece; private Board board; private Die[] dice; // … public void takeTurn() { // roll dice int rollTotal = 0; for (int i = 0; i dice.length; i++) { dice[i].roll(); rollTotal += dice[i].getFaceValue(); } Square newLoc = board.getSquare(piece.getLocation(), rollTotal); piece.setLocation(newLoc); } } // end of class Fig. 21.3 public class Player { private Piece piece; private Board board; private Die[] dice; // … public void takeTurn() { // the refactored helper method int rollTotal = rollDice(); Square newLoc = board.getSquare(piece.getLocation(), rollTotal); piece.setLocation(newLoc); } private int rollDice() { int rollTotal = 0; for (int i = 0; i dice.length; i++) { dice[i].roll(); rollTotal += dice[i].getFaceValue(); } return rollTotal; }

文档评论(0)

181****7127 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档