距離上一次博客有2個月了,倒不是沒有可寫東西就是提不起勁寫。javascript
不說這些了此次寫下我使用 karma + webpack
中遇到的代碼覆蓋率問題。html
自個去搜吧,感受講這個的真的多。我就說一些建議。vue
karma的測試框架改用mocha這樣對於一個須要nodejs, browser測試的測試用例能夠共用。具體的能夠看個人 marked-zmjava
依舊是不少人寫過了,可是仍是寫下吧。node
須要的 npm 包webpack
npm i karma karma-mocha karma-phantomjs-launcher karma-sinon-chai / karma-spec-reporter karma-webpack mocha sinon sinon-chai -D
package.jsongit
{ "scripts": { "karma-run": "karma run", "karma-start": "karma start test/unit/karma.conf.js", "karma-single": "karma start test/unit/karma.conf.js --single-run" } }
test/unit/karma.conf.jsgithub
module.exports = function(config) { config.set({ webpack: { devtool: 'inline-source-map', // 推薦使用inline-source-map module: { rules: [/* loaders */] } }, frameworks: ['mocha', 'sinon-chai'], // 測試框架隨便必定要要和我同樣 files: [ './index.js' // 推薦使用一個入口來導入全部的測試。 ], preprocessors: { './index.js': ['webpack'] // 使用什麼配置 }, reporters: ['spec'], // spec顯示插件 port: 9876, // 端口 colors: true, logLevel: config.LOG_INFO, autoWatch: false, browsers: ['PhantomJS'], singleRun: false }) }
test/unit/index.jsweb
// 動態加載全部測試文件 const testsContext = require.context('./specs', true, /\.spec$/) testsContext.keys().forEach(testsContext)
test/unit/specs/test.spec.jsshell
describe('Test', function() { it('test 1+1', function () { expect(1 + 1).to.equal(2) }) })
# 開啓 karma 動態構建 npm run karma-start # new shell,運行一次測試 npm run karma-run
或者直接單次構建並測試
npm run karma-single
這裏若是直接用 karma-coverage
會出現直接對 karma
配置中入口文件生成的 webpack
代碼的代碼覆蓋率測試。會出現不少 webpack
生成的額外代碼。
並且也不是源代碼的代碼覆蓋率測試。
這裏有兩個方案:
karma-coverage + isparta-loader
來自 element-ui 而後去看 isparta-loader
發覺做者已經廢棄推薦換到 istanbul-instrumenter-loader
因此這個我也不用了,直接看另外一個方案吧。
karma-coverage-istanbul-reporter + istanbul-instrumenter-loader
這兩個包除了 README
的說明沒有找到更多的資料,只好本身試着用,下面直接看如何使用吧。
須要的其它 npm 包
npm i karma-coverage-istanbul-reporter istanbul-instrumenter-loader -D
test/unit/karma.conf.js
const path = require('path') const srcPath = path.resolve(__dirname, '../../src') module.exports = function(config) { config.set({ webpack: { devtool: 'inline-source-map', // 推薦使用inline-source-map module: { rules: [ // 像eslint-loader同樣使用,並限定在源碼上。 { test: /\.js$/, enforce: 'pre', use: 'istanbul-instrumenter-loader', inclues: [srcPath] } /* loaders */ ] } }, frameworks: ['mocha', 'sinon-chai'], // 測試框架隨便必定要要和我同樣 files: [ './index.js' // 推薦使用一個入口來導入全部的測試。 ], preprocessors: { './index.js': ['webpack'] // 使用什麼配置 }, // 增長代碼覆蓋率輸出插件 reporters: ['spec','coverage-istanbul'], port: 9876, // 端口 colors: true, logLevel: config.LOG_INFO, autoWatch: false, browsers: ['PhantomJS'], singleRun: false, // 配置代碼覆蓋率插件 coverageIstanbulReporter: { // 以什麼格式, 這裏設置了輸出 html文件 ,info文件 ,及控制檯 reports: ['html', 'lcovonly', 'text-summary'], // 將文件輸出路徑定位 dir: path.join(__dirname, 'coverage'), // 修正 weback 路徑(翻譯了是這個意思) fixWebpackSourcePaths: true, // 將生成的html放到./coverage/html/下 'report-config': { html: { subdir: 'html' } } } }) }
代碼參考 vue-dragging or marked-zm
package.json
{ "scripts": { "node-test": "mocha --reporter spec --require\ test/unit/common test/unit/specs/*.spec.js" } }
test/unit/common.js
global.chai = require("chai") global.should = require("chai").should() global.expect = require("chai").expect global.AssertionError = require("chai").AssertionError const sinonChai = require("sinon-chai") chai.use(sinonChai)
無需修改其它代碼見 marked-zm
下篇看看要不探討 ci
集成,或者 vue
的面板組件直接加載組件而且切換不會丟失狀態。
原來想寫 npm
包發佈後來發覺滿地都是,就算了。