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

如何在CameraX的UI测试中注入假图像作为相机帧源?

CameraX假图像注入UI测试实现方案

针对使用CameraX图像分析+预览用例的场景,要在Espresso/UI Automator测试中注入假图像并验证输出,可按以下步骤实现:

1. 添加测试依赖

在模块级build.gradle中引入CameraX测试及UI测试相关依赖:

androidTestImplementation "androidx.camera:camera-testing:1.3.0"
androidTestImplementation "androidx.test.espresso:espresso-core:3.5.1"
androidTestImplementation "androidx.test.uiautomator:uiautomator:2.2.0"

2. 替换CameraX相机提供者

在测试类中,使用TestCameraProviderConfigurationRule将默认相机替换为FakeCameraProvider,以此接管相机输出:

@RunWith(AndroidJUnit4::class)
class CameraXFakeImageTest {
    @get:Rule
    val cameraProviderRule = TestCameraProviderConfigurationRule(
        CameraProviderConfiguration.Builder()
            .setCameraProviderFactory(FakeCameraProviderFactory())
            .build()
    )

    // 测试方法实现
}

3. 生成适配的假ImageProxy

创建符合预览和分析用例格式要求的假图像,用CameraX测试工具将Bitmap转换为ImageProxy:

private fun createFakeImageProxy(): ImageProxy {
    // 生成测试Bitmap(示例为红色背景图)
    val bitmap = Bitmap.createBitmap(640, 480, Bitmap.Config.ARGB_8888)
    bitmap.eraseColor(Color.RED)
    
    // 转换为CameraX分析用的ImageProxy(格式需与应用配置一致)
    return FakeImageUtil.createImageProxy(bitmap, ImageFormat.YUV_420_888)
}

4. 注入假图像并验证输出

通过FakeCamera将假图像发送到绑定的预览和分析用例,分别验证预览可见性和分析结果:

@Test
fun testFakeImageInPreviewAndAnalysis() {
    // 启动相机界面
    val scenario = launchActivity<CameraActivity>()

    // 获取FakeCamera实例
    val fakeCamera = cameraProviderRule.provider.unbindAll()[0] as FakeCamera
    val fakeImage = createFakeImageProxy()

    // 发送假图像到所有绑定用例
    fakeCamera.sendImage(fakeImage)

    // 验证预览显示:通过UI Automator截取预览View截图,检查像素特征
    val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
    val previewView = device.findObject(By.res("com.your.package:id/preview_view"))
    val screenshot = previewView.takeScreenshot()
    assertEquals(Color.RED, screenshot.getPixel(320, 240))

    // 验证图像分析结果:观察应用暴露的LiveData,确认分析回调收到假图像
    scenario.onActivity { activity ->
        activity.getResultLiveData().observeForever { result ->
            assertNotNull(result)
            assertEquals(640, result.width)
        }
    }
}

5. 应用层适配改造

为让测试能捕获图像分析结果,需在应用的图像分析回调中暴露可观察的结果:

// CameraActivity代码片段
private val analysisResultLiveData = MutableLiveData<ImageAnalysisResult>()

private val imageAnalyzer = ImageAnalysis.Analyzer { imageProxy ->
    // 执行自定义图像分析逻辑
    val result = processImageContent(imageProxy)
    analysisResultLiveData.postValue(result)
    imageProxy.close()
}

// 提供给测试获取结果的方法
fun getResultLiveData(): LiveData<ImageAnalysisResult> = analysisResultLiveData

核心注意事项

  • 假图像格式必须与应用中预览、分析用例配置的格式一致(如YUV_420_888),避免格式不兼容问题。
  • 预览验证可通过截图像素检查、Espresso视图匹配器实现;分析结果验证依赖应用层暴露的可观察数据。
  • 确保FakeCameraProvider完全替换默认相机,否则真实相机仍会启动,干扰测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:55:03