文章目录
- 使用Intellij来实践测试驱动开发 TDD Kata
-
- 前言
- 创建Java Maven项目
- TheBowlingGame Kata
-
- The Requirements
- Step1: 创建项目
- Step2: 新建测试类
- Step3: 编写第1个测试方法
- Step4: 运行测试
- Step5: 修复编译错误
- Step6: 再次运行测试
- Step7: 继续修改测试方法
- Step8: 修复编译错误
- Step9: 编写第2个测试方法
- Step10: 修复测试失败
- Step11: 重构测试类
- Step12: 继续重构测试类
- Step12: 编写第3个测试方法
- Step13: 修复测试失败
- Step14: 继续修复测试失败
- Step15: 重构实现类
- Step16: 重构测试类
- Step17: 编写第4个测试方法
- Step18: 修复测试失败
- Step19: 重构实现类
- Step20: 继续重构实现类
- Step21: 继续重构实现类
- Step22: 继续重构实现类
- Step23: 重构测试类
- Step24: 编写第5个测试方法
- Step25: 重构实现类
- TDD Kata小结
- Intellij常用快捷键
- 如何提升打字速度
- 参考文档
使用Intellij来实践测试驱动开发 TDD Kata
前言
本文描述了如何使用Intellij来实践测试驱动开发(TDD Kata)。
编程环境:
- Intellij IDEA 2019.3 (Mac版)
- Java 8
- Maven 3.6(配置使用阿里云Maven镜像)
- JUnit 4
创建Java Maven项目
IDEA中创建一个标准的含有JUnit的Java Maven项目的过程如下:
- File / New Project / Maven;
- 勾选"Create from archetype",选择
org.apache.maven.archetypes:maven-archetype-quickstart
- 输入Name为项目名称,选择Location为项目路径,展开Artifact Coordinates,输入GroupId为包路径,ArtifactId默认为项目名称;
- 确认信息无误后,开始创建项目;
- 点击“Open Windows”打开项目;
- 在弹出框中选择“Enable Auto-Import”;
- 编辑项目pom.xml,将
maven.compiler.source
和maven.compiler.target
改为1.8
; - 右键选择项目,Maven / Reimport;
- 删除自动生成的App和AppTest类。
也可以通用运行Maven命令一键生成项目:
mvn -B archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DarchetypeVersion=RELEASE \
-DgroupId=cn.xdevops.kata \
-DartifactId=bowling-game-kata
TheBowlingGame Kata
以Bob大叔的Bowling Game Kata为例,讲解如何通过IDEA来练习TDD Kata。
保龄球比赛计分规则:
-
保龄球的计分不难,每一局(Game)总共有十格(Frame),每一格里面有两次投球(Roll)。
-
共有十支球瓶,要尽量在两次投球之内把球瓶(Pin)全部击倒,如果第一球就把全部的球瓶都击倒了,也就是“STRIKE”,画面出现“X”,就算完成一格了,所得分数就是10分再加下两球的倒瓶数。
-
但是如果第一球没有全倒时,就要再打一球,如果剩下的球瓶全都击倒,也就是“SPARE”,画面出现“/”,也算完成一格,所得分数为10分再加下一格第一球的倒瓶数。
-
但是如果第二球也没有把球瓶全部击倒的话,那分数就是第一球加第二球倒的瓶数,再接着打下一格。
-
依此类推直到第十格,但是第十格有三球,第十格时如果第一球或第二球将球瓶全部击倒时,可再加打第三球。
参见:
在练习时只使用英文输入法,避免频繁切换输入法,和避免在中文输入法时IDEA快捷键不生效。
The Requirements
Write a class named Game
that has two methods:
roll(pins : int)
is called each time the player rolls a ball.The argument is the number of pins knocked down.score()
: int is called only at the very end of the game. It returns the total score for that game.
Step1: 创建项目
参见上面的“创建Java Maven项目”章节来创建项目:
- 项目名称:
bowling-game-kata
- GroupId:
cn.xdevops.kata
- ArtifactId:
bowling-game-kata
Step2: 新建测试类
在/src/test/java/cn.xdevops.kata
目录下创建测试类GameTest。
选择/src/test/java/cn.xdevops.kata
目录:
# 新建
Ctrl + N
# 默认选择新建Java Calss
Enter
# 输入类名
GameTest
# 确认新建
Enter
# 光标跳到下一行
Shift + Enter
Step3: 编写第1个测试方法
编写一个最差的比赛结果(每次投球都没有击倒瓶子)的测试方法:
@Test
public void testGutterGame() {
Game game = new Game();
}
因为Game类还没有创建,此时有编译错误,先忽略。
Step4: 运行测试
将光标移动到GameTest类名一行:
# 运行测试
Shift + F10
因为Game类还没有创建,此时有编译错误,所以测试失败(红)。
Step5: 修复编译错误
将光标移动到Game类名上:
# 自动修复错误
Alter + Enter
# 默认选择Create class
Enter
# 确认生成类
Enter
Step6: 再次运行测试
# 运行测试
Shift + F10
此时,测试通过(绿)。
Step7: 继续修改测试方法
切换回测试类GameTest:
# 切换类
Command + E
# 切换为上一个打开的类
Enter
在测试方法中增加逻辑:
@Test
public void testGutterGame() {
Game game = new Game();
for (int i = 0; i < 20; i ++) {
game.roll(0);
}
assertEquals(0, game.score());
}
Step8: 修复编译错误
因为有很明显的编译错误,所以我们不再运行测试类,而是先修复编译错误。
用Alt
+ Enter
来修复编译错误:
- 在
Game
类中创建roll()
方法,修改参数名为pins
; - 引入
assertEquals
; - 在
Game
类中创建score()
方法,返回值为0
。
代码示例:
public class Game {
public void roll(int pins) {
}
public int score() {
return 0;
}
}
按下Shift
+ F10
运行测试,测试通过(绿)。
Step9: 编写第2个测试方法
增加一个简单的测试方法,假设每次投球都击倒1个瓶子。
有了前面的经验,我们可以很快地写出这个测试方法。
代码示例:
@Test
public void testAllOnes() {
Game game = new Game();
for (int i = 0; i < 20; i ++) {
game.roll(1);
}
assertEquals(20, game.score());
}
按下Shift
+ F10
运行测试,因为我们还没有实现该功能,测试失败(红)。
Step10: 修复测试失败
很容易想到,只要将每次投球击倒的瓶子数量累加来作为最后的分数就可以了。
代码示例:
public class Game {
private int score = 0;
public void roll(int pins) {
score += pins;
}
public int score() {
return score;
}
}
按下Shift
+ F10
运行测试,测试通过(绿)。
Step11: 重构测试类
因为测试类中存在了重复代码,因此在继续编写新的测试方法前,需要先重构测试类。
将每个测试方法中的创建Game实例的语句抽取出来,写成JUnit的setUp()方法。
public class GameTest {
private Game game;
@Before
public void setUp() {
game = new Game();
}
@Test
public void testGutterGame() {