《第21部分测试驱动开发与重构.ppt》由会员分享,可在线阅读,更多相关《第21部分测试驱动开发与重构.ppt(18页珍藏版)》请在三一文库上搜索。
1、第21章 测试驱动开发与重构,暨南大学计算机科学系 黄战,目标,在案例研究的语境中介绍这两种重要的开发实践。,overview,简介,极限编程(XP)所提倡的重要测试实践是:首先编写测试。 它还提倡不断地重构代码以改进质量,包括降低冗余、提高清晰度等。 现代工具都支持这两种实践,并且有许多OO开发者信赖这些实践的价值。,测试驱动开发(测试优先开发),测试驱动开发(TDD)迭代和敏捷XP方法提倡的优秀实践。 在TDD风格的OO单元测试中,要在测试类之前编写测试代码,并且开发者要为几乎所有的产品代码编写单元测试。 TDD的基本规律是编写一小段测试代码,然后再编写一小段产品代码,保证其通过测试,然后
2、再编写更多的测试代码,依此类推。 先写测试代码,此时不妨想象被测代码已经写出来了。,测试驱动开发的优点,能够保证编写测试人们往往会忽略单元测试。 使程序员获得满足感从而更始终如一地坚持编写测试(我能够编写通过这一测试的代码吗?) 有助于澄清接口和行为的细节 可证明、可再现、自动的验证 改变事物的信心,示例,遵循以下模式完成每个测试方法: 1)创建测试固件。 2) 对其完成某些操作(你所希望测试的某些操作) 3) 评估结果是否为期望值。 我们没有先编写所有的单元测试,而是只编写了一个测试方法,在类中实现该方法并确保通过测试,然后再反复这一过程。,重构,重构是重写或重新构建已有代码的结构化和规律性
3、方法,但不会改变已有代码的外在行为,而是采用一系列少量转换的步骤,并且每一步都结合了重新执行的测试。 不断地重构代码也是XP的一个实践,该实践也适用于所有的迭代方法(包括UP)。,重构,重构的本质是: 一次实行一小步保留行为的转换(每次转换都称为“重构”)。 每次转换后,要重新执行单元测试,以保证重构不会导致错误。 重构和TDD具有关系所有的单元测试要支持重构过程。,重构,每次重构是: 少量的但是一系列的改变。 每次重构都伴随着重新执行的单元测试。 会对代码和设计产生主体性的重新构造,同时所有的重构都要保证代码的行为与过去一致。,重构的命名,Fig. 21.1,Fig. 21.2,public
4、 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+) dicei.roll(); rollTotal += dicei.getFaceValue(); Square newLoc = board.getSquare(piece.getLocation(), rollTotal); piece.setLocation(new
5、Loc); / 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 r
6、ollDice() int rollTotal = 0; for (int i = 0; i dice.length; i+) dicei.roll(); rollTotal += dicei.getFaceValue(); return rollTotal; / end of class,Fig. 21.4,/ good method name, but the logic of the body is not clear boolean isLeapYear( int year ) return ( ( ( year % 400 ) = 0 ) | ( ( ( year % 4 ) = 0 ) ,Fig. 21.5,/ thats better! boolean isLeapYear( int year ) boolean isFourthYear = ( ( year % 4 ) = 0 ); boolean isHundrethYear = ( ( year % 100 ) = 0); boolean is4HundrethYear = ( ( year % 400 ) = 0); return ( is4HundrethYear | ( isFourthYear ,Fig. 21.6,Fig. 21.7,