之前做过一些Socket接口的测试脚本,但是并没有对其中的响应结果进行自动化验证,主要还是靠人肉眼去检查。前天完成了JSON对象的多功能验证类VerifyBean的代码,终于有时间做Socket接口的自动化验证了。由于公司长连接基于Socket.IO协议的,所以WebSocket的这里就不涉及了,有兴趣的可以加我一起交流。

前情回顾:

这里先提一嘴:Groovy重载操作符== 的时候有个问题:在原生的项目里面使用obj == obj会调用obj对象的equal方法,但是如果把原生的项目打包成jar包然后在其他项目中调用obj == obj,会优先调用Java中的 ==,的确不明所以,但是太坑了,花了至少一个小时时间排查修复问题,又增加了一些日志。如果各位对JSON对象的多功能验证类有兴趣的话,建议去GitHub或者gitee查看最新的代码。

话不多说,上代码

这里我思路如下:

老师先登录,然后用验证信息连接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()
                    }
                }
            }
        }
    }
}

控制台输出

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


FunTester,非著名测试开发,文章记录学习和感悟,欢迎关注,交流成长。

FunTester 热文精选


↙↙↙阅读原文可查看相关链接,并与作者交流