IntelliJ IDEA 2025.1 Help

教程:测试驱动开发

无论您是喜欢在编写生产代码之前编写测试,还是喜欢之后再创建测试,IntelliJ IDEA 都可以轻松创建和运行单元测试。 在本教程中,您将学习如何使用 IntelliJ IDEA 优先编写测试(测试驱动开发或 TDD)。

创建项目

创建一个新项目

  1. 启动 IntelliJ IDEA。

    如果欢迎屏幕打开,请点击 新建项目。 否则,请转到主菜单中的 文件 | 新建 | 项目

  2. 从左侧列表中选择 Java

  3. 请为新项目命名,例如: 情绪分析器 ,并在必要时更改其位置。

  4. 选择 Gradle 作为构建工具并选择 Groovy 作为 DSL。

  5. JDK 列表中选择您想在项目中使用的 JDK

    如果 JDK 已安装在您的计算机上,但未在 IDE 中定义,请选择 添加 JDK 并指定 JDK 主目录的路径。

    如果您的计算机上没有必要的 JDK,请选择 下载JDK

  6. 点击 创建

IntelliJ IDEA 创建了一个具有预配置结构和基本库的项目。 build.gradle 文件中将添加 JUnit 5 作为依赖项。

创建新的软件包

  1. 右键点击 main | java 文件夹 在 项目 工具窗口中选择 新建 | 软件包

  2. 请为新包命名 com.example.demo 并按 Enter

编写测试主体

创建您的第一个测试

考虑到我们先编写测试,而不一定需要代码已对我们可用,我们将在项目面板中创建第一个测试,并将其放置在一个包中。

  1. 右键点击测试根文件夹 并选择 新建 | Java 类

    在弹出窗口中,请为新包和测试类命名: com.example.demo.MoodAnalyserTest

    测试类已创建
  2. 将文本光标放在类中的大括号内,按 Alt+Insert

  3. 请从菜单中选择 测试方法 来根据默认模板创建测试方法。

    将方法命名为 testMoodAnalysis ,按 Enter ,文本光标将停留在方法体内。

    创建您的第一个测试

    您可以更改 默认测试方法模板——例如,若要将方法名称的开头从 测试 更改为 should

从测试中新建类

虽然为不存在的类和方法编写测试代码看起来有悖常理,但 IntelliJ IDEA 可以使这一过程变得简单,同时让编译器满意。 IntelliJ IDEA 可以为您创建类和方法,如果它们还不存在的话。

  1. 请输入 new MoodAnalyser ,按 Alt+Enter ,并选择 创建类“MoodAnalyser”

    从测试中创建新类
  2. 在打开的对话框中,选择 com.example.demo 包位于 main | java 文件夹中,然后点击 OK

    选择目标包

创建变量

和往常一样,您可以使用 IntelliJ IDEA 的 重构工具创建变量来存储结果,同时如果正确的库在类路径中,IntelliJ IDEA 将为您导入最合适的类。

  1. 切换回测试类,将光标放置在 new MoodAnalyser 之后,输入 () 并按 Ctrl+Alt+V 以调用 提取/引入变量 重构。

  2. 将新变量命名为 moodAnalyser

    Tdd extract variable

完成测试主体

继续编写测试主体,包括您需要但不存在的方法名称。

  1. 在测试类中,输入以下语句:

    moodAnalyser.analyseMood("This is a sad message");

    analyseMood 将被标记为未解析的引用。

  2. 请将文本光标放在 analyseMood ,按 Alt+Enter ,然后点击 在 'MoodAnalyser' 中创建方法 'analyseMood'

    Ij tdd create method
  3. 请确保 情绪分析器 类如下所示:

    public class MoodAnalyser { public String analyseMood(String message) { return null; } }
    编写测试主体
  4. 在测试类中,将文本光标置于 analyseMood ,按 Ctrl+Alt+V ,并输入 mood

    引入变量 'mood'

添加一个断言语句

  1. 打开 build.gradle 文件,添加以下依赖项并点击 同步 Gradle 更改 以导入更改:

    dependencies { testImplementation( 'org.hamcrest:hamcrest-library:2.2' ) }
  2. MoodAnalyserTest 中,添加以下语句:

    assertThat(mood, CoreMatchers.is("SAD"));

    Alt+Enter 导入缺失的方法和类。

代码

至此,您的测试类和生成类应如下所示:

package com.example.demo; public class MoodAnalyser { public String analyseMood(String message) { return null; } }
package com.example.demo; import org.hamcrest.CoreMatchers; import org.junit.jupiter.api.Test; import static org.hamcrest.MatcherAssert.assertThat; public class MoodAnalyserTest { @Test void testMoodAnalysis() { MoodAnalyser moodAnalyser = new MoodAnalyser(); String mood = moodAnalyser.analyseMood("This is a sad message"); assertThat(mood, CoreMatchers.is("SAD")); } }

运行测试

在遵循 TDD 方法时,通常会经历一个 红-绿-重构的周期。 您将运行一个测试,看到它失败(变为红色),实现最简单的代码以使测试通过(变为绿色),然后重构代码,以便您的测试保持绿色且您的代码足够干净。

在此循环中的第一步是运行测试并查看其失败。

鉴于我们使用 IntelliJ IDEA 功能创建了该方法的最简单空实现,我们不期望测试通过。

  • 在测试内部,按 Ctrl+Shift+F10 运行此单个测试。

    结果将显示在 运行工具窗口 中。 测试名称旁将有一个图标——红色表示异常,黄色表示断言失败。 对于任意类型的故障,还会显示说明问题出在哪里的消息。

    运行测试

实现代码

下一步是使测试通过,这意味着要实现最简单可行的方案。 通常在 TDD 中,最简单的起作用的方法可能是硬编码您的预期值。 稍后我们将看到,如何重复此过程将导致更实际的生产代码。

修复测试

  1. 情绪分析器 中,用 null 替换 SAD 返回值: return "SAD";

  2. 重新运行测试,使用 Shift+F10 重新运行上次测试。

    请查看测试通过情况——测试方法旁边的图标应变为绿色。

    重新运行测试

迭代

开发代码是一个迭代过程。 在遵循 TDD 风格的方法时,这一点更是如此。 为了推动更复杂的行为,我们为其他情况添加测试。

添加第二个测试用例

  1. 在您的测试类中,再次使用 Alt+Insert 创建一个新的测试方法。 请命名为 HappyMoods

  2. 将以下代码添加到您的类中。

    @Test void HappyMoods() { MoodAnalyser moodAnalyser = new MoodAnalyser(); String mood = moodAnalyser.analyseMood("This is a happy message"); assertThat(mood, CoreMatchers.is("HAPPY")); }
    添加第二个测试
  3. 通过按 Alt+Shift+R 运行此第二个测试用例,您将看到它失败。

    添加第二个测试

修复第二个测试

  1. 更改正在测试的方法中的代码以使此测试通过:

    package com.example.demo; public class MoodAnalyser { public String analyseMood(String message) { if (message.contains(("sad"))) { return "SAD"; } else { return "HAPPY"; } } }
  2. 通过按下 Ctrl+Shift+F10 在测试类中重新运行这两个测试,而不是在单个方法中,并查看现在两个测试都通过。

    第二个测试通过

汇总

首次以测试优先的方式编写测试需要进行一些设置——创建测试类、创建测试方法,然后创建最终将成为生产代码的代码的空实现。 IntelliJ IDEA 自动化了很多初始设置。

当您重复进行此过程、创建测试并进行所需的更改以使这些测试通过时,您将为所需功能构建一套全面的测试套件,以及满足这些要求的最简单解决方案。

最后修改日期: 2025年 4月 24日