测试驱动开发
最后修改时间:2023 年 8 月 24 日无论您喜欢在编写生产代码之前编写测试,还是喜欢在编写生产代码之后创建测试,IntelliJ IDEA 都可以轻松创建和运行单元测试。在本教程中,我们将首先展示如何使用 IntelliJ IDEA 编写测试(测试驱动开发或 TDD)。
创建一个项目
创建新项目
启动 IntelliJ IDEA。
如果欢迎屏幕打开,请单击“新建项目”。否则,从主菜单中选择文件| 新 | 项目。
从左侧列表中,选择“新建项目”。
例如,为新项目命名:
MoodAnalyser
并根据需要更改其位置。选择 Java 作为该项目的语言。
选择Gradle作为构建工具,选择Groovy作为 DSL。
从JDK列表中,选择要在项目中使用的JDK 。
如果您的计算机上安装了 JDK,但未在 IDE 中定义,请选择“添加 JDK”并指定 JDK 主目录的路径。
如果您的计算机上没有必要的 JDK,请选择“下载 JDK”。
单击创建。
IntelliJ IDEA 创建一个具有预配置结构和基本库的项目。JUnit 5 将作为依赖项添加到build.gradle文件中。
创建一个新包
右键单击主 | 项目工具窗口中的java文件夹并选择New | 包裹。
为新包命名
com.example.demo
并按。Enter
编写测试体
创建您的第一个测试
鉴于我们首先编写测试,但不一定拥有我们正在测试的代码,我们将通过项目面板创建第一个测试并将其放入包中。
右键单击测试根文件夹并选择新建| Java 类。
在打开的弹出窗口中,将新包和测试类命名为:
com.example.demo.MoodAnalyserTest
。将插入符号放在类中的大括号内,然后按。AltInsert
从菜单中选择测试方法以从默认模板创建测试方法。
将方法命名为
testMoodAnalysis
,按,插入符号将出现在方法主体中。Enter您可以更改默认的测试方法模板- 例如,如果您希望将方法名称的开头从 更改
test
为should
。
从测试创建一个新类
为不存在的类和方法编写测试代码似乎违反直觉,但 IntelliJ IDEA 使这变得简单,同时让编译器满意。IntelliJ IDEA 可以为您创建类和方法(如果它们尚不存在)。
键入
new MoodAnalyser
,按,然后选择创建类“MoodAnalyser”。AltEnter在打开的对话框中,选择main |
com.example.demo
中的包 java文件夹并单击“确定”。
创建变量
与往常一样,您可以使用 IntelliJ IDEA 的重构工具创建变量来存储结果,如果正确的库位于类路径上,IntelliJ IDEA 将为您导入最合适的类。
切换回测试类,键入
()
并按以调用提取/引入变量重构。CtrlAlt0V将新变量命名为
moodAnalyser
。
提示
将插入符号放在源代码中的测试类或测试主题上,然后按可在它们之间快速导航。或者,使用分屏模式同时查看两个文件。CtrlShift0T
完成测试体
继续编写测试主体,包括您需要但不存在的方法的名称。
在测试类中,输入以下语句:
moodAnalyser.analyseMood("This is a sad message");
analyseMood
将被标记为未解决的参考。将插入符号放在 处
analyseMood
,按,然后单击Create method 'analysisMood' in 'MoodAnalyser'。AltEnter确保该类
MoodAnalyser
如下所示:public class MoodAnalyser { public String analyseMood(String message) { return null; } }
在测试类中,将插入符号放在 处
analyseMood
,按,然后键入。CtrlAlt0Vmood
添加断言语句
打开build.gradle文件,添加以下依赖项并单击导入更改:
dependencies { testImplementation( 'org.hamcrest:hamcrest-library:2.2' ) }
在MoodAnalyserTest中,添加以下语句:
assertThat(mood, CoreMatchers.is("SAD"));
按 导入缺少的方法和类。AltEnter
此时,您的测试和生产类应如下所示:
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 功能来创建我们正在测试的方法的最简单的空实现,我们不希望测试能够通过。
在测试内部,按运行此单独测试。CtrlShiftF10
结果将显示在运行对话框中。测试名称旁边会有一个图标 - 红色表示异常,黄色表示断言失败。对于任一类型的故障,还会显示一条消息,说明出现的问题。
实施代码
下一步是让测试通过,这意味着实现最简单的可行方法。通常,对于 TDD,最简单的方法可能就是对您的期望值进行硬编码。稍后我们将看到迭代此过程将如何产生更现实的生产代码。
修复测试
在MoodAnalyser中,替换
null
为SAD
返回值:return "SAD";
。重新运行测试,用于重新运行上次测试。ShiftF10
查看测试通过 - 测试方法旁边的图标应变为绿色。
迭代
开发代码是一个迭代过程。当遵循 TDD 风格的方法时,情况更是如此。为了消除更复杂的行为,我们添加了针对其他情况的测试。
添加第二个测试用例
在您的测试类中,再次使用来创建新的测试方法。命名它。AltInsert
HappyMoods
将以下代码添加到您的类中。使用重构工具添加变量。
@Test void HappyMoods() { MoodAnalyser moodAnalyser = new MoodAnalyser(); String mood = moodAnalyser.analyseMood("This is a happy message"); assertThat(mood, CoreMatchers.is("HAPPY")); }
按 运行第二个测试用例,显示它因正确原因而失败:在“运行”工具窗口中,单击“单击以查看差异”链接以在“差异”查看器中打开详细信息。AltShift0R
修复第二个测试
更改正在测试的方法中的代码以使此测试通过:
package com.example.demo; public class MoodAnalyser { public String analyseMood(String message) { if (message.contains(("sad"))) { return "SAD"; } else { return "HAPPY"; } } }
通过在测试类内部(而不是在单个方法内部)按来重新运行这两个测试,然后查看这两个测试现在都通过了。CtrlShiftF10
概括
以测试优先的方式编写第一个测试需要少量的设置 - 创建测试类,创建测试方法,然后创建最终将成为生产代码的代码的空实现。IntelliJ IDEA 可以自动完成大部分初始设置。
当您迭代该过程、创建测试,然后进行使这些测试通过所需的更改时,您可以为所需的功能构建一套全面的测试,以及满足这些要求的最简单的解决方案。
感谢您的反馈意见!