测试驱动开发和重构.pptVIP

  • 2
  • 0
  • 约2.53千字
  • 约 18页
  • 2019-08-29 发布于广东
  • 举报
第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)

1亿VIP精品文档

相关文档