网易技术干货 | 云信Web SDK测试实践
一、項目介紹
網易云信于2015年成立,為網易集團下屬的內資公司,總部位于杭州。除資深老杭研外,團隊核心90%來自硅谷、百度、騰訊、阿里、華為等大型企業/獨角獸公司,平均行業經驗10年以上,掌握業內領先的IM及實時視頻通訊系統研發技術。憑借集團的強大優勢、團隊的專業能力及24小時全天候的運維支持服務,截止當前,網易云信產品已覆蓋用戶7億+,覆蓋196個國家,覆蓋地區567個。
云信IM即時通訊為方便開發者接入提供了包含iOS、AOS、PC、Web的SDK開發包,基本涵蓋了能夠用到的接口,開發者直接調用即可實現相應功能模塊,極大的節省了開發周期,節省了開發成本;其中Web端的SDK是由JavaScript實現,本次就是針對Web端的JS-SDK接口測試分享經驗。
二、karma框架介紹
1. karma介紹
Karma 是一個基于 Node.js 的 JavaScript 測試執行過程管理工具(Test Runner)。該工具可用于測試所有主流 Web 瀏覽器,也可以集成到 CI(Continuous integration)工具,還可以和其他代碼編輯器一起使用。Karma 會監控配置文件中所指定的每一個文件,每當文件發生改變,它都會向測試服務器發送信號,來通知所有的瀏覽器再次運行測試代碼。此時,瀏覽器會重新加載源文件,并執行測試代碼。其結果會傳遞回服務器,并以某種形式顯示給開發者。
1.1 框架結構
karma是一種C/S架構的服務框架,包含 client 和 server,通訊方式基于 Http ,通常情況下,客戶端和服務端基本都運行在開發者本地機器上
1.2 Server
- 監聽文件
- 與 client 進行通訊
- 向開發者輸出測試結果
- 提供 client 端所需的資源文件
1.2.1 Manager
主要責任就是跟 client 進行通訊,比如廣播信號通知 client 開始測試以及收集 client 返回的測試結果,并且會與其他server的服務通信,比如用例執行完畢通知reporter服務生成測試報告。
1.2.2 Web Server
主要是提供訪問本地靜態資源用的,這里的資源包含:JS 測試框架,斷言庫,測試用例以及它的依賴等,client通過http獲取必要資源執行用例。
1.2.3 Reporter
主要是生成測試結果,數據來源是Manager統計的測試結果
1.2.4 File System Watcher
主要是監聽本地文件改變,內部維護了一個數據模型,包含所有測試相關的文件,它能保證 Web Server拉取的靜態資源都是最新的,同時也能保證文件訪問成本以及網絡成本,永遠只加載修改的文件。
1.3 client
client是測試文件真正運行的地方,比如一個 PC,iphone,tablet 端的瀏覽器,通常情況下跟 server 是同一個物理機,當然也可以運行在不同的機器,通過 HTTP 來通訊。一個server可以支持多個client執行用例。
1.3.1 Manager
這里主要是跟 server 進行消息通訊,以及與其它 client 組成部分進行交互,比如測試框架 mocha
1.3.2 Testing Framework
測試框架不是系統的一部分,karma 靈活支持第三方測試框架,以插件的形式接入。
1.3.3 Tests and Code under Test
這里包含用戶所有的測試相關文件,它是通過 web-server 模塊來獲取,測試文件由 test framework 來執行。
2、jasmine介紹
Jasmine即是上面所說的JavaScript測試框架。它不依賴于其他任何JavaScript組件,它有干凈的語法,Jasmine斷言庫可以讓你簡單的寫出測試代碼,(斷言:表示為一些布爾表達式,你可以采用假設的方式,當程序輸出的結果是否與假設的結果一致時,斷言為真,否則,斷言為假)在karma上運行Jasmine可以完成JavaScript的自動化測試、生成覆蓋率報告等,jasmine單元測試有二個核心的部分:describe 函數塊和it函數塊。具體語法可查詢網上資料。
三、框架搭建
1、node.js安裝
下載最新版node.js安裝,node.js集成的有npm包管理工具
2、初始化項目
創建一個文件夾,在該文件夾內執行npm init命令,初始化項目,生成package.json文件
3、安裝karma
執行npm install karma --save-dev命令,安裝karma
4、初始化karma配置
執行karma init命令生成生成karma.conf.js文件
配置package.json文件,增加必要依賴,如圖
?
- karma-junit-reporter為測試報告插件,主要是生成測試報告
- karma-phantomjs-launcher為無界面瀏覽器插件,主要是在服務器運行測試代碼需要無界面的瀏覽器
- karma-coverage為代碼覆蓋率插件,主要是統計被測試代碼的覆蓋率
5、karma.conf.js文件配置
5.1 配置執行用例瀏覽器
browsers: ['ChromeHeadless']
目前karma支持瀏覽器列表如下
- Chrome and Chrome Canary
- Firefox
- Safari
- PhantomJS
- JSDOM
- Opera
- Internet Explorer
- SauceLabs
- BrowserStack
5.2 配置測試報告生成
reporters: ['dots', 'junit'],
junitReporter: {
outputFile: 'test-results.xml'
},
5.3 配置karma server端口
port: 9876,
5.4 配置測試用例集
其中spec目錄下面存放的是sdk被測試文件,case/const.js是配置全局的登錄賬號和jasmine超時配置,case/nim/init.js是初始化登錄實現。測試文件的引入一定要先引入sdk文件,然后再引入全局配置文件,再初始化登錄實現用例,順序不能亂掉。
6、關鍵部分實現
6.1 初始化登錄
調用SDK的SDK.NIM.getInstance()方法初始化登錄,返回nim全局對象,登錄成功后調用onconnect()方法,不同的登錄狀態會調用不同的方法,可根據調用不同方法實現對登錄后的操作。it()方法是jasmine語法,在初始化登錄后斷言登錄是否成功。
6.2消息發送
調用初始化登錄的nim對象的sendText方法實現消息的發送,發送成功后sdk會調用sendMsgDone()方法返回結果,it()方法中對返回的結果斷言,這里使用jasmine異步功能,當spec執行完成之后需要調用done 來告訴Jasmine異步操作已經完成,可以在全部配置文件case/const.js中配置jasmine異步的超時時間,配置項為
jasmine.DEFAULT_TIMEOUT_INTERVAL。
四、環境隔離
由于Web SDK有測試、預發、線上多套環境,所以對于環境的測試區分還是非常有必要的,karma的運行需要運行karma.conf.js文件,所有配置多套karma.conf.js文件就可以做到不同環境的使用不同的karma.conf.js文件做到環境隔離,可以使用同一個package.json文件配置執行不同環境的命令,例如測試環境配置測試環境的karma.conf.js,預發和線上同樣,這樣只需要執行命令npm run test/pre/online從而達到環境隔離。
五、Jenkins集成
由于js的運行是基于node,所以對于持續集成只需要服務器上面裝有node.js便可以實現每日構建,而且karma和jasmine對于linux都是支持的,上面介紹的karma-phantomjs-launcher插件可以解決服務器上面沒有瀏覽器的問題,phantomjs是一種無界面化瀏覽器,這樣測試代碼的運行就不依賴于瀏覽器。
運行結果:
六、搭建遠程服務
由于開發者實現Web SDK方式是多樣的,所以對于測試來講可以搭建一個遠程測試服務,這樣不僅可以實現PC端的測試,同時手機端的測試也是可以的。
配置karma.conf.js
singleRun:false
singleRun=false是指用例運行完畢不關閉瀏覽器,這樣就可以在服務器上面啟動karma服務,通過訪問http://ip+端口方式訪問karma獲取到測試資源執行測試用例。這樣就可以忽略終端的限制,不管是什么終端的瀏覽器都可以通過這種方式執行測試用例,再生成該終端的瀏覽器的測試報告。
前面講到karma server的File System Watcher功能,它可以動態的更新測試資源,所以karma服務啟動后,如果SDK有修改只要更換SDK文件即可,瀏覽器即可獲取到最新的SDK測試資源,測試用例文件同樣。
七、總結
使用karma+jasmine框架實現Web SDK的測試,可以很好的避免手工測試繁瑣和效率低下的問題,每次版本回歸不僅節約了時間,也保障了項目的質量。其實很多項目中的JavaScript都可以使用該框架進行測試,不僅僅作為測試的一種工具,也可以作為前端開發者單元測試的一種手段。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的网易技术干货 | 云信Web SDK测试实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网易技术干货 | 云信移动端音视频UI自
- 下一篇: 重磅发布|网易云信质量数据监控台对外开放