Android自动化测试中操作技巧合集(建议收藏)

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

一、内容提供器机制简介

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

二、获取方式介绍

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

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

三、命令解析

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'" 指定过滤条件,地址等于发验证码的手机号

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

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036

四、实际应用

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

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

七、总结

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

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

最后: 可以在我的VX公众号:【自动化测试老司机】免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦! 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值