内容简介: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/
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- [OC] 关于block回调、高阶函数“回调再调用”及项目实践
- 即使回调IsOneWay,WCF客户端也会因回调而死锁
- Java 回调机制解读
- 如何避免回调地狱
- 如何使用JPA回调?
- callback回调函数-python
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web Design Handbook
Baeck, Philippe de 编 / 2009-12 / $ 22.54
This non-technical book brings together contemporary web design's latest and most original creative examples in the areas of services, media, blogs, contacts, links and jobs. It also traces the latest......一起来看看 《Web Design Handbook》 这本书的介绍吧!