现在的很多网站或应用在登陆时都需要验证码,倘若测试自动化时遇到,该怎么解决呢?
验证码大概有以下几种:
图片验证码:图片上显示数字,汉字,英文数字,算术题,乃至挪动图块补全图片等;
短信/邮箱发送验证码:一般为四位/六位/八位数字验证码;
语音验证码:电话接听语音播报此次验证码;
首先来说说我所遇到的项目经验:
项目有短信和邮箱两种方式发送8位的数字验证码。
短信验证码只做了手工测试,当时想的是短信验证码需要一台手机,并且能够发送验证码,由于当时没有做移动端的任何测试,考虑到成本问题只能在自动化测试是放弃这种登录验证方式,只保证功能在手工测试时正常通过;
然后在登陆时选择邮件发送验证码,如何取得验证码呢?
首先申请了一个公用邮箱,专门用来接收验证码,然后写一个自动登录脚本登陆邮箱(好在邮箱登陆时不用验证码),解析邮件内容,获取验证码。
后来我不在这个项目了,听同事说是不再使用邮件和短信这种方式来验证了(是在确保了发送验证码这一功能上线正常之后才使用的),直接通过托管的日志文件管理工具Splunk去获取验证码,相当于绕过发送到短信/邮箱。
为了更好地解决问题,首先来了解一下验证码的机制:
为什么登陆时需要验证码?
没有验证码登陆,黑客会更加容易破解你的账号,通过组合码刷机等黑客技术来破取你的密码,有了验证码相当于加了一层很厚的屏障,安全系数很高。
验证码是一种区分用户是计算机和人的公共全自动程序。
验证码作用:可以防止恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上是用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,百度社区),利用比较简易的方式实现了这个功能,同时验证码的样子也会尽量千奇百怪,让机器不能够识别。
验证码一般存储在哪里?(如何测试验证码)
验证码服务端存储设计:服务器生成验证码后,存储起来(缓存或者持久化),以方便用户提交验证码时进行验证。
1、存储在本进程内存中:服务器生成验证码后,即将验证码存储在服务器中,一般以session方式进行存储。
优点:性能好
缺点:扩展性查、占用服务器内存
如何测试:其他进程是访问不到服务进程的,只能在开发时服务进程内增加验证码查询接口,以方便验证,上线时,将此接口移除或禁用。
2、存储在文件中
3、存储在数据库中
优点:可供多个服务进程查询
缺点:性能稍差,占用数据库服务器性能
如何测试:(1)进程内提供接口,方便查询(2)直接进行数据库查询
4、存储在redis等nosql数据库中
优点:性能高、一般nosql数据库提供集群功能,可靠性高
如何测试:调用nosql的客户端驱动,进行查询
验证码的机制
前端:前端网页通过一个URL来对后端进行请求,通常会给这个请求带上一个时间戳或者是随机数。
后端:接收到前端的request,后端会先生成一个随机数(通常4位),然后把该随机数存到与该客户端的session里面。随后把该随机数图像处理一下,变得让机器难以识别。随后把图片(jpg或者png)直接发送到前端(response)。
然后后端验证用户输入图片上的验证码/或短信邮箱中的验证码与后台生成的验证码是否一致,一致即可登录。
PS:前端想获得随机数的值,如果是模板型网页(如jsp、php、asp等)可以在服务器端访问session来获取值。而如果是RESTfulAPI型的,就只能通过ajax对服务器进行请求来获得值了。
自动化测试遇到验证码的启发:自动化测试时如何应对验证码
从上述的验证码测试方案中可以得出:在做自动化登陆的同时,可以采取同样四种的方式来取得验证码,绕过短信邮件图片验证码的识别读取过程(当然的确保验证码的功能模块实现已经正常)。