项目在做一个新的模块,其中有部分功能需要通过邮箱获取验证码后,才能进行下一步的验证。
在进行相关接口自动化时,需要解决如何获取验证码的问题。
正常的业务流程如下(以找回密码功能为例):
1. 用户输入邮箱。点击获取验证码。 此时会调用接口 1 到后台生成验证码、发送到用户邮箱。
2. 用户在邮箱中查收邮件,获取到验证码后,填写到页面中,点击下一步进行验证。 此时会调用接口 2,把验证码传到后台进行验证。
3. 用户输入新密码后,调用接口3 ,把邮箱、验证码、新密码传到后台进行更新。
目前在做接口 2 和 3 时,需要获取到正确的验证码来使用。
遇到这个问题,有以下的思路:
从上面分析来看,只能采取第三种思路进行解决。
与开发人员沟通,得知这部分功能的实现如下:
验证码的生成和流向如下:
从上面的流程分析,关键在于如何确保接口里传的验证码和 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(key,validateCode) # 将验证码事先插入到redis 中
time.sleep(2)
result =api_main(data) # 调用接口
self.assertEqual(result['code'],code_success) # 验证接口返回
self.assertEqual(result['msg'],msg_success)
优点:
缺点:
在 UI 自动化时,可以采用同样的方式跳过验证码的限制。