背景:视频云点播支持用户设置回调地址,在上传或者转码结束后向用户的回调地址以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
Iterator
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回调测试自动化实践
发表于:2017-08-05
作者:xieyingchunuestc
来源:
- 周排行
- 月排行
- 评论排行
-   从 Facebook 的分析面试题来看如何...
-   从零开始掌握微服务软件测试
-   大数据测试的范围可不简单,大致总结...
-   移动终端App测试点归纳
-   Python 集成测试:提高软件质量的关键步骤
-   cookie测试
-   如何测试大模型?
-   六大前端自动化测试框架推荐,提升你...
-   测试之巅—自动化测试
-   大规模敏捷测试怎么做(集成篇)
-   渗透测试流程思维导图
-   基于风险的测试:包含优秀实践的综合指南
-   聊一聊契约测试
-   测试开发既然都这么厉害了!为啥不直...
-   从软件出发,非功能测试思考总结
-   展望2017,谁是网络技术头牌?
-   C/C++单元测试工具Visual Unit 4 介绍
-   国内外最好用的6款Bug跟踪管理系统
-   性能测试指标评估必读
-   百度软件测试方案模板
-   38张史上最全的IT工程师技能图谱
-   C/C++单元测试工具Visual Unit 4 介绍
-   2019年,你会选哪些安全测试工具?
-   十款Web服务器性能压力测试工具
-   软件测试入门指南:周期、模型和文档化
-   记自动化测试成神学习之路
-   软件测试全景图 -最全的思维导图