HTTP回调测试自动化实践

Novia ·
更新时间:2024-09-21
· 749 次阅读

  背景:视频云点播支持用户设置回调地址,在上传或者转码结束后向用户的回调地址以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 测试

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章