2023-09-26
adb
00
请注意,本文编写于 1101 天前,最后修改于 1101 天前,其中某些信息可能已经过时。

目录

Android自动化测试中短信验证码的操作技巧
一、内容提供器机制简介
二、获取方式介绍
三、命令解析
四、实际应用
五、优化效果
六、注意事项
七、总结

Android自动化测试中短信验证码的操作技巧

一、内容提供器机制简介

Android 系统采用了内容提供器(ContentProvider)机制来管理不同应用的数据访问。内容提供器为不同应用间的数据共享提供了接口,它们像是一个中央数据仓库,各个应用可以通过内容 URI 来存取数据。 每条短信都会被存储在内容提供器的SMS ContentProvider中。SMS ContentProvider的内容 URI 地址是content://sms/inbox。所以通过操作这个内容 URI,我们可以获取存储在系统中的短信信息。

二、获取方式介绍

获取短信验证码主要有两种方式:

  1. 通过 adb shell 和 content 命令查询内容提供器,直接获取短信信息。
  2. 编写 Android 程序,通过 Android SDK 提供的 API 查询内容提供器。 本文主要介绍第一种方式,即通过 adb 命令获取短信验证码。

三、命令解析

css
adb shell 进入adb命令行模式 content query --uri <内容URI> 查询内容提供器的内容 --projection <列名> 指定查询返回的列 --where <条件> 指定查询的条件 --sort <排序方式> 指定结果排序方式 --limit <数量> 指定返回数据的最大行数

所以,我们可以通过组合这些参数,写入 adb 命令,直接查询取得短信验证码。 例如:

adb shell "content query --uri content://sms/inbox --projection body --where "address='135XXXXXXXX'"

这条命令的作用是:

  • --uri content://sms/inbox 指定查询短信内容提供器的收件箱
  • --projection body 只查询短信的 body,也就是内容列
  • --where "address='135XXXXXXXX'" 指定过滤条件,地址等于发验证码的手机号

这样我们就可以直接取得该手机号发送过来的短信验证码了。

四、实际应用

在自动化测试中,我们可能需要频繁获取短信验证码,以实现某些测试用例。 例如注册账号和重置密码时,都需要验证短信验证码。每运行一遍测试用例,都需要获取新的验证码。 为了简化这部分的处理,我们可以编写一个获取验证码的公共函数。利用 adb 命令查询短信内容提供器,获取到最近的一条短信,然后通过正则表达式解析出 6 位数字验证码。这样就可以实现一个通用的获取验证码组件。 示例代码:

python
import re import subprocess def get_verification_code(phone_number): # 构建adb命令 adb_command = f'adb shell "content query --uri content://sms/inbox --projection body --where "address=\'{phone_number}\'"' # 执行命令,取得输出 output = subprocess.check_output(adb_command).decode('utf-8') # 解析验证码 match = re.search(r'(\d{6})', output) if match: return match.group(1) return None

这样,在任意测试用例里,我们就可以直接调用该函数来获取验证码,而不需要每次都写 adb 查询的代码。

五、优化效果

  1. 将专用功能封装成函数,提高代码复用率
  2. 将 adb 命令进行参数化,使查询更通用灵活
  3. 使用正则表达式解析验证码,减少处理过程中的硬编码
  4. 分离业务代码和底层实现,降低代码耦合 以上几点优化,使得获取验证码的逻辑更清晰,也为未来可能的改造提供了方便,例如需要改用 UI 自动化工具获取时,只需要调整函数内部实现即可,外部调用方无须做任何改变。

六、注意事项

  1. 小部分 Android 系统版本需要开启 adb shell 的 root 权限,才能查询短信内容提供器
  2. 如果有多个发送方发送了验证码短信,需要额外加入限制,仅获取指定发送方的短信
  3. 短信内容提供器的数据以时间倒序排序,要获取最新短信可以加上限制行数的参数
  4. 短信内容可能以编码形式存储,需要检查是否需要提前做解码
  5. 考虑到网络及其他因素,短信接收可能有延迟,获取时需要加入重试逻辑
  6. 验证码有一定有效期,获取的验证码需要判断时间距离发送时长,避免使用过期验证码
  7. 测试环境中需要考虑重复数据的影响,保证每次获取的都是新的验证码

七、总结

本文介绍了如何通过 adb 命令查询内容提供器的方式来自动化获取短信验证码,并给出了一个示例代码实现。相比每次编写 adb 命令,封装成函数可以提高代码复用率,也使自动化测试用例的实现更简洁。同时,加入一定校验与优化,可以使获取验证码更稳定可靠。

随着测试需求的变更,我们也可以轻松调整内部实现逻辑。总之,合理利用内容提供器机制,可以帮助我们将测试用例的自动化做到更彻底。

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:李佳玮

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!