之前做过一些Socket
接口的测试脚本,但是并没有对其中的响应结果进行自动化验证,主要还是靠人肉眼去检查。前天完成了JSON
对象的多功能验证类VerifyBean
的代码,终于有时间做Socket
接口的自动化验证了。由于公司长连接基于Socket.IO
协议的,所以WebSocket
的这里就不涉及了,有兴趣的可以加我一起交流。
前情回顾:
- socket接口开发和测试初探
- 基于WebSocket的client封装
- 基于Socket.IO的Client封装
- Socket.IO接口多用户测试实践
- JSON对象标记语法验证类
- Python版Socket.IO接口测试脚本
这里先提一嘴:Groovy
重载操作符**==** 的时候有个问题:在原生的项目里面使用obj == obj
会调用obj
对象的equal
方法,但是如果把原生的项目打包成jar
包然后在其他项目中调用obj == obj
,会优先调用Java
中的 ==,的确不明所以,但是太坑了,花了至少一个小时时间排查修复问题,又增加了一些日志。如果各位对JSON
对象的多功能验证类有兴趣的话,建议去GitHub
或者gitee
查看最新的代码。
Gitee
地址https://gitee.com/fanapi/testerGitHub
地址https://github.com/JunManYuanLong/FunTester
话不多说,上代码
这里我思路如下:
老师先登录,然后用验证信息连接Socket
,再发起注册请求,然后加入某个房间,最后离开某个房间。
对于响应信息收集,我设置了2s
的延迟,用两层遍历的方式对消息List
和验证对象List
进行交叉验证,然后输出验证结果,这里验证支持的方式参考:JSON对象标记语法验证类。
package com.okayqa.socket.test
import com.fun.base.bean.VerifyBean
import com.fun.base.interfaces.ISocketVerify
import com.fun.frame.socket.ScoketIOFunClient
import com.okayqa.socket.base.SocketBase
import org.slf4j.Logger
import org.slf4j.LoggerFactory
/**
* wiki:http://wiki.okjiaoyu.cn/display/RJBK/ailearn-instruction-svr
*/
class ST extends SocketBase {
private static Logger logger = LoggerFactory.getLogger(ST.class)
static int roomId = 43548;
static int activity_id = roomId;
public static void main(String[] args) {
def tbase = getTeaBase()
ScoketIOFunClient teacher = getSocket(tbase)
initAll()
registerAll()
joinRoom(roomId)
leaveRoom(roomId)
def sv = new SV(teacher)
def bean = new VerifyBean("jsonpath|$.cmd|=joinRoomResponse", EMPTY, "FunTester0")
def bean1 = new VerifyBean("contain|61951375269", EMPTY, "FunTester1")
sv.addVerify(bean)
sv.addVerify(bean1)
sleep(2.0);
def thread = new Thread(sv)
thread.start()
logger.info("脚本完成!")
thread.join()
output(sv.vs*.result)
sv.vs.each {it.print()}
ScoketIOFunClient.closeAll()
}
static class SV implements ISocketVerify {
List<VerifyBean> vs = new ArrayList<>()
ScoketIOFunClient client
SV(ScoketIOFunClient client) {
this.client = client
}
@Override
void initMsg(List<String> list) {
}
@Override
boolean verify() {
return false
}
@Override
void addVerify(VerifyBean verifyBean) {
vs << verifyBean
}
@Override
void remoreVerify(VerifyBean verifyBean) {
vs.remove(verifyBean)
}
@Override
void removeAllVerify() {
vs.clear()
}
@Override
void saveResult() {
}
@Override
void run() {
synchronized (client.msgs) {
client.msgs.each { x ->
vs.each { v ->
def s = x.substring(1, x.length() - 1)
v.setValue(s)
v.verify()
}
}
}
}
}
}
控制台输出
代码语言:javascript复制INFO-> 当前用户:fv,IP:10.60.192.21,工作目录:/Users/fv/Documents/workspace/okay_test/,系统编码格式:UTF-8,系统Mac OS X版本:10.16
INFO-> requestid: Fdev16092381258113
INFO-> 请求uri:https://teach***.cn/api/t_pad/user/login,耗时:984 ms
INFO-> 教师:61951375269,学科:null,名称:范老师零零零,登录成功!
INFO-> Socket 连接: http://ailearn-***.cn:38899/?systemId=61951375269&loginType=3&token=2cc340d010af4fd3a22be276cf2ebec3&userType=1,客户端名称: 老师:61951375269
INFO-> 老师:61951375269 开始连接...
INFO-> 老师:61951375269 连接成功!
INFO-> 老师:61951375269 收到响应:[{"msg":"","code":0,"data":{"role":"T","s_sid":123,"deviceVersion":"1.0","userId":61951375269,"token":"2cc340d010af4fd3a22be276cf2ebec3"},"cmd":"registerResponse"}]
INFO-> 老师:61951375269 收到响应:[{"msg":"","code":0,"data":{"roomId":43548},"cmd":"joinRoomResponse"}]
INFO-> 老师:61951375269 收到响应:[{"msg":"","code":0,"data":{},"cmd":"leaveRoomResponse"}]
INFO-> 脚本完成!
INFO-> verify对象: registerResponse,匹配的字符串: =joinRoomResponse
INFO-> verify对象 $.cmd|=joinRoomResponse ,验证结果: false
INFO-> verify对象 61951375269 ,验证结果: true
INFO-> verify对象: joinRoomResponse,匹配的字符串: =joinRoomResponse
INFO-> verify对象 $.cmd|=joinRoomResponse ,验证结果: true
INFO-> 第1个:true
INFO-> 第1个:true
INFO-> FunTester0 验证结果: true
INFO-> FunTester1 验证结果: true
INFO-> 老师:61951375269 socket链接关闭!
INFO-> 关闭所有Socket客户端!
Process finished with exit code 0