zoukankan      html  css  js  c++  java
  • Socket接口异步验证实践

    之前做过一些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热文精选

  • 相关阅读:
    前端性能优化
    技术从业者的未来(二)
    微服务架构
    SpringCloud 微服务最佳开发实践
    架构师之路
    SpringBoot开发秘籍
    架构设计方法论
    消息架构的设计难题以及应对之道
    SpringCloud 中如何防止绕过网关请求后端服务?
    微服务架构授权是在网关做还是在微服务做?
  • 原文地址:https://www.cnblogs.com/FunTester/p/14381878.html
Copyright © 2011-2022 走看看