进行自动化测试时,发现公司中所有的功能测试用例必须基于一个前提:用户已登录的情况下才能测试。基于这种情况,有2种解决方案:1)为所有的testcase添加testng中依赖关系,使其依赖于“登录”这一条用例执行;2)利用网页的cookie记住登录状态,无需再执行一遍登录的测试用例。
在设计测试用例时,有一条原则,就是每个testcase之间尽可能是相互独立的,不要存在过多的依赖关系。遵循这条原则,我们选择使用第二种方法,来解决上述问题。本文主要阐述了cookie、session记住登录状态的实现原理,方便我们更好地写测试用例。
Cookie的机制
在网站中,http请求是无状态的,也就是说,即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题:当浏览器访问网站后,这些网站将一组数据存放在客户端,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动携带给服务器,服务器通过浏览器携带的数据就能识别当前用户。
cookie中的Domain和Path属性标识了这个Cookie是哪一个网站发送给浏览器的;Expires属性标识了cookie的有效时间:
1)如果对Expires属性进行有效时间设置,当cookie的有效时间过了之后,这些数据就被自动删除了;此时会话cookie保存在硬盘上。关闭浏览器后再次打开,这些cookie依然有效,直到超过设定的有效时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗 口。
2)如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上,而是保存在内存里。
特点:cookie存储在本地浏览器,且存储数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用cookie只能存储一些小量的数据。
Session的机制
Session是存放在服务器端的类似于HashTable结构(每一种Web开发技术的实现可能不一样,下文直接称之为HashTable)来存放用户 数据,当浏览器第一次发送请求时,服务器自动生成了一个HashTable和一个Session ID用来唯一标识这个HashTable,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的HashTable。
一般情况下,服务器会在一定时间内(默认20分钟)保存这个HashTable,过了时间限制,就会销毁这个HashTable。在销毁之前,程序员可以 将用户的一些数据以Key和Value的形式暂时存放在这个HashTable中。当然,也有使用数据库将这个HashTable序列化后保存起来的,这 样的好处是没了时间的限制,坏处是随着时间的增加,这个数据库会急速膨胀,特别是访问量增加的时候。一般还是采取前一种方式,以减轻服务器压力。
总而言之,session和cookie的作用是类似的,都是为了存储用户相关的信息。
特点:cookie存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但会占用服务器的资源。
Session的客户端实现形式(即Session ID的保存方法)
一般浏览器提供了两种方式来保存,还有一种是程序员使用HTML隐藏域的方式自定义实现:
1) 使用cookie来保存。这是最常见的方法,本文“记住我的登录状态”功能的实现就是基于这种方式的。服务器通过设置cookie的方式将Session ID发送到浏览器。
a.如果我们不设置有效时间,这个cookie将存放在内存中,成为一个和浏览器共存亡的会话cookie。当浏览器关闭的时候,cookie消失,对应的Session ID也就丢失了;
b.如果我们设置这个时间为若干天之后,那么这个Cookie会保存在客户端硬盘中,即使浏览器关闭,这个值仍然存在,下次访问相应网站时,同样会发送到服务器上。
2) 使用URL附加信息的方式。也就是像我们经常看到JSP网站会有aaa.jsp?JSESSIONID=*一样的。这种方式和第一种方式里面不设置cookie过期时间是一样的。
3) 第三种方式是在页面表单里面增加隐藏域,这种方式实际上和第二种方式一样,只不过前者通过GET方式发送数据,后者使用POST方式发送数据。但是明显后者比较麻烦。
实现“记住我的登录状态”的功能
前面我们了解到,如果我们将Session ID通过Cookie发送到客户端的时候设置其有效时间为1年,那么在今后的一年时间内,客户端访问我的网站的时候都回将这个Session ID值发送到服务器上,服务器根据这个Session ID从内存或者数据库里面恢复存放Key-Value对的Hashtable。
但是,实际上Session并不会一直存在。过了一定的时间之后,服务器上的Session就会被销毁,以减轻服务器的访问压力。当服务器上的数据被销毁后,即使客户端上存放了cookie也没有办法“记住我的登录状态”了。
通用的实现办法是,将用户的用户名和加密之后的密码也通过cookie的方式存放在客户端,当服务器上的Session销毁以后,使用cookie里面存 放的用户名和加密之后的密码重新执行一次登录操作,重建Session,并更新客户端上cookie中存放的的Session ID,而这个操作是发生在用户请求一个需要身份验证的页面资源的背后,对于用户来讲是透明的,于是就达到了“记住我的登录状态”的目的了。
具体如何使用上文的方法,在Selenium + testng + java中实现记住登录状态,将在下一篇文章中详细描述。