前端性能自动化执行机服务开发

1、新建java-web工程

使用eclipse新建动态web工程

工程目录结构如下:

src/resources
src/main/com.bjc.front.test.action
src/main/com.bjc.front.test.servlet
src/main/com.bjc.front.test.util

引入structs、spring框架相关依赖包

2、开发servlet

开发servlet,作为供其他系统调用的接口

src/resources目录下面l添加配置文件

(1)  config/sys.conf
#dt_cmd: dynatrace启动路径
dt_cmd = C:\\Program Files (x86)\\dynaTrace\\dynaTrace AJAX Edition 4.5\\dtajax.exe
#页面屏幕快照保存路径
shot_path = E:\\screenshot\\


#mysql数据库的用户名和密码
mysql_url = jdbc:mysql://10.21.159.61:3306/showslow?characterEncoding=utf8
mysql_username = root
mysql_passwd = root1234


(2)  applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> 
  
<beans xmlns="http://www.springframework.org/schema/beans"    
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     
      xmlns:aop="http://www.springframework.org/schema/aop"         
      xmlns:tx="http://www.springframework.org/schema/tx"          
      xmlns:jdbc="http://www.springframework.org/schema/jdbc"          
      xmlns:context="http://www.springframework.org/schema/context"         
      xsi:schemaLocation="          
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd          
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd          
      http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd          
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd          
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"         
     default-autowire="byName">  
    <context:annotation-config /> 
<context:component-scan base-package="com.bjc" />
</beans>

(3) log4j.properties

#log4j.rootLogger=WARN, stdout
#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#--------------------------------    
log4j.rootLogger=info, stdout, logfile
  
log4j.logger.com.fiscal = WARN  
log4j.logger.com.system = WARN  
log4j.logger.org.apache = WARN
  
log4j.logger.com.ibatis = WARN  
log4j.logger.com.mchange = WARN
log4j.logger.org.springframework = WARN
log4j.logger.org.apache.ibatis.logging.slf4j.Slf4jImpl=WARN


log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = debug  
log4j.logger.com.ibatis.common.jdbc.ScriptRunner = debug  
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = debug 
#log4j.logger.java.sql.Connection = ERROR  
log4j.logger.java.sql.Statement = debug  
log4j.logger.java.sql.PreparedStatement = debug
log4j.logger.java.sql.ResultSet = WARN




log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%p](%F:%L %M) - %m%n


log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=E:/logs/run.log
log4j.appender.logfile.MaxFileSize=51200KB


# Keep three backup files.
log4j.appender.logfile.MaxBackupIndex=100
# Pattern to output: date priority [category] - message
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d [%p](%F\:%L %M) - %m%n 

(4)struts.properties

struts.objectFactory = spring
struts.multipart.saveDir = /tmp 
struts.multipart.maxSize = 1000000000


(4)struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">


<struts>
    <include file="struts-default.xml"/>


<constant name="struts.action.extension" value="action" />
<constant name="struts.convention.action.fileProtocols" value="jar,zip" />
<constant name="struts.convention.action.includeJars" value=".*?/herongfw.*?jar(!/)?" />
<!-- constant name="struts.custom.i18n.resources" value="tmasMsg" / -->


</struts>


修改WebRoot/WEB-INF/web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- web-app version="2.5" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 -->


<web-app version="2.4"
xmlns=" http://java.sun.com/xml/ns/j2ee"
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=" http://java.sun.com/xml/ns/j2ee 
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
 
  <context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>webApp.SM1</param-value>
  </context-param>
 
  <!-- 与Spring整合 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

<dependency>  
<artifactId>slf4j-log4j12</artifactId>  
<version>1.5.8</version>  
</dependency> 

<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.13</version>
</dependency>

<context-param>
   <param-name>log4jConfigLocation</param-name>
   <param-value>classpath:log4j.properties</param-value>
  </context-param>
<!-- 每隔60秒检测一下Lo4j配置文件 -->
<context-param>   
<param-name>log4jRefreshInterval</param-name>   
<param-value>60000</param-value>   
</context-param>

<listener>   
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>   
</listener> 

<!-- 定义Struts2的FilterDispathcer过滤器的Filter -->
<filter>
<filter-name>Struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>

<!-- FilterDispatcher用来初始化struts2并且处理所有的WEB请求。 -->
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
</web-app>

在com.bjc.front.test.action包中编写action类

TestAction.java

package com.bjc.front.test.action;


import java.io.File;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import com.bjc.front.test.util.BaseAction;
import com.bjc.front.test.util.Invoker;
import com.bjc.front.test.util.Utils;
import net.sf.json.JSONObject;
import net.sf.json.JSONArray;


public class TestAction extends BaseAction{


    private static final long serialVersionUID = 1L;
    private Logger logger = Logger.getLogger(TestAction.class);
    //请求队列,所有执行请求先进入队列,再通过调度器线程执行
    public static Queue<Map<String, Object>> queue = new LinkedList<Map<String, Object>>();
    //调度器线程执行状态:1=running, 0=stop
    public static int status = 0;
    public static File file= new File(Thread.currentThread().getContextClassLoader().getResource("").getPath() + "config/sys.conf");
    public static String process = Utils.getConfig(file, "dt_cmd");
    public static String error_message;


    /**
     * 性能测试执行
     * 
     * @param 
     * @throws InterruptedException 
     */
    public  void  execPerformanceTest(HttpServletRequest request, HttpServletResponse response) {
        //String result_string = "";
        //String test_result = "";
        JSONObject jsonObj = null;
        String serviceNo = "";
        Map<String, Object> param = new HashMap<String, Object>();
        logger.info("receiving parameter!");
        //接收请求
        try
        {
            jsonObj = JSONObject.fromObject(Utils.getPostContent(request));
            serviceNo = jsonObj.getString("serviceNo");
       param.put("serviceNo", serviceNo);
       param.put("url", jsonObj.getString("url"));
       param.put("cookie", jsonObj.getString("cookie"));
       //写入请求日志表
       String sql_str1 = "select auto_increment as id from information_schema.`tables` where table_schema='showslow' and table_name='request_log'";
       String sql_str2 = "INSERT INTO `request_log` (`serviceNo`,`url`,`cookie`,`receive_time`,`queue_lenth`) VALUES ('"+ serviceNo +"','"+ jsonObj.getString("url").replace("'", "\\'") +"','"+ jsonObj.getString("cookie").replace("'", "\\'") +"',NOW(),"+ queue.size() +")";
       
       ResultSet rs = Utils.execQuerySQL(sql_str1, file);
       rs.next();
            String id = rs.getString("id");
            param.put("id", id);
       Utils.execSQL(sql_str2, file);
       //请求放入队列
       queue.offer(param);
       if(status == 0)
       {
           Invoker invok = new Invoker();
           invok.start();
       }
       this.sendMsg("{\"serviceNo\":\""+jsonObj.getString("serviceNo")+"\",\"code\":\"00\",\"message\":\"执行机接收成功\"}", response);
        }
        catch(Exception e)
        {
            logger.error(e);
            this.sendMsg("{\"serviceNo\":\""+ serviceNo +"\",\"code\":\"01\",\"message\":\""+e.toString().replace("\"", "\\\"")+"\"}", response);
            //status = 0;
        }
}
    
    public void runLogic (Map<String, Object> param ) {
        //执行成功标志
        boolean pass = false;
        //执行测试,最多执行3次,执行3次仍然不成功则失败
        try
        {
            for(int i=0; i<3; i++) 
            {
                error_message = "";
                logger.info("starting "+i+" time test, serviceNo:"+ param.get("serviceNo").toString());
                if(Utils.startProcess(process,"dtajax.exe"))
                {
                    Timestamp ts = new Timestamp(System.currentTimeMillis());
                    //休眠15秒,等待dynatrace启动
                    Thread.currentThread();
                    Thread.sleep(15000);
                    
                    String firfox_profiler = System.getenv("FIRFOX_PROFILER");
                    boolean success = false;


                    //访问firfox浏览器把dynatrace和yslow的数据写到showslow数据库中
                    success = webDriver.FirfoxBrowserDriver(param, firfox_profiler);
                    
                    if(success)
                    {
                        //休眠10秒等待dynatrace上传数据
                        Thread.currentThread();
                        Thread.sleep(10000);
                        //关闭dynatrace
                        Utils.killProcess("dtajax.exe","wait");
                        //判断测试结果是否正常更新到数据库中,最多执行3次判断
                        for(int j=0; j<3; j++) {
                        
                            //休眠10秒等待dynatrace关闭进程
                            Thread.sleep(10000);
                            //查询测试结果,如果查询到测试结果则退出
                            Map<String, Object> query = new HashMap<String, Object>();
                            query = queryUploadResult(ts, param.get("url").toString());
                            if(Integer.parseInt(query.get("yslow").toString()) == 0 || Integer.parseInt(query.get("dynatrace").toString()) == 0) {
                                continue;
                            }
                            else {
                                pass = true;
                                break;
                            }
                        }
                        if(pass)
                        {
                            //更新测试数据
                            updateResult(ts, param.get("serviceNo").toString(), param.get("url").toString());
                        }
                        else {
                            //当执行过程没有出现异常,但是查询不到关联url的测试结果时报此错误(如测试地址发生跳转,上报结果的url和传参url不一致)
                            error_message = "测试执行失败:cookie失效或测试url发生跳转!" + error_message;
                        }
                    }
                    else {
                        error_message = "测试执行失败:" + error_message;
                    }
                }
                else {
                    error_message = "启动测试工具dynatrace失败";
                }
                //测试通过,跳出循环
                if(pass){
                    break;
                }
            }
        }
        catch(Exception e)
        {
            logger.error(e);
            error_message = e.toString().replace("\"", "\\\"").replace("'", "\\'");
        }
        finally{
            
            int status = 0;
            if(pass) {
                status = 1;
                error_message = "";
            }
            //获取当前日期
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
            String date = sdf.format(new Date());
            //获取本服务器ip地址
            InetAddress server_ip = null;
            try { 
                server_ip=InetAddress.getLocalHost();
            }catch (UnknownHostException e) {
                e.printStackTrace();
            }
            //更新请求日志表
            String sql_str2 = "UPDATE `request_log` SET `finish_time` = NOW(),`cost` = UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(`receive_time`), status = "+ status 
                    +", `error_log` = '"+ error_message.replace("'", "\\'") +"', `shot_path` = 'http://"+ server_ip.getHostAddress().toString() +":8081/shot/" + 
                    date + "/" +param.get("serviceNo").toString().replace("/", "") +".png"+"' WHERE `id` = " + param.get("id").toString();
            Utils.execSQL(sql_str2, file);
            //关闭dynatrace
            Utils.killProcess("dtajax.exe","now");
            logger.info("end test, serviceNo:"+ param.get("serviceNo").toString());
        }
    }
    
    /**
    *
    * 查询测试数据是否已上传
    * 
    * @param serviceNo
    */
   public Map<String, Object> queryUploadResult(Timestamp ts, String url) {
       String sql_ys = "SELECT count(*) as rowCount FROM urls u,yslow2 y where u.id = y.url_id AND u.url = '"+ url +"' AND y.timestamp > '"+ ts +"' ORDER BY y.timestamp DESC";
       String sql_dyna="SELECT count(*) as rowCount FROM urls u, dynatrace d WHERE u.id = d.url_id AND u.url = '"+ url +"' AND d.timestamp > '"+ ts +"' ORDER BY d.timestamp DESC";
       ResultSet rs_ys = null;
       ResultSet rs_dyna=null;
       rs_ys = Utils.execQuerySQL(sql_ys,file);
       rs_dyna = Utils.execQuerySQL(sql_dyna,file);
       Map<String, Object> result = new HashMap<String, Object>();
       result.put("yslow",0);
       result.put("dynatrace",0);
       try
       {
           rs_ys.next();
           rs_dyna.next();
           int rs_ys_rowCount = rs_ys.getInt("rowCount");
           int rs_dyna_rowCount = rs_dyna.getInt("rowCount");
           result.put("yslow",rs_ys_rowCount);
           result.put("dynatrace",rs_dyna_rowCount);
       }
       catch ( SQLException e)
       {
           e.printStackTrace();
       }
       return result;
   }
   
    
    /**
    *
    * 更新测试数据
    * @param ts, serviceNo
    */
    public void updateResult(Timestamp ts, String serviceNo, String urlStr) {
        String sql_ys_update = "update yslow2 y,urls u set y.serviceNo = '"+ serviceNo +"' where y.url_id=u.id and u.url = '"+ urlStr +"' and y.timestamp > '"+ ts +"'";
        String sql_dyna_update = "update dynatrace d,urls u set d.serviceNo = '"+ serviceNo +"' where d.url_id=u.id and u.url = '"+ urlStr +"' and d.timestamp > '"+ ts +"'";
        Utils.execSQL(sql_ys_update, file);
        Utils.execSQL(sql_dyna_update, file);
    }
    
    /**
     * 完整测试结果查询
     * 
     */
    public void queryFullResult(HttpServletRequest request, HttpServletResponse response) {
        String serviceNo = "";
        String result = "";
        String res = "";
        try{
            JSONObject jsonObj = JSONObject.fromObject(Utils.getPostContent(request));
            //JSONObject jsonObj = this.getContentJSONObj();
            serviceNo = jsonObj.getString("serviceNo");
            logger.info("starting queryTestResult,serviceNo:"+ serviceNo);
            String sql_ys = "SELECT u.url, y.timestamp, y.o, y.r, y.w, y.lt, y.ynumreq, y.ycdn, y.yexpires, y.yemptysrc, y.ycompress, y.ycsstop, y.yjsbottom, y.yexpressions, y.yexternal, y.ydns, y.yminify, y.yredirects, y.ydupes, y.yetags, y.yxhr, y.yxhrmethod, y.ymindom, y.yno404, y.ymincookie, y.ycookiefree, y.ynofilter, y.yimgnoscale, y.yfavicon, y.details FROM urls u,yslow2 y where u.id = y.url_id AND y.serviceNo = '"+ serviceNo +"' ORDER BY y.timestamp DESC limit 1";
            String sql_dyna="SELECT u.url,d.timestamp, d.rank, d.cache, d.net, d.server, d.js, d.timetoimpression, d.timetoonload, d.timetofullload, d.timeonnetwork, d.timeinjs, d.timeinrendering, d.reqnumber, d.xhrnumber, d.pagesize, d.cachablesize, d.noncachablesize FROM urls u, dynatrace d WHERE u.id = d.url_id AND d.serviceNo = '"+ serviceNo +"' ORDER BY d.timestamp DESC limit 1";
            ResultSet rs_ys = null;
            ResultSet rs_dyna=null;
            rs_ys = Utils.execQuerySQL(sql_ys,file);
            rs_dyna = Utils.execQuerySQL(sql_dyna,file);
            JSONArray array = new JSONArray();
            array = Utils.resultSetToJson(rs_ys, array, "yslow");
            array = Utils.resultSetToJson(rs_dyna, array, "dynatrace");
            if(array.size()==0){
                String error_log = this.queryErrorMessage(serviceNo);
                res = "{\"serviceNo\":\""+ serviceNo +"\",\"code\":\"01\",\"message\":\""+ error_log +"\",\"result\":[]}"; 
            }
            else {
                result = array.toString();
                res = "{\"serviceNo\":\""+ serviceNo +"\",\"code\":\"00\",\"message\":\"查询成功\",\"result\":"+ result +"}"; 
            }
            this.sendMsg(res,response);
            logger.info("end queryTestResult!");
        }
        catch (Exception e)
        {
            logger.error(e);
            res = "{\"serviceNo\":\""+ serviceNo +"\",\"code\":\"01\",\"message\":\""+ e.toString().replace("\"", "\\\"") +"\",\"result\":[]}"; 
            this.sendMsg(res,response);
        }
    }
    /**
     * 基准测试结果查询
     * 
     */
    public void queryBaseResult(HttpServletRequest request,
            HttpServletResponse response)
    {
        String serviceNo = "";
        String result = "";
        String res = "";
        try{
            JSONObject jsonObj = JSONObject.fromObject(Utils.getPostContent(request));
            serviceNo = jsonObj.getString("serviceNo");
            logger.info("starting queryTestResult,serviceNo:"+ serviceNo);
            String sql = "SELECT u.url,d.timestamp, d.rank, d.cache, d.net, d.server, d.js, d.timetoimpression, d.reqnumber, d.pagesize, y.o FROM urls u,yslow2 y, dynatrace d where u.id = y.url_id AND u.id = d.url_id AND y.serviceNo = d.serviceNo AND d.serviceNo = '"+ serviceNo +"' ORDER BY d.timestamp DESC limit 1";
            ResultSet rset = null;
            rset = Utils.execQuerySQL(sql,file);
            JSONObject json = new JSONObject();
            json = Utils.resultSetToJson(rset,"base");
            if(json.size()==0)
            {
                String error_log = this.queryErrorMessage(serviceNo);
                res = "{\"serviceNo\":\""+ serviceNo +"\",\"code\":\"01\",\"message\":\""+ error_log +"\",\"result\":\"\"}"; 
            }
            else
            {
                result = json.toString();
                res = "{\"serviceNo\":\""+ serviceNo +"\",\"code\":\"00\",\"message\":\"查询成功\",\"result\":"+ result +"}"; 
            }
            this.sendMsg(res,response);
            logger.info("end queryTestResult!");
        }
        catch (Exception e)
        {
            logger.error(e);
            res = "{\"serviceNo\":\""+ serviceNo +"\",\"code\":\"01\",\"message\":\""+ e.toString().replace("\"", "\\\"") +"\",\"result\":[]}"; 
            this.sendMsg(res,response);
        }
    }
    /**
     * 响应时间测试结果查询
     * 
     */
    public void queryTimeResult(HttpServletRequest request,
            HttpServletResponse response)
    {
        String serviceNo = "";
        String result = "";
        String res = "";
        try{
            JSONObject jsonObj = JSONObject.fromObject(Utils.getPostContent(request));
            serviceNo = jsonObj.getString("serviceNo");
            logger.info("starting queryTestResult,serviceNo:"+ serviceNo);
            String sql = "SELECT u.url,d.timestamp, d.timetoonload, d.timetoimpression, d.timetofullload, d.timeonnetwork, d.timeinrendering FROM urls u, dynatrace d where u.id = d.url_id AND d.serviceNo = '"+ serviceNo +"' ORDER BY d.timestamp DESC limit 1";
            ResultSet rset = null;
            rset = Utils.execQuerySQL(sql,file);
            JSONObject json = new JSONObject();
            json = Utils.resultSetToJson(rset,"time");
            if(json.size()==0)
            {
                String error_log = this.queryErrorMessage(serviceNo);
                res = "{\"serviceNo\":\""+ serviceNo +"\",\"code\":\"01\",\"message\":\""+ error_log +"\",\"result\":\"\"}"; 
            }
            else
            {
                result = json.toString();
                res = "{\"serviceNo\":\""+ serviceNo +"\",\"code\":\"00\",\"message\":\"查询成功\",\"result\":"+ result +"}"; 
            }
            this.sendMsg(res,response);
            logger.info("end queryTestResult!");
        }
        catch (Exception e)
        {
            logger.error(e);
            res = "{\"serviceNo\":\""+ serviceNo +"\",\"code\":\"01\",\"message\":\""+ e.toString().replace("\"", "\\\"") +"\",\"result\":[]}"; 
            this.sendMsg(res,response);
        }
    }
    /**
     * 请求与页面大小测试结果查询
     * 
     */
    public void queryRequestAndPageResult(HttpServletRequest request,
            HttpServletResponse response)
    {
        String serviceNo = "";
        String result = "";
        String res = "";
        try{
            JSONObject jsonObj = JSONObject.fromObject(Utils.getPostContent(request));
            serviceNo = jsonObj.getString("serviceNo");
            logger.info("starting queryTestResult,serviceNo:"+ serviceNo);
            String sql = "SELECT u.url,d.timestamp, d.reqnumber, d.xhrnumber, d.pagesize, d.cachablesize, d.noncachablesize FROM urls u, dynatrace d where u.id = d.url_id AND d.serviceNo = '"+ serviceNo +"' ORDER BY d.timestamp DESC limit 1";
            ResultSet rset = null;
            rset = Utils.execQuerySQL(sql,file);
            JSONObject json = new JSONObject();
            json = Utils.resultSetToJson(rset,"requestAndPage");
            if(json.size()==0)
            {
                String error_log = this.queryErrorMessage(serviceNo);
                res = "{\"serviceNo\":\""+ serviceNo +"\",\"code\":\"01\",\"message\":\""+ error_log +"\",\"result\":\"\"}"; 
            }
            else
            {
                result = json.toString();
                res = "{\"serviceNo\":\""+ serviceNo +"\",\"code\":\"00\",\"message\":\"查询成功\",\"result\":"+ result +"}"; 
            } 
            this.sendMsg(res,response);
            logger.info("end queryTestResult!");
        }
        catch (Exception e)
        {
            logger.error(e);
            res = "{\"serviceNo\":\""+ serviceNo +"\",\"code\":\"01\",\"message\":\""+ e.toString().replace("\"", "\\\"") +"\",\"result\":[]}"; 
            this.sendMsg(res,response);
        }
    }
    /**
     * 静态资源测试结果查询
     * 
     */
    public void queryStaticResourceResult(HttpServletRequest request,
            HttpServletResponse response)
    {
        String serviceNo = "";
        String result = "";
        String res = "";
        try{
            JSONObject jsonObj = JSONObject.fromObject(Utils.getPostContent(request));
            serviceNo = jsonObj.getString("serviceNo");
            logger.info("starting queryTestResult,serviceNo:"+ serviceNo);
            String sql = "SELECT u.url, y.timestamp, y.o, y.r, y.w, y.lt, y.ynumreq, y.ycdn, y.yexpires, y.yemptysrc, y.ycompress, y.ycsstop, y.yjsbottom, y.yexpressions, y.yexternal, y.ydns, y.yminify, y.yredirects, y.ydupes, y.yetags, y.yxhr, y.yxhrmethod, y.ymindom, y.yno404, y.ymincookie, y.ycookiefree, y.ynofilter, y.yimgnoscale, y.yfavicon  FROM urls u,yslow2 y where u.id = y.url_id AND y.serviceNo = '"+ serviceNo +"' ORDER BY y.timestamp DESC limit 1";
            ResultSet rset = null;
            rset = Utils.execQuerySQL(sql,file);
            JSONObject json = new JSONObject();
            json = Utils.resultSetToJson(rset,"staticResource");
            if(json.size()==0)
            {
                String error_log = this.queryErrorMessage(serviceNo);
                res = "{\"serviceNo\":\""+ serviceNo +"\",\"code\":\"01\",\"message\":\""+ error_log +"\",\"result\":\"\"}"; 
            }
            else
            {
                result = json.toString();
                res = "{\"serviceNo\":\""+ serviceNo +"\",\"code\":\"00\",\"message\":\"查询成功\",\"result\":"+ result +"}"; 
            }
            this.sendMsg(res,response);
            logger.info("end queryTestResult!");
        }
        catch (Exception e)
        {
            logger.error(e);
            res = "{\"serviceNo\":\""+ serviceNo +"\",\"code\":\"01\",\"message\":\""+ e.toString().replace("\"", "\\\"") +"\",\"result\":[]}"; 
            this.sendMsg(res,response);
        }
    }
    /**
     * 查询错误日志
     * 
     */
    @SuppressWarnings("finally")
    public String queryErrorMessage(String serviceNo)
    {
        String result = "";
        try{
            String sql = "SELECT error_log from `request_log` WHERE serviceNo = '"+ serviceNo +"' ORDER BY receive_time DESC limit 1";
            ResultSet rset = null;
            rset = Utils.execQuerySQL(sql,file);
            rset.next();
            result = rset.getString("error_log");
        }
        catch (Exception e)
        {
            logger.error(e);
        }
        finally {
            return result;
        }
    }
    /**
     * 查询执行日志
     * 
     */
    public void queryExecLog(HttpServletRequest request,
            HttpServletResponse response)
    {
        String serviceNo = "";
        String result = "";
        String res = "";
        try{
            JSONObject jsonObj = JSONObject.fromObject(Utils.getPostContent(request));
            serviceNo = jsonObj.getString("serviceNo");
            logger.info("starting queryExecLog,serviceNo:"+ serviceNo);
            String sql = "SELECT * from `request_log` WHERE serviceNo = '"+ serviceNo +"' ORDER BY id DESC limit 1";
            ResultSet rset = null;
            rset = Utils.execQuerySQL(sql,file);
            JSONObject json = new JSONObject();
            json = Utils.resultSetToJson(rset,"exec_log");
            if(json.size()==0)
            {
                res = "{\"serviceNo\":\""+ serviceNo +"\",\"code\":\"01\",\"message\":\"\",\"result\":\"\"}"; 
            }
            else
            {
                result = json.getString("data");
                res = "{\"serviceNo\":\""+ serviceNo +"\",\"code\":\"00\",\"message\":\"查询成功\",\"result\":"+ result +"}"; 
            }
            this.sendMsg(res,response);
            logger.info("end queryExecLog!");
        }
        catch (Exception e)
        {
            logger.error(e);
            res = "{\"serviceNo\":\""+ serviceNo +"\",\"code\":\"01\",\"message\":\""+ e.toString().replace("\"", "\\\"") +"\",\"result\":[]}"; 
            this.sendMsg(res,response);
        }
    }
}


在com.bjc.front.test.servlet包中添加servlet

execPerformanceTest.java

package com.bjc.front.test.servlet;


import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.bjc.front.test.action.TestAction;


@WebServlet("/execPerformanceTest")
public class execPerformanceTest extends HttpServlet
{
    private static final long serialVersionUID = 1L;
    
    /**
     * get
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }


    /**
     * post
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        if(null == request) {
            return;
        }
        request.setCharacterEncoding("utf-8");
        TestAction test = new TestAction();
        test.execPerformanceTest(request,response);
    }
}

其他servlet按上面的模板添加即可


在com.bjc.front.test.util包中添加3个类,utils、baseaction、invoker

BaseAction.java


package com.bjc.front.test.util;


import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;


import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import net.sf.json.JSONObject;


import org.apache.struts2.ServletActionContext;
import org.apache.struts2.StrutsStatics;


import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;


public class BaseAction extends ActionSupport
{
    private static final long serialVersionUID = 1L;
    // 页面请求对象
    protected HttpServletRequest request;
    // 页面响应对象
    protected HttpServletResponse response;
    // 页面发送参数
    protected String ContentJSON;
    // Action上下文对象
    private ActionContext actionContext;
    // 分页操作对象




    /**
     * 方法编号:1
     * 方法名称:sendMsg
     * 内容摘要:
     *         1、该方法主要是实现向客户端发送信息
     * 参  数:String content 发送信息内容
     * 异  常:IOException 
     */
    public void sendMsg(String content)
    {
        PrintWriter out = null;
        try {
            response = ServletActionContext.getResponse();
            response.setCharacterEncoding("UTF-8");
            out = response.getWriter();
        } catch (IOException e) 
        {
            e.printStackTrace();
        }
        out.write(content);
        out.flush();
        out.close();
    }
    public void sendMsg(String content,HttpServletResponse response)
    {
        PrintWriter out = null;
        try {
            response.setCharacterEncoding("UTF-8");
            out = response.getWriter();
        } catch (IOException e) 
        {
            e.printStackTrace();
        }
        out.write(content);
        out.flush();
        out.close();
    }
    
    /**
     * 方法编号:2
     * 方法名称:getRequest
     * 内容摘要:
     *         1、该方法主要是获取界面的请求对象
     * 返  回:请求对象        
     */
    public HttpServletRequest getRequest() {
        return (request == null) ? (HttpServletRequest) getActionContext()
                .get(StrutsStatics.HTTP_REQUEST) : request;
    }


    /**
     * 方法编号:3
     * 方法名称:setRequest
     * 内容摘要:
     *         1、该方法主要是设置界面的请求对象
     * 参  数:HttpServletRequest request 请求对象
     */
    public void setRequest(HttpServletRequest request) {
        this.request = request;
    }


    /**
     * 方法编号:4
     * 方法名称:getActionContext
     * 内容摘要:
     *         1、该方法主要是获取Aaction上下文对象
     * 返  回:Aaction上下文对象
     * 
     */
    public ActionContext getActionContext() {
        actionContext = (actionContext == null) ? ActionContext.getContext()
                : actionContext;
        return actionContext;
    }


    /**
     * 方法编号:5
     * 方法名称:setActionContext
     * 内容摘要:
     *         1、该方法主要是设置Aaction上下文对象
     * 参  数:ActionContext actionContext Aaction上下文对象
     */
    public void setActionContext(ActionContext actionContext) {
        this.actionContext = actionContext;
    }


    /**
     * 方法编号:6
     * 方法名称:getHttpSession
     * 内容摘要:
     *         1、该方法主要是获取Session对象
     * 返  回:Session对象
     */
    public HttpSession getHttpSession() {
        return getRequest().getSession();
    }
    
    /**
     * 方法编号:7
     * 方法名称:getContentJSON
     * 内容摘要:
     *         1、该方法主要是获取界面请求的参数
     * 返  回:请求参数内容
     */
    public String getContentJSON()
    {
        return ContentJSON;
    }


    /**
     * 方法编号:8
     * 方法名称:setContentJSON
     * 内容摘要:
     *         1、该方法主要是设置界面请求的参数
     * 参  数:String contentJSON 请求参数
     */
    public void setContentJSON(String contentJSON)
    {
        ContentJSON = contentJSON;
    }
    
    /**
     * 方法编号:9
     * 方法名称:getContentJSONObj
     * 内容摘要:
     *         1、该方法主要是获取界面请求的内容
     * 返  回:请求参数内容的JSON对象
     */
    public JSONObject getContentJSONObj()
    {
        return JSONObject.fromObject("".equals(this.getContentJSON()) ? null : this.getContentJSON()); 
    }
    
   
    /**
     * 获取Web服务的路径
     *
     * @return
     */
    public String getBasePath()                                                                                                                                                                                                                                                                                                      
    {
        ActionContext ac = ActionContext.getContext();
        ServletContext sc = (ServletContext) ac.get(ServletActionContext.SERVLET_CONTEXT);
        
        StringBuffer sb = new StringBuffer();
        
        String tempPath = sc.getRealPath("");
        sb.append(tempPath.substring(0, tempPath.lastIndexOf(File.separator)))
          .append(File.separator)
          .append("upload")
          .append(File.separator);
        return sb.toString();
    }


}


Invoker.java

package com.bjc.front.test.util;


import com.bjc.front.test.action.TestAction;
/**
 * 性能测试执行调度器线程类
 * 
 */
public class Invoker extends Thread
{
    TestAction test = new TestAction();
    public void run()  
    {  
        TestAction.status = 1;
        while(TestAction.queue.size() > 0)
        {
            test.runLogic(TestAction.queue.poll());
        }
        TestAction.status = 0;
    }
}


Utils.java

package com.bjc.front.test.util;


import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.StringTokenizer;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.log4j.Logger;
import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;


import com.bjc.front.test.action.TestAction;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;


@SuppressWarnings("deprecation")
public class Utils {
    private static Logger logger = Logger.getLogger(Utils.class);
    /**
     *  从配置文件中获取配置参数. 
     *  file、key
     */
public static String getConfig(File file,String key){
String value = "";
try {
FileInputStream fis = new FileInputStream(file);
Properties prop = new Properties();
prop.load(fis);
value = prop.getProperty(key);
fis.close();
} catch (Exception e) {
   logger.error(e);

return value;

}
/**
     *  获取mysql数据库连接. 
     *  file
     */
public static Connection getConn(File file){
Connection connection = null;
String url;
String username;
String passwd;
try {
url = Utils.getConfig(file, "mysql_url");
username = Utils.getConfig(file, "mysql_username");
passwd = Utils.getConfig(file, "mysql_passwd");
Class.forName("com.mysql.jdbc.Driver");
connection = (Connection)DriverManager.getConnection(url, username, passwd);
} catch (Exception e) {
   logger.error(e);
}
return connection;
}
/**
     *  执行SQL语句. 
     *  sql、file
     */
@SuppressWarnings("finally")
    public static ResultSet execQuerySQL(String sql, File file){
   logger.info("SQL :"+sql);
ResultSet rs = null;
Statement stat = null;
try {
stat = (Statement) Utils.getConn(file).createStatement();
rs = stat.executeQuery(sql);
} catch (Exception e) 
{
   logger.error(e);
} finally 
{
   return rs;
}
}
/**
     *  执行SQL语句. 
     *  sql、file
     */
    @SuppressWarnings("finally")
    public static boolean execSQL(String sql, File file){
        logger.info("SQL :"+sql);
        boolean rs = false;
        Statement stat = null;
        try {
            stat = (Statement) Utils.getConn(file).createStatement();
            rs = stat.execute(sql);
        } catch (Exception e) 
        {
            logger.error(e);
        } finally 
        {
            return rs;
        }
    }
/**
     *  发送POST请求. 
     *  url、jsonParam
     */
public static void httpPost(String url,String jsonParam,File file){
DefaultHttpClient client = new DefaultHttpClient();
client.getParams().setParameter(HttpMethodParams.USER_AGENT, "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0");
HttpPost post = new HttpPost(url);
HttpResponse response = null;
if (jsonParam.length() == 0){
client.close();
return;
}
try {
StringEntity entity = new StringEntity(jsonParam,"utf-8");
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
post.setEntity(entity);
String h_name = Utils.getConfig(file, "tokenUser");
String h_value = Utils.getConfig(file, "tokenPassWord");
post.addHeader(h_name, h_value);
response = client.execute(post);
logger.info("transmit testResult:  "+ response);
} catch (Exception e) 
{
   logger.error(e);
} finally 
{
client.close();
}
}
/**
     *  模拟用户登录. 
     *  param、driver
     */
    public static boolean login(Map<String, Object> param, WebDriver driver){
        String isLogin = param.get("isLogin").toString();
        String loginUrl = param.get("loginUrl").toString();
        boolean result = false;
        if(!isLogin.equals(null) &&  isLogin.equals("true"))
        {
            //测试页面的http状态码
            int statusCode = getResponseCode(loginUrl);
            if(statusCode == 200 || statusCode == 302)
            {
                String userName = param.get("userName").toString();
                String passWord = param.get("passWord").toString();
                String userName_xpath = "//input[@id='" + param.get("userName_xpath").toString() + "']";
                String passWord_xpath = "//input[@id='" + param.get("passWord_xpath").toString() + "']";
                String cmtBtn_xpath = "//input[@name='" + param.get("cmtBtn_xpath").toString() + "']";
                if(!loginUrl.equals("") && !userName.equals(""))
                {
                    
                    driver.get(loginUrl);
                    String login_url = driver.getCurrentUrl();
                    logger.info("login_url :" + login_url);
                    driver.manage().window().maximize();
                    //是否成功提交标示
                    boolean isSubmit = true;
                    try
                    {   
                        try
                        {
                            driver.findElement(By.xpath(userName_xpath));
                        } 
                        catch (Exception e)
                        {
                            userName_xpath = "//input[@name='" + param.get("userName_xpath").toString() + "']";
                        }
                        driver.findElement(By.xpath(userName_xpath)).clear();
                        driver.findElement(By.xpath(userName_xpath)).sendKeys(userName);
                    }
                    catch(Exception e)
                    {
                        TestAction.error_message = TestAction.error_message + "用户名输入框xpath:"+param.get("userName_xpath").toString()+"没有找到,";
                        logger.error(e);
                        isSubmit = false;
                        result =  false;
                    }  
                    try
                    {
                        try
                        {
                            driver.findElement(By.xpath(passWord_xpath));
                        } 
                        catch (Exception e)
                        {
                            passWord_xpath = "//input[@name='" + param.get("passWord_xpath").toString() + "']";
                        }
                        driver.findElement(By.xpath(passWord_xpath)).clear();
                        driver.findElement(By.xpath(passWord_xpath)).sendKeys(passWord);
                    }
                    catch(Exception e)
                    {
                        TestAction.error_message = TestAction.error_message + "密码输入框xpath:"+param.get("passWord_xpath").toString()+"没有找到,";
                        logger.error(e);
                        isSubmit = false;
                        result =  false;
                    }    
                    try
                    {  
                        try
                        {
                            driver.findElement(By.xpath(cmtBtn_xpath));
                        } 
                        catch (Exception e)
                        {
                            cmtBtn_xpath = "//input[@id='" + param.get("cmtBtn_xpath").toString() + "']";
                        }
                        driver.findElement(By.xpath(cmtBtn_xpath)).click();
                    }
                    catch(Exception e)
                    {
                        TestAction.error_message = TestAction.error_message + "提交按钮xpath:"+param.get("cmtBtn_xpath").toString()+"没有找到,";
                        logger.error(e);
                        isSubmit = false;
                        result =  false;
                    }
                    try
                    {
                        //判断登陆页面成功标识
                        String switch_url = driver.getCurrentUrl();
                        logger.info("switch_url:" + switch_url);
                        if(!login_url.equals(switch_url) && isSubmit)
                        {
                            driver.findElement(By.xpath("//*[contains(text(),'退出') or contains(text(),'注销')or contains(text(),'网站地图') or contains(text(),'logout') or contains(text(),'Logout') or contains(text(),'"+userName+"') or contains(text(),'"+userName.substring(1, userName.length()-1)+"') or contains(text(),'"+userName.substring(1, userName.length()-1).toUpperCase()+"')]"));
                            result =  true;
                        }
                        else 
                        {
                            result =  false;
                        }
                    }
                    catch(Exception e)
                    {
                        TestAction.error_message = TestAction.error_message + "用户名/密码错误或者登录成功关键字校验失败!";
                        logger.error(e);
                        result =  false;
                    }
                }
            }
            else 
            {
                if(statusCode == 1)
                {
                    logger.info("异常URL :" + loginUrl);
                    logger.info("statusCode :" + statusCode + " (连接超时或无效网址)");
                }
                else {
                    TestAction.error_message = TestAction.error_message + "网址连接异常:"+loginUrl;
                    logger.info("异常URL :" + loginUrl);
                    logger.info("statusCode :" + statusCode);
                }
                result = false;
            }
            
        }
        else 
        {
            result = true;
        }
        return result;
    }
    
    /**
     *  关闭进程. 
     *  prcName
     *  type
     */
    public static boolean killProcess(String prcName, String type) {
        
        Runtime runTime = Runtime.getRuntime();
        try{
            if(type.equals("wait")) {
                Process prc = runTime.exec("taskkill /T /IM " + prcName);
                prc.waitFor();
            }
            else if(type.equals("now")) {
                runTime.exec("taskkill /F /T /IM " + prcName);
            }
            
        }catch (Exception e){
            logger.error(e);
            return false;
        }
        return true;
    }
    /**
     *  启动进程. 
     *  prcPath
     *  prcName
     */
    public static boolean startProcess(String prcPath, String prcName) {
        
        Runtime runTime = Runtime.getRuntime();
        try{
            //启动前先关闭已经存在的进程
            killProcess(prcName,"now");
            Thread.currentThread();
            Thread.sleep(2000);
            runTime.exec(prcPath);
        }catch (Exception e){
            logger.error(e);
            return false;
        }
        return true;
    }
    
    /**
     *  把ResultSet的每一条数据转换成一个json对象. 
     *  prcName ResultSet
     */
    @SuppressWarnings("finally")
    public static JSONArray resultSetToJson(ResultSet rs, JSONArray array, String type) {  
        try{
            // 获取列数  
            ResultSetMetaData metaData = rs.getMetaData();
            int columnCount = metaData.getColumnCount();
            // 遍历ResultSet中的每条数据
            while (rs.next()) {
                JSONObject jsonObj = new JSONObject();
                JSONObject data_json = new JSONObject();
                JSONObject advice_json = new JSONObject();
                jsonObj.put("type", type);
                // 遍历每一列  
                for (int i = 1; i <= columnCount; i++) {
                    String columnName =metaData.getColumnLabel(i);
                    String value = rs.getString(columnName);
                    if(columnName.equals("url") || columnName.equals("timestamp"))
                    {
                        jsonObj.put(columnName, value);
                    }
                    else if(!columnName.equals("details")) 
                    {
                        data_json.put(columnName, value);
                    }
                    else 
                    {
                        JSONObject d_json = new JSONObject();
                        d_json = JSONObject.fromObject(value);
                        JSONObject g_json = new JSONObject();
                        g_json = d_json.getJSONObject("g");
                        Iterator<?> it = g_json.keys();
                        while (it.hasNext()) {
                            String g_key = (String) it.next();
                            JSONObject g_value = (JSONObject) g_json.getJSONObject(g_key);
                            String m_value = "";
                            m_value = g_value.getString("message");
                            String c_array = g_value.getString("components");
                            if(!c_array.equals("[]"))
                            {
                                m_value = m_value + "<br>";
                                m_value = m_value + g_value.getString("components");
                            }
                            advice_json.put(g_key, m_value);
                        } 
                    }
                }
                jsonObj.put("data", data_json);
                if(advice_json.size() != 0)
                {
                    jsonObj.put("advice", advice_json);
                }
                array.add(jsonObj);
            }
        } 
        catch (Exception e)
        {
            logger.error(e);
        }
        finally {
            return array;
        }
    }
    
    /**
     *  把ResultSet的每一条数据转换成一个json数组. 
     *  prcName ResultSet
     */
    @SuppressWarnings("finally")
    public static JSONObject resultSetToJson(ResultSet rs, String type) {  
        // json数组  
        JSONObject jsonObj = new JSONObject();
        try {
            // 获取列数  
            ResultSetMetaData metaData = rs.getMetaData();  
            int columnCount = metaData.getColumnCount();  
            // 遍历ResultSet中的每条数据  
            while (rs.next()) {
                JSONObject data_json = new JSONObject();
                jsonObj.put("type", type);
                // 遍历每一列  
                for (int i = 1; i <= columnCount; i++) {  
                    String columnName =metaData.getColumnLabel(i);
                    String value = rs.getString(columnName);
                    if(columnName.equals("url") || columnName.equals("timestamp"))
                    {
                        jsonObj.put(columnName, value);
                    }
                    else
                    {
                        data_json.put(columnName, value);
                    }
                }
                jsonObj.put("data", data_json);
            } 
        } 
        catch (Exception e)
        {
            logger.error(e);
        }
        finally {
            return jsonObj;
        }
    }
    
    /**
     *  读取POST请求内容数据. 
     *  prcName ResultSet
     */
    @SuppressWarnings("finally")
    public static String getPostContent(HttpServletRequest request) {
        BufferedReader br;
        String line = null;
        StringBuilder sb = null;
        try {
            br = new BufferedReader(new InputStreamReader(request.getInputStream()));
            sb = new StringBuilder();
            while((line = br.readLine())!=null){
                sb.append(line);
            }
        }
        catch (Exception e)
        {
            logger.error(e);
        }
        finally {
            return sb.toString();
        }
    }
   
    /**
     *  测试url是否正常. 
     *  prcName url
     */
    public static int getResponseCode(String u) {
        int statusCode = 1;
        try {
            URL url = new URL(u);  
            try 
            {
                if(url.toString().contains("https"))
                {
                    try {
                        trustAllHttpsCertificates();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
//                    HostnameVerifier hv = new HostnameVerifier() {  
//                        public boolean verify(String urlHostName, SSLSession session) {  
//                            System.out.println("Warning: URL Host: " + urlHostName + " vs. "  
//                                               + session.getPeerHost());  
//                            return true;  
//                        }
//                    };  
//                    HttpsURLConnection.setDefaultHostnameVerifier(hv);
                }
                HttpURLConnection uConnection = (HttpURLConnection) url.openConnection();  
                try {
                    uConnection.connect();  
                    statusCode = uConnection.getResponseCode();  
                    uConnection.disconnect();
                } catch (Exception e) {  
                    logger.error(e);
                    TestAction.error_message = TestAction.error_message + "连接超时或者无效网址:"+u;
                }  
                  
            } catch (IOException e) {  
                logger.error(e);
                TestAction.error_message="网络连接失败";
            }  
              
        } catch (MalformedURLException e) {  
            logger.error(e);
            TestAction.error_message = TestAction.error_message + "网址无效:"+u;
        }
        return statusCode;
    }
    /**
     *  免校验SSL证书. 
     */
    private static void trustAllHttpsCertificates() throws Exception {  
        javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];  
        javax.net.ssl.TrustManager tm = new miTM();  
        trustAllCerts[0] = tm;  
        javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext  
                .getInstance("SSL");  
        sc.init(null, trustAllCerts, null);  
        javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc  
                .getSocketFactory());  
    }  
    /**
     *  免校验SSL证书. 
     */
    static class miTM implements javax.net.ssl.TrustManager,  
            javax.net.ssl.X509TrustManager {  
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {  
            return null;  
        }  
  
        public boolean isServerTrusted(  
                java.security.cert.X509Certificate[] certs) {  
            return true;  
        }  
  
        public boolean isClientTrusted(  
                java.security.cert.X509Certificate[] certs) {  
            return true;  
        }  
  
        public void checkServerTrusted(  
                java.security.cert.X509Certificate[] certs, String authType)  
                throws java.security.cert.CertificateException {  
            return;  
        }  
  
        public void checkClientTrusted(  
                java.security.cert.X509Certificate[] certs, String authType)  
                throws java.security.cert.CertificateException {  
            return;  
        }  
    }
    /**
     *  导入cookies. 
     */
    public static void setCookies(WebDriver driver, String cookie) {


        StringTokenizer str=new StringTokenizer(cookie,"; ");
        while(str.hasMoreTokens())
        {
            String kv=str.nextToken();
            String[] array = kv.split("=", 2);
            String key = "";
            String value = "";
            for (int i=0; i< array.length; i++)
            {
                if(i==0){
                    key = array[i];
                }
                else {
                    value = value + array[i];
                }
            }
            try 
            {
                Cookie ck=new Cookie(key,value);
                driver.manage().addCookie(ck);
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }   
        }
    }
    public static void main(String[] args) {
        System.out.println(Utils.getResponseCode("http://3ms.huawei.com/iPage/homepage/homepage.do?method=showHomepage&language=cn"));
        //System.out.println(Utils.getResponseCode("abc"));
        //System.out.println(TestAction.back_message);
        
    }
}


开发调试界面

index.jsp

<%@ page contentType= "text/html; charset=utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript">


function submit2()
{
var URL = "execPerformanceTest";
$.ajax({
   type: "POST",
url:URL,
cache:false,
async: false,
dataType : 'text',
contentType: "application/json;charset=utf-8",
data : $("#param2").val().replace(/\r\n|\n|\r|\t/g,"\\\n"),
success:function(v){
$("#result2").val("");
$("#result2").val(v);
}
});
}
function submit3()
{
var URL = "queryFullResult";
$.ajax({
   type: "POST",
url:URL,
cache:false,
async: false,
dataType : 'text',
contentType: "application/json;charset=utf-8",
data : $("#param3").val().replace(/\r\n|\n|\r|\t/g,"\\\n"),
success:function(v){
$("#result3").val("");
$("#result3").val(decodeURIComponent(decodeURIComponent(v)));
}
});
}
function submit4()
{
var URL = "queryBaseResult";
$.ajax({
   type: "POST",
url:URL,
cache:false,
async: false,
dataType : 'text',
contentType: "application/json;charset=utf-8",
data : $("#param4").val().replace(/\r\n|\n|\r|\t/g,"\\\n"),
success:function(v){
$("#result4").val("");
$("#result4").val(decodeURIComponent(decodeURIComponent(v)));
}
});
}
function submit5()
{
var URL = "queryTimeResult";
$.ajax({
   type: "POST",
url:URL,
cache:false,
async: false,
dataType : 'text',
contentType: "application/json;charset=utf-8",
data : $("#param5").val().replace(/\r\n|\n|\r|\t/g,"\\\n"),
success:function(v){
$("#result5").val("");
$("#result5").val(decodeURIComponent(decodeURIComponent(v)));
}
});
}
function submit6()
{
var URL = "queryRequestAndPageResult";
$.ajax({
   type: "POST",
url:URL,
cache:false,
async: false,
dataType : 'text',
contentType: "application/json;charset=utf-8",
data : $("#param6").val().replace(/\r\n|\n|\r|\t/g,"\\\n"),
success:function(v){
$("#result6").val("");
$("#result6").val(decodeURIComponent(decodeURIComponent(v)));
}
});
}
function submit7()
{
var URL = "queryStaticResourceResult";
$.ajax({
   type: "POST",
url:URL,
cache:false,
async: false,
dataType : 'text',
contentType: "application/json;charset=utf-8",
data : $("#param7").val().replace(/\r\n|\n|\r|\t/g,"\\\n"),
success:function(v){
$("#result7").val("");
$("#result7").val(decodeURIComponent(decodeURIComponent(v)));
}
});
}
function submit8()
{
var URL = "queryExecLog";
$.ajax({
   type: "POST",
url:URL,
cache:false,
async: false,
dataType : 'text',
contentType: "application/json;charset=utf-8",
data : $("#param8").val().replace(/\r\n|\n|\r|\t/g,"\\\n"),
success:function(v){
$("#result8").val("");
$("#result8").val(decodeURIComponent(decodeURIComponent(v)));
var json = JSON.parse(v);
//var str = json['result'];
//var result = JSON.parse();
//alert(str);
var shot_path = json['result']['shot_path'];
var $shotPage = $('<img id=shotid src="'+ shot_path +'" alt="测试页面截屏" />');
if($("#shotid")){
$("#shotid").remove();
}
$("#screenshot").append($shotPage);
}
});
}
</script>
</head>
<body>
<div>
<span style="width:110px">性能测试执行:</span> 
<input type="button" style="width:100px;float:middle" value="提交" οnclick="submit2()"/>
</div>
<div>
<span style="width:50px">param:</span>
<textarea id="param2" style="width:90%;height:100px; border:2px color:blue">{"serviceNo":"763-33058-34506-56247-b821135c0abd284dc3ea433e349cb231","url":"http://w3.huawei.com/btit/eresource/timesheet/timesheetApply.do?resflag=0&catalogId=40117&method=toSearch","cookie":"TS_think_language=zh-cn; w3todoSID=0000RSgh9qEGaIWejEwJRlag7RM:1952l49ah; login_logFlag=in; bfd_session_id=bfd_s=92496004.31893426.1474945952131; _ha_id..1e74=F4-2F-BF-82-70-8B-75-ED-1C-BC-56-41-9E-69-20-A1.1490344155.1.1490344155.1490344155.; tmd=4.92496004.5809321.1472809987967.; hwssot3=25537733600755; w3otherSID=0000j6rwIytJ8oMWhpgMgWkrvGJ:1952m906f; tmc=2.92496004.94557270.1474945952132.1474945952132.1474946352292; _W3_LOCALE_=zh; LtpaToken=xsOHrCTLIAlUVP2XBzryGj7RmkqVXxsnzNMFLll+GTjme4PQKX7tIFZatduTHJz4r9xCLoL4Xdkr9tWP7I9SwuQdY3XpWxSwvlu4b3hdgN44bripPctg/DIoNq1lm/BIPRutDDa/2vh4pVxEJ7H9sufjm3tyumNi5LHtR56GZ5+9NuThuTX7jDtGFOlidePBi7XHJ537kqAbBWVeNauXFrm8eeoCq0T0EZ2WvOizzgfFQFhfjX6BXpKNO79Uj0zrVBj/u578wZ61rKsD+7bgjuyQxWy8JD+6PJz+CIDTSAqyCgKDb4CGM4V0XKVbNv3Zzia/q6owwxBgXCKKaL2NxpAi+L3hhuKjCr2zFO9gUI0AmppCP1JIDA==; tma=92496004.5809321.1472809987967.1472809987967.1474945952136.2; login_uid=F4-2F-BF-82-70-8B-75-ED-1C-BC-56-41-9E-69-20-A1; login_sip=19-C9-2D-28-1F-57-C2-B2-98-18-8D-9E-0F-D8-81-9D-F8-2E-80-0E-92-58-96-48; hwssotinter=94-DF-BA-9F-05-2D-F5-79-89-39-DB-DB-C8-11-9B-CF; lang=zh; _dmpa_ref=%5B%22%22%2C%22%22%2C1474945952%2C%22http%3A%2F%2Fwww.huawei.com%2Fcn%2F%22%5D; hwssot=94-DF-BA-9F-05-2D-F5-79-89-39-DB-DB-C8-11-9B-CF; suid=F4-2F-BF-82-70-8B-75-ED-1C-BC-56-41-9E-69-20-A1; _dmpa_ses=6144bcf26a4539a990b139f51410015ef2215f80; _ha_id.w3nextcn.1e74=F4-2F-BF-82-70-8B-75-ED-1C-BC-56-41-9E-69-20-A1.1473237220.0.1473237220..; bfdid=b0605254007bf9520000647200010da557c94c03; _ABTest=a; _ha_ses.w3nextcn.1e74=cce22aa5a94214e8b00f3717961d9298bf7a5bde; userTag=\"{\\\"newId\\\":\\\"8C4983FE960D4FA3ADD82ACFA1A3FCA5\\\"}\"; hwsso_login=Q4aUlHLi5OxqQ2V_anram7HGxqhA_bGD_awmRFFEXLLFly_ayhUfjeZ0MqsAiSC2KOnlFjpWx79D_aAXej_a13i0qvmm4kx6WeF82Rjzt8izrGFWakvGdAzjSvHTP4Ki6dhIpk4fuKUruSGjdEUMqW6TnWn5BGLC9eBvcER_bczBmmNwh2eAMTWd1QlsztVzQfVwXSF2SBWKs4U_bSDrUhgwsFrYj_aj5pMDphJN8Qo43WsYlMrAOAWTgGt6fImgsxeAIb2J9uYTn32GXOcANB2RT5lqCpAhsl9B7RJogy1kG4DZ0UIh21Ia_b8YnQ5Qv4KlnAA1_bZ7Ent0S4x0Yu0GkT91zRarw_c_c; 2D-4A-29-3E-6C-E6-DF-76-1D-A3-0E-21-2C-88-0E-05=F4-2F-BF-82-70-8B-75-ED-FE-A2-D0-FD-55-64-13-D8-E4-27-9F-D0-2F-BB-7F-48-91-3E-60-FF-E2-B6-34-D3-E6-A7-1A-9C-4A-BF-42-AE-A7-E6-F1-77-98-BD-A8-4B; bfdmapping=1; online_update=1473130212; login_sid=8C-DC-04-9B-24-A0-27-86-8C-92-88-F0-B7-1E-81-FF-18-88-81-F4-A1-4A-AD-4D-8F-0D-16-8F-80-CF-72-2D-C7-45-FE-E2-B5-26-CB-DC; _ha_ses..1e74=043acdd037c035a4c562231b13f92c38c6fde8be; _dmpa_id=10925b2f1d8fe9b7d4d4c3546761474945952249.1474945952.1.1474946359.1474945952.; per_last=1482291481960; tab_id=yellowPage; w3Token=F4-2F-BF-82-70-8B-75-ED-F2-EB-45-53-64-9D-AC-24-5A-FD-37-4D-F6-F3-FC-2A-78-4B-8C-D9-0B-CC-08-77; forum-guest=true; w3serviceSID=0000ri64feuol3tJVvNyfGUYQC4:1952k44au; hwa_track_id=daf95b8f074946f791250b25a9567eada5165c51; visitorId=8C4983FE960D4FA3ADD82ACFA1A3FCA5; HW3MS_think_language=zh-cn; _sid_=8C-DC-04-9B-24-A0-27-86-8C-92-88-F0-B7-1E-81-FF-18-88-81-F4-A1-4A-AD-4D-8F-0D-16-8F-80-CF-72-2D-C7-45-FE-E2-B5-26-CB-DC; hwsso_am=77-22-F7-0E-84-9F-31-CD; v1st=156DE6E3AEA19883"}</textarea>
</div>
&nbsp;
<div>
<span style="width:50px">result:</span>
<textarea id="result2" style="width:90%;height:40px; border:2px color:blue"></textarea>
</div>
&nbsp;
<div>
<span style="width:140px">完整测试结果查询:</span>
<input type="button" style="width:100px;float:middle" value="提交" οnclick="submit3()"/>
</div>
<div>
<span style="width:50px">param:</span>
<textarea id="param3" style="width:90%;height:40px; border:2px color:blue">{"serviceNo":"763-33058-34506-56247-b821135c0abd284dc3ea433e349cb231"}</textarea>
</div>
&nbsp;
<div>
<span style="width:50px">result:</span>
<textarea id="result3" style="width:90%;height:150px; border:2px color:blue"></textarea>
</div>
&nbsp;
<div>
<span style="width:140px">基准测试结果查询:</span>
<input type="button" style="width:100px;float:middle" value="提交" οnclick="submit4()"/>
</div>
<div>
<span style="width:50px">param:</span>
<textarea id="param4" style="width:90%;height:40px; border:2px color:blue">{"serviceNo":"763-33058-34506-56247-b821135c0abd284dc3ea433e349cb231"}</textarea>
</div>
&nbsp;
<div>
<span style="width:50px">result:</span>
<textarea id="result4" style="width:90%;height:150px; border:2px color:blue"></textarea>
</div>
&nbsp;
<div>
<span style="width:170px">响应时间测试结果查询:</span>
<input type="button" style="width:100px;float:middle" value="提交" οnclick="submit5()"/>
</div>
<div>
<span style="width:50px">param:</span>
<textarea id="param5" style="width:90%;height:40px; border:2px color:blue">{"serviceNo":"763-33058-34506-56247-b821135c0abd284dc3ea433e349cb231"}</textarea>
</div>
&nbsp;
<div>
<span style="width:50px">result:</span>
<textarea id="result5" style="width:90%;height:150px; border:2px color:blue"></textarea>
</div>
&nbsp;
<div>
<span style="width:220px">请求与页面大小测试结果查询:</span>
<input type="button" style="width:100px;float:middle" value="提交" οnclick="submit6()"/>
</div>
<div>
<span style="width:50px">param:</span>
<textarea id="param6" style="width:90%;height:40px; border:2px color:blue">{"serviceNo":"763-33058-34506-56247-b821135c0abd284dc3ea433e349cb231"}</textarea>
</div>
&nbsp;
<div>
<span style="width:50px">result:</span>
<textarea id="result6" style="width:90%;height:150px; border:2px color:blue"></textarea>
</div>
&nbsp;
<div>
<span style="width:170px">静态资源测试结果查询:</span>
<input type="button" style="width:100px;float:middle" value="提交" οnclick="submit7()"/>
</div>
<div>
<span style="width:50px">param:</span>
<textarea id="param7" style="width:90%;height:40px; border:2px color:blue">{"serviceNo":"763-33058-34506-56247-b821135c0abd284dc3ea433e349cb231"}</textarea>
</div>
&nbsp;
<div>
<span style="width:50px">result:</span>
<textarea id="result7" style="width:90%;height:150px; border:2px color:blue"></textarea>
</div>
&nbsp;
<div>
<span style="width:110px">查询执行日志:</span>
<input type="button" style="width:100px;float:middle" value="提交" οnclick="submit8()"/>
</div>
<div>
<span style="width:50px">param:</span>
<textarea id="param8" style="width:90%;height:40px; border:2px color:blue">{"serviceNo":"763-33058-34506-56247-b821135c0abd284dc3ea433e349cb231"}</textarea>
</div>
&nbsp;
<div>
<span style="width:50px">result:</span>
<textarea id="result8" style="width:90%;height:150px; border:2px color:blue"></textarea>
</div>
&nbsp;
<div id="screenshot">
<span style="width:50px">screenshot:</span>
</div>
</body>
</html>

调试界面需要引入jquery.js


至此,开发代码已完成,后续工作就是调试代码,发现问题解决问题,发现问题解决问题。。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值