当你创建一个新的Android项目时, Junit4会自动成为你的依赖项. 然而, JUnit5是下一代JUnit. 所以为什么不把默认的JUnit4依赖迁移到闪亮的新JUnit5呢? 然后我们就可以看看 JUnit5 的一些花哨功能了.
注: 我将只关注新创建应用的迁移. 如果你的项目已经有了JUnit4测试, 那么你就需要更多步骤才能完全迁移到JUnit5.
从 JUnit4 迁移到 JUnit5
由于我们在新创建的Android应用中没有任何测试(除了assertEquals(4, 2 + 2)示例测试), 我们可以继续将依赖关系改为testImplementation(“org.junit.jupiter:junit-jupiter:5.9.2”).
build.gradle(:app)
当我们同步 Gradle 时, 就能替换 @Test 注解和 assert 导入.
然而, 删除旧的导入并尝试运行测试后, 会出现以下错误.
让 JUnit5 运行的第二步, 也是最后一步, 是在 build.gradle 的 android 作用域中添加以下代码.
build.gradle(:app)
注意: 请参阅
testOptions的Android Plugin DSL. 很棒的资源.
现在你的 ExampleUnitTest 应该通过了.
JUnit5 的一些花哨功能
当你想为测试提供多个值时, @ParameterizedTest就是你要找的. 你实现的测试将针对你提供的每个源运行. 下面的测试运行 6 次. 字符串值 4 次 + 空值 1 次 + 空字符串 1 次.
参数化测试的另一个有用, 简单且强大的注解是 @EnumSource. 我为这个参数源截取了 2 个示例代码.
一个方法运行所有参数
当我们有一个枚举类时, 为所有枚举类制定一个共享规则是很常见的. @EnumSource是我们要测试这类情况的注解.
上面的测试针对的是枚举类的属性. 我们也可以对使用枚举类的其他函数进行测试. 主要的想法是在一个测试中涵盖所有的枚举值.
枚举类的子集
我们有一个相同的枚举类, 但多了一个属性.
JUnit5 帮助我们以直观的方式测试特定的枚举值.
我们要做的就是添加枚举名称的字符串值.
查看 @MethodSource, 传递多个参数以及 @ValueSource 不支持的类对象.
动态测试
这是对 JUnit4 的重要补充, 因为它通过Executable为测试人员提供了更多控制(当然, 它在 Kotlin 上看起来更好). 我还需要多加练习, 才能对它的性能或优势有更多的了解.
下面是一个我认为有用的示例.
假设我们有一个视图模型, 它有一个当前页面的UI状态. 我们要测试的规则是页面递增直到当前页面为 10. 顺序很重要. 让我们看看动态测试会如何帮助我们.
因此, 我们也可以使用简单的 @Test 注解来编写这段代码, 但是当流程和逻辑变得复杂时, 使用DynamicTest会更容易. 对我来说, 这看起来非常简洁.
正如我所说的, 我需要对动态测试进行更多实验, 但它看起来很有前途.
现在你知道如何开始为新创建的android项目编写JUnit5测试了. 你还知道@ParameterizedTest注解超级有用, 而且易于编写. 最后, 如果你想提高单元测试水平, 你就会知道动态测试是JUnit5的必经之路.
