http回调测试自动化实践

发表于:2017-06-08来源:xieyingchunuestc作者:xieyingchunuestc点击数: 标签:http
背景:视频云点播支持用户设置回调地址,在上传或者转码结束后向用户的回调地址以http协议发送回调信息,例如上传完成后的视频信息,视频转码信息。 之前的测试方法:回调
  背景:视频云点播支持用户设置回调地址,在上传或者转码结束后向用户的回调地址以http协议发送回调信息,例如上传完成后的视频信息,视频转码信息。
 
  之前的测试方法:回调地址设置为测试服务器地址,自动化脚本跑的同时去测试服务器查看回调信息。
 
  缺点:随着业务扩展,点播依赖服务和NTS集群扩展迅速,每次回归量增大,回调测试无法自动化会耗费大量时间,同时,人眼观察回调,当测试代码发送大量请求,回调信息与发送的请求难以一一对应,可能请求后发但是回调先至。
 
  问题的解决方式:
 
  1、在运行测试代码的机器上找到可用端口
 
  2、起HttpServer并监听端口。
 
  3、将起的HttpServer地址设置成点播回调地址
 
  4、HttpServer解析收到的回调信息,并与点播业务发送的请求信息进行断言
 
  5、关闭HttpServer
 
  下面从代码层面逐一实现上面四个步骤
 
  一、找到可用端口:设置从指定端口开始向后遍历,查看端口是否可用。
 
  public static int check(int port) {
 
  int _port;
 
  try {
 
  ServerSocket sock = new ServerSocket(port);
 
  sock.close();
 
  _port = port;
 
  System.out.println("Port : " + port + " is Ok");
 
  } catch (IOException e) {
 
  System.out.println("Port : " + port + " is occupied ,Try to port : " + (port + 1));
 
  _port = port + 1;
 
  check(_port);
 
  }
 
  return _port;
 
  }
 
  再用String addrip = InetAddress.getLocalHost()。getHostAddress();  得到本机IP,这样就可以获得起HttpServer服务需要的地址。
 
  二、起HttpServer并监听端口
 
  public static String callbackHttpServer(int minPort) throws IOException {
 
  int port;
 
  String addrip = InetAddress.getLocalHost()。getHostAddress();
 
  port = check(minPort);
 
  String ipAddress = addrip + ":" + port;
 
  System.out.println("address is " + ipAddress);
 
  InetSocketAddress addr = new InetSocketAddress(port);
 
  server = HttpServer.create(addr, 0);
 
  MyHandler myHandler=new MyHandler();
 
  server.createContext("/", myHandler);
 
  server.setExecutor(Executors.newCachedThreadPool());
 
  server.start();
 
  System.out.println("Server is listening on port : " + port);
 
  return ipAddress;
 
  }
 
  三、解析HttpServer收到的消息
 
  public void handle(HttpExchange exchange) throws IOException {
 
  String requestMethod = exchange.getRequestMethod();
 
  if (requestMethod.equalsIgnoreCase("POST")) {
 
  Headers responseHeaders = exchange.getResponseHeaders();
 
  responseHeaders.set("Content-Type", "text/plain");
 
  exchange.sendResponseHeaders(200, 0);            //给请求发送方返回200的响应码,否则对方一直收不到响应。
 
  InputStream requestBody = exchange.getRequestBody();          //收到的回调信息
 
  Headers requestHeaders = exchange.getRequestHeaders();
 
  Set<String> keySet = requestHeaders.keySet();
 
  Iterator<String> iter = keySet.iterator();           //如需post请求的header信息,则可解析出来
 
  String body = slurp(requestBody, 1024);          //将InputStream 类型转换为String类型
 
  JsonObject messageBody = new JsonParser()。parse(body)。getAsJsonObject();
 
  reparam=messageBody;
 
  this.setReparam(reparam);
 
  System.out.println("request body is >>>>>:" + this.getReparam());    //打印出回调请求体的内容
 
  requestBody.close();
 
  }
 
  }
 
  四、关闭HttpServer:
 
  收到回调信息或者监听超时还未收到回调信息,则关闭HttpServer服务。
 
  public JsonObject getCallbackBody()throws IOException, InterruptedException
 
  {
 
  int i=0;
 
  while (true) {
 
  if(MyHandler.getReparam()!=null||i++>30)
 
  break;
 
  else
 
  TimeUnit.SECONDS.sleep(5);
 
  }
 
  String type=MyHandler.judgeCallbackType(MyHandler.getReparam());
 
  System.out.println("type is "+type);
 
  JsonObject param=MyHandler.getReparam();
 
  System.out.println("jsonObject is : "+param.toString());
 
  MyHttpServer.stopHttpServer();
 
  System.out.println("listen service is closed ");
 
  return param;
 
  }
 
  }
 
  总结:如上即实现了http回调信息的解析及自动化,在应用中,需要保证起HttpServer的地址业务服务器可以telnet通,否则,业务服务器发送过去的post请求会被拒绝。

原文转自:http://qa.blog.163.com/blog/static/190147002201732491154667/