春节回老家休息了半个月,所以文章也没更新,后面会继续完成这个系列。。。。。
痛点
我们先来说一个大家做接口测试或UI自动化测试的痛点,很多时候要进入应用或接口都需要登录验证,这是我们展开测试的一个很头疼的问题,在前面的文章中好像也留下了这个坑,也有童鞋留言在问这方面的问题,另外刚好年前在写爬虫的时候也遇到这样的问题,所以今天我们就来分析下这个主题,把这个坑给填满……
分析
对于如何跳过登录,我就开门见山直接说吧,我了解到的跳过登录的方式无外乎有下面几种:
1、模拟用户输入登录;
2、利用Cookie跳过登录;
3、利用非正常手段绕过登录;
4、白名单;
5、其它(未知或待发掘)
对于第1种方式,做过UI自动化测试的童鞋都不会陌生,简单粗暴没毛病,可是不太适合接口测试,目前基本上都是通过第2种利用Cookie的方式跳过,在某些情况下Cookie的方式也行不通时,可以考虑第3种,第4种白名单业界都是靠商业合作来实现,没有什么好说的了。。。所以今天的重点是第2种方式,稍微讲一下第3种方式。
实现
1、利用Cookie跳过登录
利用Cookie跳过登录原理就是登录一次,查看登录后的header和cookie信息,将可关键信息拿下来,然后将这些信息加入你的接口请求头信息中,听起来是不是还是挺抽象?没关系,马上举例说明。以简书获取当前用户信息接口为例:
在没登录的时候,去请求这个接口肯定是拿不到数据的,下面我们做个试验:
1> 在已登录的情况下:我们看下获取当前用户信息接口:http://www.jianshu.com/author/current_user,在Chrome的控制台中是可以看到数据的,如下:
2> 在未登录的情况下,换个浏览器请求:http://www.jianshu.com/author/current_user,页面跳转到登录界面了。。。
现在需求出来了,我想要跳过这个登录去拿到用户信息,所以这肯定需要在接口请求中加入Cookie了,如何做?
首先,我们回到前面登录状态下,使用Chrome的调试工具或Firefox的FireDebug(按下F12可以打开)或者其他抓包工具如Fiddler、Charles等(浏览器调试工具有时可能重定向导致界面被强制刷新了而抓不到之前的请求记录,所以建议用抓包工具)抓取当前界面的请求信息;然后找到对应的接口记录,选中查看它的相关请求和响应信息,如下图:
上图红框部分就是这个接口的请求headers信息,其中就包含Cookie,现在问题来了,headers和cookie这么多,都要放进去吗?先都放进去看下效果,然后再逐步排除掉无用的headers(熟练了之后其实可以一眼看出来哪些headers信息是需要的,下面代码中我直接给出了需要的headers信息)。HTTP请求的测试代码如下:
@Test
public void testSkipLoginByCookies() throws ParseException, IOException {
String url = "http://www.jianshu.com/author/current_user";
Map<String, Object> headers = new HashMap<String, Object>();
headers.put("Accept", "application/json");
headers.put("Cookie", "remember_user_token=W1syOTUxMjMzXSwiJDJhJDEwJDFBM29ab1h5RDJMQ2xaN2kzUzFpRXUiLCIx" +
"NTE5Mzc3NjI3LjEzNTU3ODIiXQ%3D%3D--1ad08bd92af5892df4e996e50e75ddee1bad35ef;");
//headers.put("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
HttpResponse response = new HttpRequest(url)
.setHeaders(headers)
.setParams(null)
.doGet();
//输出响应
System.out.println(EntityUtils.toString(response.getEntity()));
//验证响应码
int code = response.getStatusLine().getStatusCode();
Assert.assertEquals(200, code);
}
测试结果:
就在这样跳过了登录,所以不管你登录界面有多复杂,有没有各种验证码和极限验证,we don't care。。。。
2、利用非正常手段绕过登录
上面利用Cookie跳过登录有时也有不管用的时候,比如上面简书接口使用的cookie是一个token,这个会有一个有效期,比如几个小时、几天内有效(具体过期时间由系统设置的),那么我们不可能每次失效了都来重新人工copy一遍cookie更新到代码中吧,这不符合自动化测试的原则,所以有时候我们得用一些非正常手段来动态获得cookie,常用的手段和方法有:
1、利用WebDriver的HtmlUnitDriver来模拟无界面登录,从而获得cookie;
为什么用HtmlUnitDriver而不是用FirefoxDriver或ChromeDriver?因为HtmlUnitDriver无操作界面,是在后台静默进行的,无干扰且速度快。
2、在代码中模拟用户登录的Form表单提交;
用抓包工具仔细分析用户登录过程,你会发现前端就是一个Form提交,只不过这不是一个请求完成的,而是中间跳转了好多次,需要好几个请求去完成,那么我们也就可以将这些请求都抓出来,依次请求而从实现登录。
具体的实现就不贴了,有兴趣的童鞋可以去尝试下~
【下章节预告】:接口自动化测试(九):测试用例管理
原文来自下方公众号,转载请联系作者,并务必保留出处。
想第一时间看到更多原创技术好文和资料,请关注公众号:测试开发栈
【本系列历史章节链接】:
接口自动化测试(七):数据验证专项2
接口自动化测试(六):数据验证专项1
接口自动化测试(五):Http框架搭建
接口自动化测试(四):Helloworld入门
接口自动化测试(三):关于URL
接口自动化测试(二):关于HTTP
接口自动化测试(一):关于接口