手动质量保证手动 QA 工程师

请带我了解一下您将实施的系统手动测试方法,来验证基于 **Kotlin** 的 **Android** 银行应用中与 **Visa Token Service** (VTS) 集成的安全 **NFC** 支付令牌化流程,特别是当 **NFC** 天线场强低于 -80 dBm 时的 **HCE** (Host Card Emulation) 激活,以及在 **TLS 1.3** 握手重新协商期间 **3D Secure 2.0** 无摩擦流的中断?

用 Hintsage AI 助手通过面试

问题的答案

使用基于 RF 屏蔽的方法结合 ADB logcat 监控和 Charles Proxy TLS 检查,以验证恶劣信号条件下令牌的提供和密码生成。重点关注三个关键向量:HCE 服务在 APDU 交换过程中的生命周期管理,VTS SDK 在糟糕 RF 条件下的错误处理,以及网络切换期间的 3DS2 挑战流状态保持。使用 Android StudioLogcat 过滤器记录 HEX APDU 负载,以验证 HCE HostApduService 在信号衰减模拟远离 POS 终端的物理距离时是否能正确响应 SELECT PPSEGPO 命令。维护一个测试矩阵,使 NFC 天线场强在 -60 dBm 到 -90 dBm 之间变化,同时手动切换 飞行模式 以模拟 ISO 14443 协议超时。

生活中的情况

在验证 VTS 集成的一个一级银行应用过程中,我们发现了在 NFC 场强衰减期间的一个关键竞争条件。迅速将设备移离 POS 终端时,在 GPO (获取处理选项) 命令交换过程中,HCE 服务进入了“僵尸状态”。在这种状态下,Android NFC 堆栈报告服务为活跃状态,但 Visa 小程序未能生成 应用密码 (AC),导致终端显示“卡读取错误”。

第一种方法涉及手动变化物理距离而不使用测量工具。虽然这种方法无需专业设备且任何测试人员都可以立即执行,但由于人类反应时间的问题,这种方法效果不佳,因为无法在 GPO 交换的确切时刻持续保持所需的 -80 dBm 门槛来触发 RF 场强下滑。

第二种策略探索使用自动 UI 测试与 Appium 脚本化设备移动和网络状态更改。虽然这提供了精确的时间控制,但违背了针对该特定认证要求的手动测试规定,无法模拟由于人类手握和身体组织吸收造成的复杂 RF 多径干扰。

第三种解决方案使用带有可变衰减层的 法拉第帐篷 构建了系统手动测试协议,并通过 ADB shell 命令启用 Androidnfc 服务调试标志。这一方法使测试人员能够准确控制场强,同时通过 adb logcat | grep HostApduService 观察实时 APDU 时序,但需要昂贵的 RF 测试设备,并且设置时间较长以正确校准衰减级别。

我们选择第三种方法,因为它提供了对 RF 环境的可重复控制,同时保留了手动测试所需的探索性,以发现细微的可用性问题。这种方法揭示了 HCE 服务未能正确实现 ISO 14443-4 DESELECT 命令处理程序,导致服务在活跃通信期间下的 RF 场强低于工作阈值时挂起。这一见解是通过仅仅依赖自动化测试无法获取的,因为它需要人类观察 POS 终端特定错误消息的时序。

通过在服务的 onDeactivated() 回调中实施适当的 DESELECT 处理,我们完全消除了僵尸状态。随后的回归测试确认在 400 次不同衰减方案的手动测试中没有出现幽灵交易。该应用随后在第一次提交时通过了 Visa TTE (终端集成测试) 认证,节省了三周的潜在返工时间。

候选人常常遗漏的内容


Android Logcat 时间戳具有毫秒粒度,但 EMV 规范要求微秒精度的情况下,您如何验证 APDU 响应时间约束?

您不能仅依赖 Logcat 来获取微秒时间,因此您必须结合使用 USB 协议分析仪,如 Total Phase BeagleEllisys Bluetooth/NFC 跟踪器,独立捕获原始 RF 层传输时间戳。同时,将这些硬件时间戳与 HostApduService.processCommandApdu()Logcat 中的返回值相关联,以识别处理延迟。特别是,确保 无线 响应 POS 终端在 FGT (帧保护时间) 的 242 ETU (基本时间单位) 内发生,按照 ISO 14443-4 的规范,同时手动计算 RF 捕获和 Logcat 条目之间的差值,以检测可能在高峰交易负载期间导致终端超时的 HCE 服务延迟。


SDK 返回通用错误代码 ERROR_UNKNOWN 而不是具体的 HTTP 状态码时,什么手动技术能揭示 VTS 令牌提供失败?

Visa Token Service SDK 隐藏网络错误时,您必须手动反编译调试构建的 Smali 代码,或使用 Charles Proxy 且禁用 SSL 钉扎,来拦截 VTS 客户端与 TSP (令牌服务提供者) 端点之间的 HTTPS 流量。寻找 provisionToken() API 调用并手动检查 JSON 响应中 tokenInfo.tokenStatus 字段; 如果它在提供后立即返回 INACTIVESUSPENDED,请检查 tokenInfo.errorDetails 子对象。此外,通过尝试同时在两个不同设备上提供相同的 PAN (主账户号码) 来手动触发 Provisioning ID (PID) 冲突,以验证 HCE 服务是否正确处理 HTTP 409 (冲突) 响应,提示用户停用现有令牌而不是崩溃。


Android Doze 模式或激进的 OEM 电池优化阻止 设备指纹 (3DS 请求者应用 SDK) 生成时,您如何验证 3DS2 无摩擦流程的连续性?

您必须使用 ADB 命令 (adb shell dumpsys deviceidle force-idle) 手动触发 Doze 模式,然后立即启动支付交易,观察 3DS2 SDK 是否成功收集设备参数(如 deviceIDsdkAppID),或返回一个带有不完整挑战指示符的 sdkTransID。检查 Logcat 中带有 THREE_DS 标签的条目,显示 compInd: N (完成指示符为假) 时,CReq 消息构造时。如果银行应用在 OEM 特定设置(如 Samsung设备保养XiaomiMIUI 电池节省)中被手动列入白名单并重新运行测试,则确认 无摩擦流程(未呈现挑战)仅在 设备指纹 负载包含所有必要字段时成功,从而确保在手动回归周期中验证衰退的身份验证路径和最佳路径。