1. 例子由以下几个文件组成:
AuthorizenFilter.java,过滤器负责检验session中是否存在用户信息。如果没有,那么转向到 login.jsp。它的主要方法 doFilter 内容如下:
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
HttpSession session= req.getSession();
User user = (User)session.getAttribute("user");
if(null == user){
String uri= req.getRequestURI();
//如果请求页是登录页,不转向
if( uri.equalsIgnoreCase("/gWeb/login.jsp")){
chain.doFilter(request, response);
} else{
res.sendRedirect("/gWeb/login.jsp");
}
}else{
chain.doFilter(request, response);
}
}
User.java,用户类负责记录用户的信息。为了简化,这里的登录操作只允许指定用户名和密码。主要内容如下:
public class User {
private String user;
private String pwd;
public User(String user, String pwd) {
this.user = user;
this.pwd = pwd;
}
public boolean login(){
return user.equals("foxgem") && pwd.equals("12345678");
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
}
Login.jsp 和welcome.jsp。其中 login.jsp 负责生成 User 对象,并调用 User 的login。当 login 返回为 true 时转向到 welcome.jsp。其验证部分的代码:
<%
if( request.getParameter("Submit") != null) {
User ur= new User( request.getParameter("user"), request.getParameter("pwd"));
if( ur.login()){
session.setAttribute("user", ur);
response.sendRedirect("/gWeb/welcome.jsp");
} else{
session.setAttribute( "LOGIN_ERROR_MSG",
"无效的用户,可能原因:用户不存在或被禁用。");
response.sendRedirect("/gWeb/index.jsp");
return;
}
}
%>
web.xml,配置 filter 拦截所有访问 JSP 页面的请求:
<filter>
<filter-name>authorizen</filter-name>
<filter-class>org.foxgem.jmeter.AuthorizenFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>authorizen</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
2. 创建如下结构的Web测试计划:
其中主要测试元件说明如下:
http请求默认值负责记录请求的默认值,如服务器、协议、端口等。
第一个http请求,请求login.jsp,并附加验证所需要的参数(user=foxgem,pwd=12345678,Submit=Submit);其包含的响应断言验证url中包含"welcome.jsp",这一点可以从程序中反应。
第二个http请求,请求是welcome.jsp;其包含的响应断言验证响应文本中包含"foxgem",它是welcome.jsp页面逻辑的一部分。
http cookie管理器负责管理整个测试过程中使用的cookie,它不需要设置任何属性。
循环控制器设置发送第二个请求的循环次数,表格监听器负责收集和显示第二个请求的测试结果。
启动测试计划之后,执行的顺序是:首先,第一个请求登录页进行登录;成功登录之后,使用循环控制器执行第二个请求。请求welcome.jsp时,响应断言用来验证是否确实是welocme.jsp来处理请求,而不是因为其它页。在这个测试计划中需要注意的是http cookie管理器。正是由于它的作用,使得第二个请求能顺利的发送到welcome.jsp进行处理,而不是因为缺少用户安全信息转发到login.jsp。
在这个例子中,我们并没有在程序中使用cookie(使用的是session),那么http cookie管理器怎么会起作用呢?这是因为在servlet/jsp规范中对于session的状态跟踪有2种方式:
使用cookie,保留和传递sessionid。它不要求程序对于url有什么特殊的处理,但是要求浏览器允许cookie。在这个例子中,是这种情形。
使用url重写,每次显式的在浏览器和服务器之间传递sessionid。它要求程序对url进行编码,对浏览器没有要求。
对于第二种情形,可以使用JMeter前置管理器中的http url重写修饰符来完成。对于Tomcat,Session参数是jsessionid,路径扩展使用";"。使用url编码时需要注意,必须将浏览器的cookie功能关闭。因为url编码函数,如encodeURL,会判断是否需要将sessionid编码到url中。当浏览器允许cookie时,不会进行编码。
如果cookie而不是session来保存用户安全信息,那么直接使用http cookie管理器行了。此时,需要将使用的cookie参数和值直接写到管理器中,由它负责管理。对于其它的cookie使用,也是如此操作。
登录问题解决之后,对于 Web 服务器的测试没什么难点了。剩下的是根据实际需要,灵活运用相关的测试组件搭建编写的测试计划。(当然,对于安全问题还有其它的使用情景。在使用时需要明确:JMeter 是否支持,如果支持使用哪种测试组件解决。)
数据库服务器
数据库服务器在大多数企业项目中是不可缺少的,对于它进行压力测试是为了找出:数据库对象是否可以有效地承受来自多个用户的访问。这些对象主要是:索引、触发器、存储过程和锁。通过对于SQL语句和存储过程的测试,JMeter 可以间接的反应数据库对象是否需要优化。
JMeter 使用 JDBC 发送请求,完成对于数据库的测试。一个数据库测试计划,建立如下结构即可:
其中:
JDBC连接配置,负责配置数据库连接相关的信息。如:数据库url、数据库驱动类名、用户名和密码等等。在这些配置中,"绑定到池的变量名"(Variable Name Bound to Pool)是一个非常重要的属性,这个属性会在JDBC请求中被引用。通过它, JDBC请求和JDBC连接配置建立关联。(测试前,请将所需要的数据库驱动放到JMeter的classpath中)。
JDBC请求,负责发送请求进行测试。
图形结果,收集显示测试结果。