返回

提升 Android 单元测试水平之事件测试

Android

引子

Android 的单元测试如何进行配置,在网络上有大量的文章去介绍,这里不再重复。但是单元测试并不是光配置起来就完事了的,如何真正地测试一些实际的点,是这篇记录需要重点关注的事情。

有一个 case 是,有一个 button 上在点击事件发生的时候,做了防抖动的处理,他使用的方案是:

  1. 在点击事件发生时,创建一个 Handler 并设置一个延迟执行的任务,这个任务会在指定的时间后执行。
  2. 如果在指定的时间内,又发生了一次点击事件,那么取消上一个延迟执行的任务,并创建一个新的延迟执行的任务。
  3. 如果在指定的时间内,没有发生任何点击事件,那么执行延迟执行的任务。

事件测试的实现

要在单元测试中测试这个防抖动处理是否正确工作,我们可以使用 Espresso 测试框架。Espresso 是一个专门用于 Android UI 测试的框架,它可以模拟用户在设备上执行各种操作,比如点击、滑动、输入等。

要使用 Espresso 进行事件测试,首先需要在项目中添加 Espresso 的依赖:

dependencies {
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

然后,就可以开始编写测试代码了。以下是一个测试防抖动处理是否正确工作的测试用例:

@RunWith(AndroidJUnit4::class)
class ButtonDebounceTest {

    @Rule
    @JvmField
    val activityRule = ActivityScenarioRule(MainActivity::class.java)

    @Test
    fun testDebounce() {
        // Find the button in the layout.
        val button = activityRule.scenario.onActivity { activity ->
            activity.findViewById<Button>(R.id.button)
        }

        // Simulate a click on the button.
        Espresso.onView(button).perform(ViewActions.click())

        // Wait for the debounce period.
        Thread.sleep(500)

        // Simulate another click on the button.
        Espresso.onView(button).perform(ViewActions.click())

        // Verify that the button was only clicked once.
        Espresso.onView(button).check(ViewAssertions.matches(ViewMatchers.hasPerformClickCount(1)))
    }
}

在这个测试用例中,我们首先使用 ActivityScenarioRule 来创建一个 Activity 实例,然后使用 Espresso.onView() 方法来找到要测试的按钮。接下来,我们使用 ViewActions.click() 方法来模拟用户点击按钮。然后,我们使用 Thread.sleep() 方法来等待防抖动处理的延迟时间。最后,我们再次使用 Espresso.onView() 方法来找到要测试的按钮,并使用 ViewAssertions.matches() 方法来验证按钮只被点击了一次。

如果这个测试用例通过,那么就说明防抖动处理工作正常。

结束语

以上就是如何在 Android 单元测试中进行事件测试的示例。通过使用 Espresso 测试框架,我们可以模拟用户在设备上执行各种操作,从而测试我们的应用程序是否按预期工作。