如何从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
相关产品推荐
相关产品推荐

