You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Gradle托管设备运行的Android模拟器复制UITest数据?

在Gradle托管设备中收集UITest截图与Cucumber报告

方法一:测试代码中直接写入主机共享目录

Gradle托管设备会自动建立主机与模拟器的共享目录,测试时将文件写入模拟器内的context.filesDir路径,运行后文件会同步保留在主机的build/outputs/managed_device_android_test_additional_output/[设备ID]/files目录下。

示例代码(保存UITest截图):

// 在UITest类中实现截图保存逻辑
fun captureScreenshot(screenshotName: String) {
    val uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
    val screenshotBytes = uiDevice.takeScreenshot()
    val outputFile = File(InstrumentationRegistry.getInstrumentation().targetContext.filesDir, "$screenshotName.png")
    FileOutputStream(outputFile).use { stream ->
        stream.write(screenshotBytes)
    }
}

测试结束后,直接到主机的build/outputs/managed_device_android_test_additional_output/下找到对应设备的子目录,即可提取截图文件。

方法二:通过Gradle任务自动收集输出

在模块的build.gradle.kts中配置托管设备的额外输出规则,或添加任务在测试完成后主动复制目标文件:

android {
    testOptions {
        managedDevices {
            devices {
                create<ManagedVirtualDevice>("pixel6") {
                    device = "Pixel 6"
                    apiLevel = 33
                    systemImageSource = "google"
                    // 自定义额外输出目录(可选)
                    additionalOutputDir = layout.buildDirectory.dir("managed_device_custom_output")
                }
            }
        }
    }

    // 配置任务,测试完成后复制截图与报告到指定目录
    tasks.withType<Test>().configureEach {
        afterTest { _, result ->
            // 可根据测试结果过滤,仅收集失败用例的输出
            if (result.resultType == TestResult.ResultType.FAILURE) {
                val sourceDir = layout.buildDirectory.dir("managed_device_android_test_additional_output/pixel6/files")
                val targetDir = layout.buildDirectory.dir("test_outputs")
                copy {
                    from(sourceDir)
                    into(targetDir)
                    include("*.png", "*.json", "*.html")
                }
            }
        }
    }
}

方法三:配置Cucumber直接生成报告到主机目录

Gradle托管设备会将主机的项目根目录挂载到模拟器的/data/local/tmp/gradle_project路径,因此可以在Cucumber配置中指定相对主机的输出路径:

@CucumberOptions(
    features = ["features"],
    glue = ["com.example.test.cucumber"],
    plugin = [
        "json:../../../../../../build/reports/cucumber/cucumber.json",
        "html:../../../../../../build/reports/cucumber/cucumber.html"
    ]
)
class CucumberTestRunner : AndroidJUnit4()

通过多层../回到模拟器挂载的项目根目录,再指向主机的build/reports/cucumber目录,测试完成后直接在该路径下获取生成的Cucumber报告。


内容的提问来源于stack exchange,提问作者Lutzifer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 19:45:41