教程:测试驱动开发
无论您是喜欢在编写生产代码之前编写测试,还是喜欢之后再创建测试,IntelliJ IDEA 都可以轻松创建和运行单元测试。 在本教程中,您将学习如何使用 IntelliJ IDEA 优先编写测试(测试驱动开发或 TDD)。
创建项目
创建一个新项目
启动 IntelliJ IDEA。
如果欢迎屏幕打开,请点击 新建项目。 否则,请转到主菜单中的 。
从左侧列表中选择 Java。
请为新项目命名,例如:
情绪分析器,并在必要时更改其位置。选择 Gradle 作为构建工具并选择 Groovy 作为 DSL。
从 JDK 列表中选择您想在项目中使用的 JDK。
如果 JDK 已安装在您的计算机上,但未在 IDE 中定义,请选择 添加 JDK 并指定 JDK 主目录的路径。
如果您的计算机上没有必要的 JDK,请选择 下载JDK。
点击 创建。
IntelliJ IDEA 创建了一个具有预配置结构和基本库的项目。 build.gradle 文件中将添加 JUnit 5 作为依赖项。
创建新的软件包
右键点击 文件夹 在 项目 工具窗口中选择 。
请为新包命名
com.example.demo并按 Enter。
编写测试主体
创建您的第一个测试
考虑到我们先编写测试,而不一定需要代码已对我们可用,我们将在项目面板中创建第一个测试,并将其放置在一个包中。
右键点击测试根文件夹
并选择 。
在弹出窗口中,请为新包和测试类命名:
com.example.demo.MoodAnalyserTest。
将文本光标放在类中的大括号内,按 Alt+Insert。
请从菜单中选择 测试方法 来根据默认模板创建测试方法。
将方法命名为
testMoodAnalysis,按 Enter ,文本光标将停留在方法体内。
您可以更改 默认测试方法模板——例如,若要将方法名称的开头从
测试更改为should。
从测试中新建类
虽然为不存在的类和方法编写测试代码看起来有悖常理,但 IntelliJ IDEA 可以使这一过程变得简单,同时让编译器满意。 IntelliJ IDEA 可以为您创建类和方法,如果它们还不存在的话。
请输入
new MoodAnalyser,按 Alt+Enter ,并选择 创建类“MoodAnalyser”。
在打开的对话框中,选择
com.example.demo包位于 main | java 文件夹中,然后点击 OK。
创建变量
和往常一样,您可以使用 IntelliJ IDEA 的 重构工具创建变量来存储结果,同时如果正确的库在类路径中,IntelliJ IDEA 将为您导入最合适的类。
切换回测试类,将光标放置在
new MoodAnalyser之后,输入()并按 Ctrl+Alt+V 以调用 提取/引入变量 重构。将新变量命名为
moodAnalyser。
完成测试主体
继续编写测试主体,包括您需要但不存在的方法名称。
在测试类中,输入以下语句:
moodAnalyser.analyseMood("This is a sad message");analyseMood将被标记为未解析的引用。请将文本光标放在
analyseMood,按 Alt+Enter ,然后点击 在 'MoodAnalyser' 中创建方法 'analyseMood'。
请确保
情绪分析器类如下所示:public class MoodAnalyser { public String analyseMood(String message) { return null; } }
在测试类中,将文本光标置于
analyseMood,按 Ctrl+Alt+V ,并输入mood。
添加一个断言语句
打开 build.gradle 文件,添加以下依赖项并点击
以导入更改:
dependencies { testImplementation( 'org.hamcrest:hamcrest-library:2.2' ) }在 MoodAnalyserTest 中,添加以下语句:
assertThat(mood, CoreMatchers.is("SAD"));按 Alt+Enter 导入缺失的方法和类。
代码
至此,您的测试类和生成类应如下所示:
运行测试
在遵循 TDD 方法时,通常会经历一个 红-绿-重构的周期。 您将运行一个测试,看到它失败(变为红色),实现最简单的代码以使测试通过(变为绿色),然后重构代码,以便您的测试保持绿色且您的代码足够干净。
在此循环中的第一步是运行测试并查看其失败。
鉴于我们使用 IntelliJ IDEA 功能创建了该方法的最简单空实现,我们不期望测试通过。
在测试内部,按 Ctrl+Shift+F10 运行此单个测试。
结果将显示在 运行工具窗口 中。 测试名称旁将有一个图标——红色表示异常,黄色表示断言失败。 对于任意类型的故障,还会显示说明问题出在哪里的消息。

实现代码
下一步是使测试通过,这意味着要实现最简单可行的方案。 通常在 TDD 中,最简单的起作用的方法可能是硬编码您的预期值。 稍后我们将看到,如何重复此过程将导致更实际的生产代码。
修复测试
在 情绪分析器 中,用
null替换SAD返回值:return "SAD";。重新运行测试,使用 Shift+F10 重新运行上次测试。
请查看测试通过情况——测试方法旁边的图标应变为绿色。

迭代
开发代码是一个迭代过程。 在遵循 TDD 风格的方法时,这一点更是如此。 为了推动更复杂的行为,我们为其他情况添加测试。
添加第二个测试用例
在您的测试类中,再次使用 Alt+Insert 创建一个新的测试方法。 请命名为
HappyMoods。将以下代码添加到您的类中。
@Test void HappyMoods() { MoodAnalyser moodAnalyser = new MoodAnalyser(); String mood = moodAnalyser.analyseMood("This is a happy message"); assertThat(mood, CoreMatchers.is("HAPPY")); }
通过按 Alt+Shift+R 运行此第二个测试用例,您将看到它失败。

修复第二个测试
更改正在测试的方法中的代码以使此测试通过:
package com.example.demo; public class MoodAnalyser { public String analyseMood(String message) { if (message.contains(("sad"))) { return "SAD"; } else { return "HAPPY"; } } }通过按下 Ctrl+Shift+F10 在测试类中重新运行这两个测试,而不是在单个方法中,并查看现在两个测试都通过。

汇总
首次以测试优先的方式编写测试需要进行一些设置——创建测试类、创建测试方法,然后创建最终将成为生产代码的代码的空实现。 IntelliJ IDEA 自动化了很多初始设置。
当您重复进行此过程、创建测试并进行所需的更改以使这些测试通过时,您将为所需功能构建一套全面的测试套件,以及满足这些要求的最简单解决方案。