摘要:有質(zhì)量的代碼是要有代碼測(cè)試來(lái)保證的,本文就大致談?wù)劕F(xiàn)在我們是如何實(shí)現(xiàn)使用甚至標(biāo)準(zhǔn)的代碼的高效測(cè)試的。每次代碼修改頁(yè)面都會(huì)自動(dòng)刷新,更強(qiáng)大的是它只會(huì)執(zhí)行你修改了代碼的測(cè)試用例簡(jiǎn)直神器。
有質(zhì)量的代碼是要有代碼測(cè)試來(lái)保證的,本文就大致談?wù)劕F(xiàn)在我們是如何實(shí)現(xiàn)使用es6甚至es7(async/await)標(biāo)準(zhǔn)的JS代碼的高效測(cè)試的。
我們會(huì)用到以下工具
webpack 前端打包工具
mocha 測(cè)試框架
babel 編譯es6/7代碼
karma 命令行下執(zhí)行瀏覽器測(cè)試
istanbul 代碼覆蓋率工具
coveralls 代碼覆蓋統(tǒng)計(jì)服務(wù)商
travis-ci 自動(dòng)集成
安裝mocha
npm i -D mocha
代碼沒(méi)有后端依賴(lài)可直接測(cè)試:
mocha test.js
使用瀏覽器/node不支持的es6需要babel來(lái)編譯代碼
npm i babel -D
啟用es6,這種方式新版本的babel會(huì)自動(dòng)啟動(dòng)async/await
mocha --compilers js:babel/register test.js
如果用到了前端的代碼,就需要webpack這樣的工具
npm i webpack mocha-loader -D webpack "mocha!./test.js" testBundle.js //index.html 包含 testBUndle.js open index.html
需要babel和webpack一起使用的話,先裝loader
npm i babel-loader -D
命令行的 babel-loader 只會(huì)編譯當(dāng)前的文件,如需編譯其它文件需要在 require 處添加才能編譯成功,如果需要啟用 async/await 還需要加入 runtime 選項(xiàng),例如:
require("babel?optional[]=runtime!./index.js")
如果每次require都去加就顯得太繁瑣了,所以建議使用 webpack.config.js 添加
module.exports = { module: { loaders: [ { test: /.js$/, exclude: /node_modules/, loader: "babel-loader?optional[]=runtime" } ] } }
到 webpack.config.js, 現(xiàn)在可以在命令行和require上省去babel了。
這種方式每次修改都要手動(dòng)去編譯再刷新瀏覽器,比較繁瑣,所以推薦使用webpack-dev-server實(shí)時(shí)調(diào)試。
npm i webpack-dev-server -D webpack-dev-server "mocha!./test.js" --hot --inline --output-filename test.js open http://localhost:8080/test
每次代碼修改頁(yè)面都會(huì)自動(dòng)刷新,更強(qiáng)大的是它只會(huì)執(zhí)行你修改了代碼的測(cè)試用例 (簡(jiǎn)直神器)。
現(xiàn)在可以用瀏覽器測(cè)試我們的es6代碼了,下一步是在命令行也能測(cè)試瀏覽器跑的代碼,這里我們用 karma 以啟用 firefox 為例,安裝依賴(lài):
npm i -D karma karma-cli karma-firefox-launcher karma-mocha karma-webpack
然后在 karma.conf.js 文件中加入:
// Karma configuration module.exports = function (config) { config.set({ basePath: "", frameworks: ["mocha"], files: [ "test/test.js" ], exclude: [ ], preprocessors: { "test/test.js": ["webpack"] }, reporters: ["progress"], port: 9876, colors: true, logLevel: config.LOG_INFO, autoWatch: false, // start these browsers // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher browsers: ["Firefox"], webpack: { module: { loaders: [ { test: /.js$/, exclude: /node_modules/, loader: "babel-loader?optional[]=runtime" } ] } }, webpackMiddleware: { noInfo: true }, singleRun: true }) }
執(zhí)行
./node_modules/.bin/karma start
開(kāi)始測(cè)試
光有測(cè)試還不足以讓你信服你的代碼,我們還需要測(cè)試覆蓋,這里以使用 istanbul 為例:
npm i -D istanbul babel-istanbul-instrumenter-loader karma-coverage
修改 karma.conf.js
... reporters: ["progress", "coverage"] ... webpack: { module: { loaders: [ { test: /.js$/, exclude: /node_modules/, loader: "babel-loader?optional[]=runtime" } ], preLoaders: [ // instrument only testing sources with Istanbul { test: /.js$/, include: path.resolve("lib/"), loader: "babel-istanbul-instrumenter" } ] } } .... coverageReporter: { dir: "coverage/", reporters: [ {type: text} { type: "html", subdir: "html" }, { type: "lcovonly", subdir: "lcov" }, { type: "cobertura", subdir: "cobertura" } ] }
這里生成了3中報(bào)告,html是給人看的(瀏覽器打開(kāi) coverage/html/index.html 可以直接查看),另外兩種便于其它的工具分析。
以上工具的用法搭配多樣,這里只是粗淺介紹,真正使用請(qǐng)認(rèn)真閱讀相關(guān)文檔。
最后是如何持續(xù)集成,ravis-ci 和 coveralls.io 可以很好的合作解決這個(gè)問(wèn)題。
你需要先到 travis-ci 注冊(cè),然后通過(guò) github 授權(quán),啟用相關(guān)的項(xiàng)目。在項(xiàng)目中添加 .travis.yml 配置文件
language: node_js node_js: - "0.12" before_script: - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start
推送到 github 之后,每次提交 travis-ci 都會(huì)先執(zhí)行 npm install 然后執(zhí)行 npm test 中的命令進(jìn)行測(cè)試 (還有其它自定義的設(shè)置,本文略過(guò))
使用 coveralls.io 需要先安裝一個(gè)包來(lái)發(fā)送數(shù)據(jù)
npm i -D coveralls
然后也是注冊(cè)、授權(quán)、啟用相關(guān)項(xiàng)目,最后是做一個(gè)測(cè)試命令把測(cè)試報(bào)告發(fā)給它,以 Makefile 為例:
test-coveralls: @echo TRAVIS_JOB_ID $(TRAVIS_JOB_ID) @node_modules/.bin/karma start --single-run && cat ./coverage/lcov/lcov.info | ./node_modules/coveralls/bin/coveralls.js
修改package.json的測(cè)試命令
scripts: { test: make test-coveralls }
這樣 travis-ci 每次執(zhí)行完測(cè)試都會(huì)把 lcov.info 里的測(cè)試結(jié)果通過(guò) coveralls.js 發(fā)送給 coveralls.io 網(wǎng)站。
做為示范,這是一個(gè)現(xiàn)實(shí)的組件項(xiàng)目 chemzqm/exgrid,還有一個(gè)樣板項(xiàng)目 chemzqm/es6-test-sample。
做為一個(gè)有追求的開(kāi)發(fā)者,向著100%的覆蓋率努力吧!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/8719.html
摘要:有質(zhì)量的代碼是要有代碼測(cè)試來(lái)保證的,本文就大致談?wù)劕F(xiàn)在我們是如何實(shí)現(xiàn)使用甚至標(biāo)準(zhǔn)的代碼的高效測(cè)試的。每次代碼修改頁(yè)面都會(huì)自動(dòng)刷新,更強(qiáng)大的是它只會(huì)執(zhí)行你修改了代碼的測(cè)試用例簡(jiǎn)直神器。 有質(zhì)量的代碼是要有代碼測(cè)試來(lái)保證的,本文就大致談?wù)劕F(xiàn)在我們是如何實(shí)現(xiàn)使用es6甚至es7(async/await)標(biāo)準(zhǔn)的JS代碼的高效測(cè)試的。 我們會(huì)用到以下工具 webpack 前端打包工具 moch...
摘要:什么是單頁(yè)面應(yīng)用單頁(yè)面應(yīng)用是指用戶在瀏覽器加載單一的頁(yè)面,后續(xù)請(qǐng)求都無(wú)需再離開(kāi)此頁(yè)目標(biāo)旨在用為用戶提供了更接近本地移動(dòng)或桌面應(yīng)用程序的體驗(yàn)。流程第一次請(qǐng)求時(shí),將導(dǎo)航頁(yè)傳輸?shù)娇蛻舳耍溆嗾?qǐng)求通過(guò)獲取數(shù)據(jù)實(shí)現(xiàn)數(shù)據(jù)的傳輸通過(guò)或遠(yuǎn)程過(guò)程調(diào)用。 什么是單頁(yè)面應(yīng)用(SPA)? 單頁(yè)面應(yīng)用(SPA)是指用戶在瀏覽器加載單一的HTML頁(yè)面,后續(xù)請(qǐng)求都無(wú)需再離開(kāi)此頁(yè) 目標(biāo):旨在用為用戶提供了更接近本地...
摘要:什么是單頁(yè)面應(yīng)用單頁(yè)面應(yīng)用是指用戶在瀏覽器加載單一的頁(yè)面,后續(xù)請(qǐng)求都無(wú)需再離開(kāi)此頁(yè)目標(biāo)旨在用為用戶提供了更接近本地移動(dòng)或桌面應(yīng)用程序的體驗(yàn)。流程第一次請(qǐng)求時(shí),將導(dǎo)航頁(yè)傳輸?shù)娇蛻舳耍溆嗾?qǐng)求通過(guò)獲取數(shù)據(jù)實(shí)現(xiàn)數(shù)據(jù)的傳輸通過(guò)或遠(yuǎn)程過(guò)程調(diào)用。 什么是單頁(yè)面應(yīng)用(SPA)? 單頁(yè)面應(yīng)用(SPA)是指用戶在瀏覽器加載單一的HTML頁(yè)面,后續(xù)請(qǐng)求都無(wú)需再離開(kāi)此頁(yè) 目標(biāo):旨在用為用戶提供了更接近本地...
閱讀 1233·2021-11-23 09:51
閱讀 678·2021-11-19 09:40
閱讀 1337·2021-10-11 10:58
閱讀 2347·2021-09-30 09:47
閱讀 3726·2021-09-22 15:55
閱讀 2160·2021-09-03 10:49
閱讀 1250·2021-09-03 10:33
閱讀 698·2019-08-29 17:12