QQ好友在线/离线,怎么测试?
即时通讯是目前internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷,那么今天主要针对QQ好友在线状态/QQ群友在线状态功能出发,一起思考其中的实现原理以及我们如何去测试此功能?
当大家在使用QQ的时候,是否和我一样有如下疑问:
在好友列表中为什么可以实时的看到qq好友的在线、离线等状态?
在QQ群的群友列表中能看到当前群友的在线、离线等状态,是如何实现的?
作为测试工程师究竟该如何去测试里面用到的技术?
我带着这些问题,去搜集了一些资料进行了解、学习和总结后,现分享给大家。
关于QQ好友在线/离线状态我所理解的流程是:
当用户A登录成功时,服务器要把用户A的在线状态(online)写到缓存(高可用的缓存集群里);userid-A—》login—》server—》set status in cache(userid:online)
当用户A下线(登出)时,服务器要找到用户A的缓存将在线状态(online)变成离线状态(offline);userid-A—》loginout—》server—》update status in cache(userid-A:offline)
其他所有用户的状态都会存储在缓存中,所以当用户A登录时,从数据库中查出用户A的好友,再从缓存中查出这些好友所对应的在线状态,从而用户A可以看出哪些好友在线哪些好友离线;
userid-A—》my friends status—》get friends userids in DB —》get userids status in cache(userid1:online,userid2:offline,userid3:offline,userid4:online……)
针对上面的流程主要考虑的测试点如下:
无缓存情况下,用户A登录时,写入缓存正常(缓存大家应该都了解过,比如memcache、redis等如何查看缓存?不会的同学可以咨询也可自己查下相关资料)
当用户退出登录时,缓存中对应的value被置为offline;
缓存存的有效期校验;
用户A的好友用户B下线/上线时,状态是否显示正确;
用户A的多个好友中有在线有离线的,当用户A查看好友状态时,状态显示是否正确;
当redis连接异常或超时时,应该如何处理;
等等...大家可以想想需要测试的功能点,要了解开发实现的过程,尽可能的去覆盖测试点。
写到这里,其实其中还有一个重要的点:比如用户A的好友用户B在线,突然,用户B离线了,那么用户A能否立即看到好友由在线变成离线呢?这也是我们测试人员需要考虑的功能点!到底是不是实时的我也不能确定,如果有人知道的话可以分享下。如果对实时性要求较高,可以采用推送的方式同步,如果实时性要求不太高的话,可以采用轮询拉取的方式进行同步。
再普及下轮询拉取方式和推送方式,如下:
什么是轮询拉取方式
举例说明:用户userid-A要看到好友的在线状态的话,比如就要每分钟轮询向服务器拉取全部好友的在线状态。缺点就是:有一分钟的延迟,同时当好友的状态期间没有变化时也请求服务器拉取产生大量的无效请求暂用服务器的资源。这种方式可能大家在工作中也经常用到,不断的轮询获取服务器的信息。
什么是推送的方式
继续举例说明:还是用户userid-A要看到好友用户userid-B在线状态的话,当用户userid-B下线时,由在线变成离线(更新缓存为offline),同时要将这个状态改变的通知推送给用户userid-B的在线反向好友。这样就变成实时了,但是缺点就是:在线好友量大的话,任何一个用户状态的改变会扩散很多实时通知,需要考虑承载能力。
大家可以思考下,QQ群友的在线同步应该是怎样的流程呢?到底是使用轮询的方式还是推送的方式呢?后续如果有时间的话可以继续讨论。
测试架构师论坛:http://www.youxitest.com
了解更多请关注微信公众号:测试架构师

QQ好友在线/离线,怎么测试?的更多相关文章
- QQ群友在线/离线,如何测试?
上篇文章『QQ好友在线/离线,如何测试?』针对即时通讯的"状态"进行了分析和总结,主要说到了QQ好友在线/离线实现方案,测试过程中需要注意的测试点. 针对好友状态实时性的要求需要使 ...
- ExpandableListView仿QQ好友列表
本例中,对ExpandableListView中的数据进行了封装,分为两个JavaBean,一个为Group类表示组信息,一个Child类表示该组下子列表信息: Group: public class ...
- QQ好友状态,QQ群友状态,究竟是推还是拉? 网页端收消息,究竟是推还是拉?
https://mp.weixin.qq.com/s/KB1zdKcsh4PXXuJh4xb_Zw 网页端收消息,究竟是推还是拉? 原创 58沈剑 架构师之路 2020-12-28 https:/ ...
- Ubuntu14.04用apt在线/离线安装CDH5.1.2[Apache Hadoop 2.3.0]
目录 [TOC] 1.CDH介绍 1.1.什么是CDH和CM? CDH一个对Apache Hadoop的集成环境的封装,可以使用Cloudera Manager进行自动化安装. Cloudera-Ma ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(九) 之 用 Redis 实现用户在线离线状态消息处理(一)
前言 上一篇中简单讲解了用Redis缓存在线用户逻辑.篇幅也比较小,本篇将详细实现用户的上线下线通知.图片效果转换功能.而且,代码和开发思路都会详细介绍. 效果展示 目前有三个用户,user1,use ...
- iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一)
iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一) 一.项目结构和plist文件 二.实现代码 1.说明: 主控制器直接继承UITableViewController // ...
- (二十七)QQ好友列表的实现
QQ好友列表通过plist读取,plist的结构为一组字典,每个字典内有本组的信息和另外一组字典代表好友. 要读取plist,选择合适的数据结构,例如NSArray,然后调用initWithConte ...
- Centos7中在线/离线安装DockerCE最新版
Docker在Centos7在线/离线安装 一.在线安装 1.检查系统是否支持,因为Docker 要求 CentOS 系统的内核版本高于 3.10 uname -r 2.确保 yum 包更新到最新 y ...
- 让QQ好友现形
方法一 现在使用QQ的朋友,越来越注重保护自己的个人信息,如果对方将个人资料设置为保密你就无法看到对方的资料了,而这位好友如果又有着不断变换昵称的不良习惯,那么随着QQ好友名单的不断增加,时间一长,你 ...
随机推荐
- JS消化理解
JS执行的时候是必须在网页里面执行,和样式表差不多,也是内嵌的样式表,嵌在网页里面或外部的! 一 嵌在网页里面怎么嵌? 如果你想在网页里面嵌脚本,你需要在网页里面打出一块区域,这块区域来写脚本,在写样 ...
- Qt入门之基础篇(1):Qt4及Qt5的下载与安装
转载请注明出处:CN_Simo. 导语: Qt是一个跨平台的C++图形界面应用程序框架.它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序.Qt很容易扩展,并且 ...
- 理解javascript中的Function.prototype.bind
在初学Javascript时,我们也许不需要担心函数绑定的问题,但是当我们需要在另一个函数中保持上下文对象this时,就会遇到相应的问题了,我见过很多人处理这种问题都是先将this赋值给一个变量(比如 ...
- SQL 数据库基本知识
SQL:Structured Quety Language SQL SERVER是一个以客户/服务器(c/s)模式访问.使用Transact-SQL语言的关系型数据库管理子系统(RDBMS) DBMS ...
- [译] 关于 Git 你需要知道的一些事情
分支和合并 Git 跟其他版本控制系统最大的优势就在于其高级的分支模型. Git 允许而且 鼓励 你在本地使用多个完全独立的分支.这些分支的创建,合并和删除几乎都可以在几秒内完成. 这意味着你可以轻松 ...
- JAVA构造函数的继承
1.子类中无参构造函数,可直接继承父类中无参构造函数,前提是所有变量均为public 如下:父类Student中有空构造函数Student(),子类Pupil中有空构造函数Pupil(),后者会继承前 ...
- mysql学习之权限管理
数据库权限的意义: 为了保证数据库中的业务数据不被非授权的用户非法窃取,需要对数据库的访问者进行各种限制,而数据库安全性控制措施主要有这三种,第一种用户身份鉴别,手段可以是口令,磁卡,指纹等技术,只有 ...
- Mac和Linux系统的:Arp欺骗源码
linux系统, 简化版的ARP欺骗工具 精简版, 没有很多代码, 只要把准备好的数据, 发送给到网卡接口, 利用这个工具, 可以让局域网内的一台计算机暂时掉线: #include <stdio ...
- 关于post与get请求参数存在特殊字符问题
遇到项目中存在文本编辑框输入特殊字符 比如:# ? & 空格 , 导致后台接受不到参数问题,对可能存在特殊字符的参数进行encodeURIComponent; C#后台接受参数不需要解码 也可 ...
- CSS Flexbox 学习指南、工具与框架
Flexbox 是一种更有效的布局方式,它能更好的分配容器空间,并控制项目的对齐.虽然,掌握它的理论有些复杂,但幸运的是,我们可以借助开放的网络来学习并逐步掌握它. 在本文中,我们整合了一些最佳的 F ...