专栏文章 测试日记: 接口测试中如何跳过验证码?

Jerry li · 2019年02月01日 · 最后由 Jerry li 回复于 2022年05月10日 · 5042 次阅读

遇到问题

项目在做一个新的模块,其中有部分功能需要通过邮箱获取验证码后,才能进行下一步的验证。
在进行相关接口自动化时,需要解决如何获取验证码的问题。

问题描述

正常的业务流程如下(以找回密码功能为例):

1. 用户输入邮箱点击获取验证码  此时会调用接口 1 到后台生成验证码发送到用户邮箱
2. 用户在邮箱中查收邮件获取到验证码后填写到页面中点击下一步进行验证 此时会调用接口 2把验证码传到后台进行验证
3. 用户输入新密码后调用接口3 把邮箱验证码新密码传到后台进行更新

目前在做接口 2 和 3 时,需要获取到正确的验证码来使用。

思路分析

遇到这个问题,有以下的思路:

  • 1. 让开发修改代码,暂时屏蔽验证码的验证。 这种方式虽然可以解决自动化的执行问题,但是会修改到业务逻辑,带来额外的风险。
  • 2. 让开发配置一个万能的验证码,接口中固定传这个值,可以验证成功。 同样,这种方式等于留了个后门,带来安全隐患。
  • 3. 想办法从后台获取到正确的验证码。

从上面分析来看,只能采取第三种思路进行解决。

功能实现流程分析

与开发人员沟通,得知这部分功能的实现如下:

验证码的生成和流向如下:

  • 1. 调用获取验证码接口: 生成验证码
  • 2.1 验证码保存到 redis 中。
  • 2.2 验证码发送到邮件服务。
  • 3 验证码发送到用户邮箱。
  • 4.验证接口收到验证码后,从 redis 中取出对应验证码进行验证。

问题解决

从上面的流程分析,关键在于如何确保接口里传的验证码和 redis 里的验证码匹配。 有两种比较容易实现的方案解决问题:

  • 1. 调用获取验证码接口,然后从 redis 中获取对应的验证码。
  • 2. 跳过生成验证码的接口,直接按规则生成对应的 redis key,将验证码保存到 redis 中。

分析对比,第一种方案需要先调用一次获取验证码的接口,然后从 redis 读取; 而第二种方案只需将生成的验证码保存到 redis 中即可。第二种方案更佳。

代码实现

python 下 redis 的操作:

def connectRedis():   # 连接redis 
    import redis
    pool = redis.ConnectionPool(host='yourhost', password='yourpassword', port=yourport,db='dbname')
    r = redis.StrictRedis(connection_pool=pool)
    return r

def setKeyToRedis(key,value):    # 插入验证码
    r = connectRedis()
    return r.set(key,value)

测试用例调用:

# 正常场景:发送验证码是否成功。
def test_send_validate_code(self):
    key = 'your_redis_key_formart'     # 按开发的规则生成key
    validateCode = new_validate_code()     # 随机生成验证码
    setKeyToRedis(keyvalidateCode)   # 将验证码事先插入到redis 中
    time.sleep(2)
    result =api_main(data)     # 调用接口
    self.assertEqual(result['code'],code_success)      # 验证接口返回
    self.assertEqual(result['msg'],msg_success)

方案总结

优点:

  • 解决了接口获取验证码的问题,实现接口自动化的覆盖
  • 只额外调用了将验证码插入到 redis 的动作,成本很低

缺点:

  • 测试代码需要连接 redis 的相关密码,因此目前只能在内网测试环境执行。 正式环境不能采取这种方案。

扩展

在 UI 自动化时,可以采用同样的方式跳过验证码的限制。

共收到 2 条回复 时间 点赞
仅楼主可见
cheese 回复

不清楚你要多完整的代码,最重要的实现上面已经列出来了

3楼 已删除
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册