教程:使用 Kotlin 进行测试驱动开发
最后修改时间:2023 年 9 月 1 日无论您喜欢在编写生产代码之前编写测试,还是喜欢在编写生产代码之后创建测试,IntelliJ IDEA 都可以轻松创建和运行单元测试。在本教程中,我们将首先展示如何使用 IntelliJ IDEA 编写测试(测试驱动开发或 TDD)。
创建新项目
启动 IntelliJ IDEA。
如果欢迎屏幕打开,请单击“新建项目”。否则,从主菜单中选择文件| 新 | 项目。
从左侧列表中,选择“新建项目”。为新项目命名
TDD-in-Kotlin
并根据需要更改其位置。选择 Kotlin 作为该项目的语言,Gradle作为构建工具,Kotlin作为 DSL。
从JDK列表中,选择要在项目中使用的JDK 。
如果您的计算机上安装了 JDK,但未在 IDE 中定义,请选择“添加 JDK”并指定 JDK 主目录的路径。
如果您的计算机上没有必要的 JDK,请选择“下载 JDK”。
单击创建。
IntelliJ IDEA 创建一个具有预配置结构和基本库的项目。
创建一个新包
右键单击主 | 在Project工具窗口中打开kotlin文件夹,然后选择New | 包裹。
为新包命名
com.example.demo
并按。Enter
编写测试体
创建您的第一个测试
鉴于我们首先编写测试,但不一定拥有我们正在测试的代码,因此我们将通过项目面板创建第一个测试。
右键单击测试根文件夹并选择新建| Kotlin 类/文件.
在打开的弹出窗口中,将新包和测试类命名为:
com.example.demo.CalculatorTest
。将插入符号放在类中的大括号内,然后按。AltInsert
从菜单中选择测试函数以从默认模板创建测试函数。选择 JUnit 5 作为测试框架。
将函数命名为
testMultiplyBy2
,按,插入符号将出现在函数体中。Enter您可以更改默认的测试函数模板- 例如,如果您希望将函数名称的开头从 更改
test
为should
。
编写测试体
为不存在的类和函数编写测试代码似乎有悖常理,但 IntelliJ IDEA 使这变得简单,同时让编译器满意。IntelliJ IDEA 可以为您创建类和函数(如果它们尚不存在)。
编写测试来描述您想要实现的目标,按下任何不存在的类并选择Create class。这将为您提供一个让编译器满意的最小实现。AltEnter
键入
val calculator = Calculator()
,按,然后选择创建类“计算器”。AltEnter从“选择类”容器中,选择“提取到单独的文件”。在打开的对话框中,选择我们之前创建的com.example.demo包。
main
继续编写测试主体,包括您需要但不存在的函数名称。
键入
val result = calculator.parse("2 * 2")
并按。选择“创建成员函数”以使 IntelliJ IDEA 创建一个裸骨架函数。AltEnter实现测试的函数,使其返回所需的类型并且编译时不会出现问题。现在结果的正确性并不重要。
向测试函数添加断言。该语句将函数的实际返回值与预期返回值进行比较,从而确定测试的结果。类型
assertEquals(4, result)
如果函数尚未自动导入,请将插入符号置于 处
assertEquals
,按,选择导入函数,然后选择。AltEnterorg.jetbrains.kotlin:kotlin-test
运行测试
当遵循 TDD 方法时,通常您会经历红-绿-重构的循环。您将运行一个测试,看到它失败(变成红色),实现最简单的代码以使测试通过(变成绿色),然后重构代码,使您的测试保持绿色并且代码足够干净。
此周期的第一步是运行测试并查看它是否失败。
鉴于我们已使用 IntelliJ IDEA 功能来创建我们正在测试的方法的最简单的空实现,我们不希望测试能够通过。
在测试内部,按运行此单独测试。CtrlShiftF10
结果将显示在运行对话框中。测试名称旁边会有一个图标 - 红色表示异常,黄色表示断言失败。对于任一类型的故障,还会显示一条消息,说明出现的问题。
实施代码
下一步是让测试通过,这意味着实现最简单的可行方法。
您可以使用常用功能导航到正在测试的代码 - 单击函数名称,在插入符号位于函数名称上时按,或者按在测试代码和生产代码之间切换。CtrlAlt0BCtrlShift0T
对函数进行更改以使测试通过。通常,对于 TDD,最简单的方法可能就是对您的期望值进行硬编码。稍后我们将看到迭代此过程将如何产生更现实的生产代码。
重新运行测试,用于重新运行上次测试。ShiftF10
查看测试通过 - 测试功能旁边的图标应变为绿色。如果没有,请进行所需的更改,直到测试通过。
迭代
开发代码是一个迭代过程。当遵循 TDD 风格的方法时,情况更是如此。为了消除更复杂的行为,我们添加了针对其他情况的测试。
在您的测试类中,再次使用创建一个新的测试函数。AltInsert
选择第二个测试用例,指定您正在测试的功能的更多要求。请记住,您可以使用 IntelliJ IDEA 的功能来创建类和函数以使编译器满意。
运行第二个测试用例,显示它因正确原因而失败。
更改正在测试的函数中的代码以使该测试通过。
通过在测试类内部(而不是在单个函数内)按来重新运行这两个测试,然后查看这两个测试现在都通过了。如果任一测试失败,请对代码进行所需的更改以确保测试通过。CtrlShiftF10
概括
以测试优先的方式编写第一个测试需要少量的设置 - 创建测试类,创建测试方法,然后创建最终将成为生产代码的代码的空实现。IntelliJ IDEA 可以自动完成大部分初始设置。
当您迭代该过程、创建测试,然后进行使这些测试通过所需的更改时,您可以为所需的功能构建一套全面的测试,以及满足这些要求的最简单的解决方案。
感谢您的反馈意见!