您好,登錄后才能下訂單哦!
使用Angular + Karma + Jasmine可以進行前端的單體測試,從前面的文章中我們了解到了Karma的工作原理,它會啟動一個指定種類的瀏覽器,然后在此瀏覽器中運行測試用例。如果需要進行持續集成,比如結合Jenkins或者其他方式進行自動化的測試,如果需要手動關閉瀏覽器的操作,或者無法提供圖形化的界面的情況保證測試的執行這些都會成為持續集成的障礙,這篇文章整理一下解決的常見方法。
可使用瀏覽器的測試環境
當測試環境可以使用瀏覽器,在這臺機器上使用ng test則能進行測試,Karma會啟動Chrome瀏覽器,然后執行測試用例,持續集成的時候,Jenkins通過遠程命令執行的方式到可使用瀏覽器的測試環境中執行ng test完成測試。
這種方式非常簡單,需要解決的只有一個問題,Angular 的demo應用執行ng test時,執行完畢之后,Chrome瀏覽器也不會退出,這樣Jenkins的調用部分也不會返回,只需要保證其執行結束后立即關閉瀏覽器,這種方式就沒有問題了。而實際上Karma的設定文件中,singleRun正是這個選項,缺省被設定為false,這就是其不退出的原因。只需要將此選項設定為true即可。demo示例的Karma設定文件改成如下即可:
liumiaocn:demo liumiao$ cp karma.conf.js karma.conf.js.origin liumiaocn:demo liumiao$ vi karma.conf.js liumiaocn:demo liumiao$ diff karma.conf.js karma.conf.js.origin 29c29 < singleRun: true, --- > singleRun: false, liumiaocn:demo liumiao$
執行日志如下所示:
liumiaocn:demo liumiao$ rm -rf coverage/ liumiaocn:demo liumiao$ ls README.md e2e node_modules src tsconfig.spec.json angular.json karma.conf.js package-lock.json tsconfig.app.json tslint.json browserslist karma.conf.js.origin package.json tsconfig.json liumiaocn:demo liumiao$ liumiaocn:demo liumiao$ ng test --code-coverage 30% building 12/12 modules 0 active31 10 2019 20:19:39.308:INFO [karma-server]: Karma v4.1.0 server started at http://0.0.0.0:9876/ 31 10 2019 20:19:39.314:INFO [launcher]: Launching browsers Chrome with concurrency unlimited 30% building 13/13 modules 0 active31 10 2019 20:19:39.324:INFO [launcher]: Starting browser Chrome 31 10 2019 20:19:43.028:INFO [Chrome 78.0.3904 (Mac OS X 10.14.0)]: Connected on socket Pwhf3R-KNkzVDi1AAAAA with id 46366297 Chrome 78.0.3904 (Mac OS X 10.14.0): Executed 3 of 3 SUCCESS (0.373 secs / 0.321 secs) TOTAL: 3 SUCCESS TOTAL: 3 SUCCESS TOTAL: 3 SUCCESS =============================== Coverage summary =============================== Statements : 100% ( 6/6 ) Branches : 100% ( 0/0 ) Functions : 100% ( 1/1 ) Lines : 100% ( 5/5 ) ================================================================================ liumiaocn:demo liumiao$ ls README.md coverage karma.conf.js.origin package.json tsconfig.json angular.json e2e node_modules src tsconfig.spec.json browserslist karma.conf.js package-lock.json tsconfig.app.json tslint.json liumiaocn:demo liumiao$
在這個過程中可以看到Chrome被自動打開、執行測試用例并顯示結果然后自動退出了。通過遠程方式調用應該也沒有問題。不評價解決方法的好壞與局限性,這也是一種實現的方式。
無需打開瀏覽器的測試環境: PhantomJS
比如測試環境在一個基于Alpine版Linux的容器之中的情況下,無法使用或者不希望使用圖形化的瀏覽器的情況下,可以使用瀏覽器的Headless模式或者無界面方式的瀏覽器。PhantomJS就是這樣的一種解決方法,Phantom是一個隱形的瀏覽器,就像它的名字那樣,像一個“鬼魂/幻影/幽靈”,而事實上并沒有那么高深。PhantomJS是基于Webkit內核的Headless模式,所以Webkit瀏覽器能做的事情,基本上它都能做,在之前爬蟲的一些使用場景中有需要愛好者的追隨。目前穩定版本為2.1,短時間內將為穩定在這一版本,因為目前其已經暫停更新了,更新時間據說會另行通知,但是遲遲未到。使用這個暫時停更的PhantomJS也是一種解決方法,具體步驟如下。
步驟1: 安裝PhantomJS
安裝非常簡單,PhantomJS提供Windows/Linux/MacOS的二進制文件,只需要將相應的bin目錄加入到PATH搜素路徑中即完成了安裝,此處以MacOS上的安裝為例。
下載地址:https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-macosx.zip
解壓:解壓至/usr/local/phantomjs下
版本確認:phantomjs --version
liumiaocn:demo liumiao$ export PATH=$PATH:/usr/local/phantomjs/phantomjs-2.1.1-macosx/bin liumiaocn:demo liumiao$ which phantomjs /usr/local/phantomjs/phantomjs-2.1.1-macosx/bin/phantomjs liumiaocn:demo liumiao$ phantomjs --version 2.1.1 liumiaocn:demo liumiao$
步驟2: 安裝karma-phantomjs-launcher
執行日志入如下所示:
liumiaocn:demo liumiao$ npm install --save-dev karma-phantomjs-launcher > phantomjs-prebuilt@2.1.16 install /Users/liumiao/Desktop/demo/node_modules/phantomjs-prebuilt > node install.js Considering PhantomJS found at /usr/local/phantomjs/phantomjs-2.1.1-macosx/bin/phantomjs Found PhantomJS at /usr/local/phantomjs/phantomjs-2.1.1-macosx/bin/phantomjs ...verifying Writing location.js file PhantomJS is already installed on PATH at /usr/local/phantomjs/phantomjs-2.1.1-macosx/bin/phantomjs npm WARN eslint-plugin-compat@3.3.0 requires a peer of eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 but none is installed. You must install peer dependencies yourself. + karma-phantomjs-launcher@1.0.4 added 16 packages from 36 contributors in 9.804s liumiaocn:demo liumiao$
步驟3: 修改Karma的配置文件
將缺省的karma配置文件做如下修改即可
liumiaocn:demo liumiao$ diff karma.conf.js karma.conf.js.origin 10c10 < require('karma-phantomjs-launcher'), --- > require('karma-chrome-launcher'), 28,29c28,29 < browsers: ['PhantomJS'], < singleRun: true, --- > browsers: ['Chrome'], > singleRun: false, liumiaocn:demo liumiao$
修改說明:
如果使用的是Angular 8或者是es6的target設定需要將target做如下修改
liumiaocn:demo liumiao$ diff tsconfig.json tsconfig.json.org 13c13 < "target": "es5", --- > "target": "es2015", liumiaocn:demo liumiao$
步驟3: 執行測試
執行ng test可以看到使用的是PhantomJS進行的測試,而且在執行過程中并沒有瀏覽器被打開和執行。
liumiaocn:demo liumiao$ ng test --code-coverage 25% building 94/94 modules 0 active01 11 2019 06:11:48.490:INFO [karma-server]: Karma v4.1.0 server started at http://0.0.0.0:9876/ 01 11 2019 06:11:48.493:INFO [launcher]: Launching browsers PhantomJS with concurrency unlimited 25% building 96/96 modules 0 active01 11 2019 06:11:48.573:INFO [launcher]: Starting browser PhantomJS 01 11 2019 06:11:52.035:INFO [PhantomJS 2.1.1 (Mac OS X 0.0.0)]: Connected on socket PTR3E6eTdHOW0JcEAAAA with id 8370488 PhantomJS 2.1.1 (Mac OS X 0.0.0): Executed 3 of 3 SUCCESS (0.512 secs / 0.769 secs) TOTAL: 3 SUCCESS TOTAL: 3 SUCCESS TOTAL: 3 SUCCESS =============================== Coverage summary =============================== Statements : 100% ( 7/7 ) Branches : 100% ( 0/0 ) Functions : 100% ( 2/2 ) Lines : 100% ( 6/6 ) ================================================================================ liumiaocn:demo liumiao$
此中方式由于PhantomJS已經暫停更新,碰到問題時可能會較為尷尬,比如目前就出現在Angular 8升級是PhantomJS無法正常動作的網上發帖求助,實際上修改為es5能解決大部分問題,所以選擇時需要慎重考慮。
無需打開瀏覽器的測試環境: Chrome的無頭模式
PhantomJS使用Webkit內核,無需打開瀏覽器來完成測試,而實際上除去IE的很多瀏覽器都提供這種所謂的無頭(Headless)模式,Chrome也可以直接提供,在Chrome 59開始提供了headless mode(無頭模式)。在Angular 8中使用Chrome的無頭模式進行測試非常簡單,只需要修改缺省的瀏覽器從Chrome到ChromeHeadless即可。
步驟1: 修改Karma的配置文件
將缺省的karma配置文件做如下修改即可
liumiaocn:demo liumiao$ diff karma.conf.js karma.conf.js.origin 28,29c28,29 < browsers: ['ChromeHeadless'], < singleRun: true, --- > browsers: ['Chrome'], > singleRun: false, liumiaocn:demo liumiao$
修改說明:
步驟2: 執行測試
執行ng test可以看到使用的是ChromeHeadless進行的測試,而且在執行過程中并沒有瀏覽器被打開和執行。
liumiaocn:demo liumiao$ ng test --code-coverage 25% building 15/15 modules 0 active01 11 2019 06:37:05.037:INFO [karma-server]: Karma v4.1.0 server started at http://0.0.0.0:9876/ 01 11 2019 06:37:05.040:INFO [launcher]: Launching browsers ChromeHeadless with concurrency unlimited 25% building 93/93 modules 0 active01 11 2019 06:37:05.154:INFO [launcher]: Starting browser ChromeHeadless 01 11 2019 06:37:08.720:INFO [HeadlessChrome 78.0.3904 (Mac OS X 10.14.0)]: Connected on socket Br7fkzwejyGNs2WgAAAA with id 35869507 HeadlessChrome 78.0.3904 (Mac OS X 10.14.0): Executed 3 of 3 SUCCESS (0.374 secs / 0.319 secs) TOTAL: 3 SUCCESS TOTAL: 3 SUCCESS TOTAL: 3 SUCCESS =============================== Coverage summary =============================== Statements : 100% ( 7/7 ) Branches : 100% ( 0/0 ) Functions : 100% ( 2/2 ) Lines : 100% ( 6/6 ) ================================================================================ liumiaocn:demo liumiao$
總結
這篇文章介紹了三種常見的Karma的集成方式,由于PhantomJS暫停更新,并且其內核只是Webkit,所以大多數情況直接使用瀏覽器的Headless Mode可能是個更好的主意。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。