自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

來,加入前端自動化單元測試

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

 [[172272]]

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

為什么需要單元測試

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

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

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

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

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

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

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

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

  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,這個模塊就出現(xiàn)了 BUG,同時如果下次需要達(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)了很多測試框架,下面我演示我在實際項目中使用的測試框架環(huán)境配置 karma + jasmine,對于 karma、jasmine 我就不介紹,網(wǎng)上一搜一大把介紹:

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

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

  1. node -v 

2. 新建目錄并通過以下命令初始化項目配置 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 自動化測試參數(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é)果報告者 
  30.         // 可能的值: "dots""progress" 
  31.         // 可用的報告者: https://npmjs.org/browse/keyword/karma-reporter 
  32.         reporters: ['progress'], 
  33.  
  34.         // web server port 
  35.         port: 9876, 
  36.  
  37.         // 啟用或禁用輸出報告或者日志中的顏色 
  38.         colors: true
  39.  
  40.         /** 
  41.          * 日志等級 
  42.          * 可能的值: 
  43.          * config.LOG_DISABLE //不輸出信息 
  44.          * config.LOG_ERROR    //只輸出錯誤信息 
  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.         // 啟用或禁用自動檢測文件變化進(jìn)行測試 
  53.         autoWatch: true
  54.  
  55.         // 測試啟動的瀏覽器 
  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ā)級別(啟動的瀏覽器數(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)行的實際上是 package.json 中配置的命令: 

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

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

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

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

 總結(jié) 

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

責(zé)任編輯:龐桂玉 來源: segmentfault
相關(guān)推薦

2017-01-16 13:38:05

前端開發(fā)自動化

2009-08-19 09:00:48

單元測試框架自動化測試

2012-03-30 15:52:51

ibmdw

2009-08-12 18:37:46

VSTS2005單元測

2016-09-21 15:35:45

Javascript單元測試

2021-06-30 19:48:21

前端自動化測試Vue 應(yīng)用

2017-01-14 23:42:49

單元測試框架軟件測試

2021-10-12 19:16:26

Jest單元測試

2022-03-15 11:55:24

前端單元測試

2021-06-25 10:57:30

前端自動化測試開發(fā)

2021-06-26 07:40:21

前端自動化測試Jest

2016-09-14 21:55:33

前端測試Karma

2023-05-18 14:01:00

前端自動化測試

2022-09-14 10:00:12

前端自動化測試

2017-09-13 15:05:10

React前端單元測試

2017-09-10 17:41:39

React全家桶單元測試前端測試

2017-01-16 12:12:29

單元測試JUnit

2017-01-14 23:26:17

單元測試JUnit測試

2017-03-30 07:56:30

測試前端代碼

2010-08-27 09:11:27

Python單元測試
點贊
收藏

51CTO技術(shù)棧公眾號