使用Intellij来实践测试驱动开发 TDD Kata

本文详细介绍了如何使用Intellij IDEA进行测试驱动开发(TDD),通过一个名为'The Bowling Game'的Kata展示了TDD的步骤。从创建Java Maven项目开始,逐步编写测试和实现代码,涉及JUnit、Maven配置、快捷键和提高打字速度的技巧。文章还总结了TDD的关键原则,包括红-绿-重构和小步快跑。
摘要由CSDN通过智能技术生成

使用Intellij来实践测试驱动开发 TDD Kata

前言

本文描述了如何使用Intellij来实践测试驱动开发(TDD Kata)。

编程环境:

创建Java Maven项目

IDEA中创建一个标准的含有JUnit的Java Maven项目的过程如下:

  1. File / New Project / Maven;
  2. 勾选"Create from archetype",选择org.apache.maven.archetypes:maven-archetype-quickstart
  3. 输入Name为项目名称,选择Location为项目路径,展开Artifact Coordinates,输入GroupId为包路径,ArtifactId默认为项目名称;
  4. 确认信息无误后,开始创建项目;
  5. 点击“Open Windows”打开项目;
  6. 在弹出框中选择“Enable Auto-Import”;
  7. 编辑项目pom.xml,将maven.compiler.sourcemaven.compiler.target改为1.8
  8. 右键选择项目,Maven / Reimport;
  9. 删除自动生成的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() {
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值