SuperAPI AI 工具集

android-testing

测试与质量

查看项目

更新于 10-17 16:16

技能介绍

用途

该技能为现代 Android 应用测试提供专家指导,灵感来自 "Now in Android" 项目。它覆盖单元测试(Unit Tests)、Hilt 集成测试(Hilt Integration Tests)与截图测试(Screenshot Testing),帮助开发者建立完整的测试策略。

测试金字塔

技能将测试分为三个层次:

  • 单元测试(Unit Tests):快速、隔离逻辑,针对 ViewModels、Repositories 等。
  • 集成测试(Integration Tests):测试交互,例如 Room DAOs、Retrofit 与 MockWebServer。
  • UI/截图测试(UI/Screenshot Tests):验证 UI 正确性(Compose)。

依赖配置

技能要求在 libs.versions.toml 中配置正确的测试依赖,示例包括:

[libraries]
junit4 = { module = "junit:junit", version = "4.13.2" }
kotlinx-coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "kotlinxCoroutines" }
androidx-test-ext-junit = { group = "androidx.test.ext", name = "junit", version = "1.1.5" }
espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version = "3.5.1" }
compose-ui-test = { group = "androidx.compose.ui", name = "ui-test-junit4" }
hilt-android-testing = { group = "com.google.dagger", name = "hilt-android-testing", version.ref = "hilt" }
roborazzi = { group = "io.github.takahirom.roborazzi", name = "roborazzi", version.ref = "roborazzi" }

使用 Roborazzi 进行截图测试

截图测试用于确保 UI 不会出现视觉回归。NiA 使用 Roborazzi,因为它运行在 JVM 上(速度快),无需模拟器。

设置

在 libs.versions.toml 中添加插件:

[plugins]
roborazzi = { id = "io.github.takahirom.roborazzi", version.ref = "roborazzi" }

在模块的 build.gradle.kts 中应用:

plugins {
    alias(libs.plugins.roborazzi)
}

编写截图测试

@RunWith(AndroidJUnit4::class)
@GraphicsMode(GraphicsMode.Mode.NATIVE)
@Config(sdk = [33], qualifiers = RobolectricDeviceQualifiers.Pixel5)
class MyScreenScreenshotTest {

    @get:Rule
    val composeTestRule = createAndroidComposeRule<ComponentActivity>()

    @Test
    fun captureMyScreen() {
        composeTestRule.setContent {
            MyTheme {
                MyScreen()
            }
        }

        composeTestRule.onRoot()
            .captureRoboImage()
    }
}

Hilt 测试

使用 HiltAndroidRule 在测试中注入依赖:

@HiltAndroidTest
class MyDaoTest {

    @get:Rule
    var hiltRule = HiltAndroidRule(this)

    @Inject
    lateinit var database: MyDatabase
    private lateinit var dao: MyDao

    @Before
    fun init() {
        hiltRule.inject()
        dao = database.myDao()
    }
    
    // ... tests
}

运行测试

  • 单元测试:./gradlew test
  • 截图测试:./gradlew recordRoborazziDebug(录制)/ ./gradlew verifyRoborazziDebug(验证)

适用场景

适用于需要为现代 Android 应用(尤其是使用 Compose、Hilt、Room、Retrofit 的项目)建立测试策略的开发者,帮助组织单元测试、集成测试与截图测试。

限制

资料未提供关于该技能的具体版本要求、兼容性范围、性能数据或收费信息,暂未提供。