1. 程式人生 > >QQ好友線上/離線,怎麼測試?

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 

                                                               瞭解更多請關注微信公眾號:測試架構師