如何在Espresso UI测试中通过biometric生物识别验证?
Espresso测试中通过生物识别指纹校验环节的实操方案
Android从API 28开始官方就提供了生物识别的测试支持,不需要root、不需要篡改业务逻辑,按下面的步骤配置就能直接跑通流程:
前置准备
- 先给app模块的androidTest配置添加biometric依赖,版本和你主工程集成的androidx.biometric版本保持一致即可:
// build.gradle 依赖配置 androidTestImplementation 'androidx.biometric:biometric:1.2.0'
- 准备测试环境:用模拟器/开启了开发者选项的真机,提前在系统设置里录入至少1个指纹(模拟器录指纹不需要真的触摸传感器,跟着引导点完成就行),不要给设备设置图案/密码等会拦截生物识别弹窗的强校验锁屏。
测试代码实现
不要尝试用Espresso直接匹配系统生物识别弹窗上的控件——系统弹窗属于系统UI进程,你的测试apk没有权限访问,直接找控件100%报NoMatchingViewException。
正确的实现逻辑是用官方biometric库提供的测试注入接口,直接给业务层返回认证结果:
@RunWith(AndroidJUnit4::class) class BiometricFlowTest { @get:Rule val activityRule = ActivityScenarioRule(LoginActivity::class.java) @Test fun test_login_with_fingerprint_success() { // 先执行触发指纹弹窗的前置操作,比如点击指纹登录按钮 onView(withId(R.id.btn_fingerprint_login)).perform(click()) // 等待弹窗弹出后,注入认证成功结果,直接绕过指纹采集环节 // 这一步会直接触发你业务代码里BiometricPrompt.AuthenticationCallback的onAuthenticationSucceeded回调 BiometricPromptTestUtils.setNextAuthenticationResult( BiometricPrompt.AuthenticationResult( null, // 如果你业务里用了CryptoObject就传对应实例,没用到直接传null BiometricPrompt.AUTHENTICATION_RESULT_TYPE_BIOMETRIC ) ) // 后续直接写正常测试断言即可,比如校验是否跳转到首页 onView(withId(R.id.home_page_container)).check(matches(isDisplayed())) } }
如果不想额外引入测试依赖,也可以在弹窗弹出时直接执行adb命令模拟指纹按压,这个方案兼容旧版FingerprintManager场景,所有版本系统通用:
# 命令里的1对应你在系统里录入的第一个指纹的ID,录的第二个就传2,以此类推 adb emu finger touch 1
如果要测试认证失败的场景,把注入的结果换成BiometricPrompt.ERROR_LOCKOUT、BiometricPrompt.ERROR_NOT_RECOGNIZED对应的错误结果就行,不需要真的模拟按错指纹。
常见坑点
- 测试前一定要确认设备BiometricManager返回
BIOMETRIC_SUCCESS状态,没录指纹、硬件不支持的状态下根本弹不出认证弹窗,后续流程必然失败。 - 如果项目自己封装了生物识别层,不要在封装层拦截过滤BiometricPrompt的回调,不然测试注入的结果会被吞掉。
- API 28以下的旧系统没有官方测试注入接口,直接用模拟器+adb命令模拟的方式最稳,不用花时间适配低版本真机。
内容的提问来源于stack exchange,提问作者MeNoVa
相关产品推荐
相关产品推荐

