日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
來,加入前端自動(dòng)化單元測試

最近閑來無事,開始摸索前端單元測試。一是不備之需,二是確實(shí)在實(shí)際項(xiàng)目中能夠用到單元測試。這樣可以提高開發(fā)效率,提升代碼質(zhì)量,完全可以單獨(dú)對 JS 進(jìn)行測試,無需頁面,不依賴其他第三方。

為什么需要單元測試

在這里首先需要知道單元測試的目的及結(jié)果:

  • 使代碼健壯,質(zhì)量高,兼容各種臨界點(diǎn);
  • 減少 QA 測試報(bào)告的反饋,提高自我影響力;
  • 保證代碼的整潔清晰。

如果需要刨根問底追究為什么需要進(jìn)行單元測試,那我們可以開始講講實(shí)際項(xiàng)目開發(fā)中遇到的一些問題:

  • QA 不斷反饋代碼有 BUG (此時(shí)你正在投入的開發(fā),然后被打擾...);
  • 代碼出現(xiàn) BUG,疊加代碼修復(fù) BUG(代碼越來越難維護(hù)...);
  • 已經(jīng)開發(fā)完成一個(gè)模塊,但是沒有頁面提供調(diào)試測試;
  • 你開發(fā)完成的功能,每次都有許多細(xì)小的 BUG(個(gè)人影響力下降...)。

好了,列舉了這么多原因,相信你也開始心虛了,回去繼續(xù)搬磚檢查檢查代碼有沒有問題,如果你面色從容,大神,請手下我的膝蓋。

總結(jié):單元測試的目的只有一個(gè),用來確定是否適合使用

如何進(jìn)行單元測試

如果明白了為什么要進(jìn)行單元測試,相信你已經(jīng)可以開始著手為自己的代碼寫一些單元測試代碼。測試從字面理解就是檢驗(yàn),看對象是否達(dá)標(biāo),達(dá)標(biāo)就是 pass,不達(dá)標(biāo)就是 fail。產(chǎn)品有這樣一個(gè)需求,如果結(jié)果是 3 達(dá)到目標(biāo)且返回的為有效的數(shù)字類型才可以進(jìn)行比較,下面看個(gè)栗子:

 
 
  1. /** 
  2.  * 獲取 a 除以 b 的結(jié)果 
  3.  * @param  {[Number]} a [數(shù)字] 
  4.  * @param  {[Number]} b [數(shù)字] 
  5.  * @return {[Number]}   [結(jié)果數(shù)字] 
  6.  */ 
  7. function division(a, b) { 
  8.     return a / b; 
  9.  
  10. // 測試代碼 
  11. function test() { 
  12.     var result = division(6, 2); 
  13.      
  14.     if (result === 3) { 
  15.         console.log('pass'); 
  16.     } else { 
  17.         console.log('fail'); 
  18.     } 
  19. }  

咋一看上面的代碼沒什么問題,可以滿足產(chǎn)品的需求,但是問題來了,如果 b 為 0,這個(gè)模塊就出現(xiàn)了 BUG,同時(shí)如果下次需要達(dá)到其他的值就算通過,那就得去修改測試代碼,這樣的測試代碼本身也太不健全。于是乎有了下面的方式:

 
 
  1. /** 
  2.  * 獲取 a 除以 b 的結(jié)果 
  3.  * @param  {[Number]} a [數(shù)字] 
  4.  * @param  {[Number]} b [數(shù)字] 
  5.  * @return {[Number]}   [結(jié)果數(shù)字] 
  6.  */ 
  7. function division(a, b) { 
  8.  
  9.     if (b === 0) { 
  10.         return 0; 
  11.     } else { 
  12.         return a / b; 
  13.     } 
  14.  
  15. function test(name, result, expect) { 
  16.  
  17.     if (result === expect) { 
  18.         console.log(name + '-> pass'); 
  19.     } else { 
  20.         console.log(name + '-> fail'); 
  21.     } 
  22. test('normal number', division(6, 2), 3); 
  23. test('zero', division(6, 0), 0);  

如果需要期望值為 10 就通過,那可以這樣:

 
 
  1. test('normal number is 10', division(20, 2), 10); 

單元測試環(huán)境搭建及代碼示例

但是隨著前端迅速的發(fā)展,也出現(xiàn)了很多測試框架,下面我演示我在實(shí)際項(xiàng)目中使用的測試框架環(huán)境配置 karma + jasmine,對于 karma、jasmine 我就不介紹,網(wǎng)上一搜一大把介紹:

1. 安裝 node 環(huán)境

依賴于 node 作為基礎(chǔ)環(huán)境,安裝完成在控制臺(tái)運(yùn)行下面命令查看是否安裝成功。

 
 
  1. node -v 

2. 新建目錄并通過以下命令初始化項(xiàng)目配置 package.json

 
 
  1. npm init 

在 package.json scripts: {} 添加以下內(nèi)容:

 
 
  1. "test": "karma start karma.conf.js" 

3. 依次安裝測試框架

 
 
  1. npm install karma -g 
  2. npm install jasmine --save-dev 
  3. npm install karma-jasmine --save-dev 
  4. npm install karma-chrome-launcher --save-dev 
  5. npm install jasmine-core --save-dev  

或者一次性安裝

 
 
  1. npm install karma -g 
  2.  
  3. npm install jasmine karma-jasmine karma-chrome-launcher jasmine-core --save-dev  

運(yùn)行以下命令新建 karma.conf.js(根目錄下不是必須)

 
 
  1. karma init 

文件內(nèi)容及說明:

 
 
  1. /** 
  2.  * karma 自動(dòng)化測試參數(shù)配置 
  3.  */ 
  4.  
  5. module.exports = function(config) { 
  6.     config.set({ 
  7.  
  8.         // 基礎(chǔ)路徑,用在files,exclude屬性上 
  9.         basePath: '', 
  10.  
  11.         // 可用的測試框架: https://npmjs.org/browse/keyword/karma-adapter 
  12.         frameworks: ['jasmine'], 
  13.  
  14.         // 需要加載到瀏覽器的文件列表 
  15.         files: [ 
  16.             './src/**/*.js', 
  17.             './test/unit/specs/*.spec.js' 
  18.         ], 
  19.  
  20.         // 排除的文件列表 
  21.         exclude: [ 
  22.             'karma.conf.js' 
  23.         ], 
  24.  
  25.         // 在瀏覽器使用之前處理匹配的文件 
  26.         // 可用的預(yù)處理: https://npmjs.org/browse/keyword/karma-preprocessor 
  27.         preprocessors: {}, 
  28.  
  29.         // 使用測試結(jié)果報(bào)告者 
  30.         // 可能的值: "dots", "progress" 
  31.         // 可用的報(bào)告者: https://npmjs.org/browse/keyword/karma-reporter 
  32.         reporters: ['progress'], 
  33.  
  34.         // web server port 
  35.         port: 9876, 
  36.  
  37.         // 啟用或禁用輸出報(bào)告或者日志中的顏色 
  38.         colors: true, 
  39.  
  40.         /** 
  41.          * 日志等級 
  42.          * 可能的值: 
  43.          * config.LOG_DISABLE //不輸出信息 
  44.          * config.LOG_ERROR    //只輸出錯(cuò)誤信息 
  45.          * config.LOG_WARN //只輸出警告信息 
  46.          * config.LOG_INFO //輸出全部信息 
  47.          * config.LOG_DEBUG //輸出調(diào)試信息 
  48.          */ 
  49.         // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG 
  50.         logLevel: config.LOG_INFO, 
  51.  
  52.         // 啟用或禁用自動(dòng)檢測文件變化進(jìn)行測試 
  53.         autoWatch: true, 
  54.  
  55.         // 測試啟動(dòng)的瀏覽器 
  56.         // 可用的瀏覽器: https://npmjs.org/browse/keyword/karma-launcher 
  57.         browsers: ['Chrome'], 
  58.  
  59.         // 開啟或禁用持續(xù)集成模式 
  60.         // 設(shè)置為true, Karma將打開瀏覽器,執(zhí)行測試并***退出 
  61.         singleRun: false, 
  62.  
  63.         // 并發(fā)級別(啟動(dòng)的瀏覽器數(shù)) 
  64.         concurrency: Infinity, 
  65.  
  66.         // 依賴插件 
  67.         plugins: [ 
  68.             'karma-chrome-launcher', 
  69.             'karma-jasmine' 
  70.         ] 
  71.     }) 
  72. }  

5. 新建源代碼及測試代碼目錄,目錄結(jié)構(gòu)如下:

 
 
  1. project 
  2.     - node_modules 
  3.         - *(node 模塊) 
  4.     - src 
  5.         - FQA 
  6.             - index.js 
  7.     - test 
  8.         - unit 
  9.             - specs 
  10.                 - *.spec.js 
  11.     - karma.conf.js 
  12.     - package.json  

6. 測試代碼

。index.js 源碼

 
 
  1. /** 
  2.  - test map method callback and parseInt param use 
  3.  - @return {[Array]} [Array] 
  4.  */ 
  5. function checkMap() { 
  6.     var nums = ['1', '2', '3']; 
  7.  
  8.     return nums.map(parseInt); 
  9.  
  10. /** 
  11.  - test null is Object,and common object is same 
  12.  - @return {[Array]} [Array] 
  13.  */ 
  14. function typeofAndInstanceOf() { 
  15.     var result = []; 
  16.     result.push(typeof null); 
  17.     result.push(null instanceof Object); 
  18.  
  19.     return result; 
  20.  
  21. /** 
  22.  - 檢測操作符優(yōu)先級 
  23.  - @return {[string]} [返回字符串] 
  24.  */ 
  25. function checkOperators() { 
  26.     var result = 'autoTest'; 
  27.     result = 'Value is ' + (result === 'autoTest') ? 'Something' : 'Nothing'; 
  28.  
  29.     return result; 
  30. }  

。fqa.spec.js 測試代碼

 
 
  1. /** 
  2.  - test index.js checkMap method 
  3.  - detail: 
  4.  -     parseInt(val, base), base is 2 ~ 36, otherwise value equal NaN. 
  5.  */ 
  6. describe('test map and callback parseInt', function() { 
  7.      
  8.     it('a array call map', function() { 
  9.         var nums = checkMap(); 
  10.         console.log(nums); 
  11.  
  12.         expect([1, NaN, NaN]).toEqual(nums); 
  13.     }); 
  14. }); 
  15.  
  16. /** 
  17.  - test index.js typeofAndInstanceOf method 
  18.  - detail: 
  19.  -     typeof null qeual 'object', but null instanceof Object equal false, because null Constructor not Object. 
  20.  */ 
  21. describe('test null is object', function() { 
  22.      
  23.     it('null object', function() { 
  24.         var result = typeofAndInstanceOf(); 
  25.         console.log(result); 
  26.  
  27.         expect(['object', false]).toEqual(result); 
  28.     }); 
  29. }); 
  30.  
  31. /** 
  32.  - test index.js checkOperators method 
  33.  - detail: 
  34.  -     compare operator precedence, + gt ?. 
  35.  */ 
  36. describe('test null is object', function() { 
  37.  
  38.     it('test operator preceence', function() { 
  39.         var result = checkOperators(); 
  40.         console.log(result); 
  41.  
  42.         expect('Something').toEqual(result); 
  43.     }); 
  44. });  

7. 運(yùn)行 sudo npm run test 執(zhí)行測試代碼

 
 
  1. "scripts": { 
  2.     "test": "karma start karma.conf.js" 
  3. }  

結(jié)果:

解答

1. npm run test 運(yùn)行的實(shí)際上是 package.json 中配置的命令:

 
 
  1. "test": "karma start karma.conf.js" 

2. describe 定義測試模塊,it 測試一個(gè)單元,describe 內(nèi)部可以同時(shí)定義多個(gè) it,因此可以做一系列的單元測試,測試方法詳見官方文檔。

3. karma.conf.js 配置 files 設(shè)置測試時(shí)需要被加載的文件

 
 
  1. files: [ 
  2.     './src/**/*.js', 
  3.     './test/unit/specs/*.spec.js' 

 總結(jié)

希望看完這篇文章,你也能夠動(dòng)起手來,開始編寫一些單元測試代碼,提高代碼的質(zhì)量,提升自己的周圍影響力。本篇文章內(nèi)容表述了實(shí)際項(xiàng)目開發(fā)中會(huì)遇到的問題,我們可以通過單元測試來減少這類問題的發(fā)生,以提高代碼的安全性,代碼的質(zhì)量,從而保證產(chǎn)品的穩(wěn)定性。點(diǎn)擊此處查看更多文章。


網(wǎng)站標(biāo)題:來,加入前端自動(dòng)化單元測試
鏈接URL:http://m.5511xx.com/article/dheghsg.html