之前做過一些
Socket
接口的測試腳本,但是并沒有對其中的響應結果進行自動化驗證,主要還是靠人肉眼去檢查。前天完成了
JSON
對象的多功能驗證類
VerifyBean
的代碼,終于有時間做
Socket
接口的自動化驗證了。由于公司長連接配接基于
Socket.IO
協定的,是以
WebSocket
的這裡就不涉及了,有興趣的可以加我一起交流。
這裡先提一嘴:
Groovy
重載操作符**==** 的時候有個問題:在原生的項目裡面使用
obj == obj
會調用
obj
對象的
equal
方法,但是如果把原生的項目打包成
jar
包然後在其他項目中調用
obj == obj
,會優先調用
Java
中的 ==,的确不明是以,但是太坑了,花了至少一個小時時間排查修複問題,又增加了一些日志。如果各位對
JSON
對象的多功能驗證類有興趣的話,建議去
GitHub
或者
gitee
檢視最新的代碼。
-
位址gitee.com/fanapi/test…Gitee
-
位址github.com/JunManYuanL…GitHub
話不多說,上代碼
這裡我思路如下:
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()
}
}
}
}
}
}
控制台輸出
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://teacherpad-***.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