摘要:本文介紹了的入門知識點(diǎn)。注意,此處并沒有直接引入的。可以引入的插件來查看測試覆蓋率,該插件會在目標(biāo)代碼中插入很多額外的代碼,用于判斷測試代碼執(zhí)行流程有沒有走到這些地方。在的時候,最好關(guān)掉功能,不然這些額外的代碼非常影響調(diào)試。
本文介紹了 karma 的入門知識點(diǎn)。
什么是 karmakarma 是一個提升測試效率的工具,幫助開發(fā)者更好更快速地在多種環(huán)境下執(zhí)行測試代碼,拿到測試結(jié)果。在運(yùn)行的時候,它會自動啟動配置好的瀏覽器,同時也會啟動一個 node 服務(wù)器,然后在啟動好的瀏覽器中執(zhí)行測試代碼,并將測試代碼執(zhí)行結(jié)果傳回給 node 服務(wù)器,然后 node 服務(wù)器在打印出收到的執(zhí)行結(jié)果。
安裝 karma可以通過 npm 安裝 karma :
// 本地安裝 npm i karma --save-dev // 全局安裝 npm i karma -g初始化 karma
安裝完成之后,切換到目標(biāo)項目根目錄,運(yùn)行:
karma init
這樣就會以向?qū)У男问缴?karma 的配置文件 karma.conf.js ,文件內(nèi)容大致為:
// Karma configuration // Generated on Wed Jun 29 2016 23:22:24 GMT+0800 (CST) module.exports = function(config) { config.set({ // 根路徑,后面配置的基本所有相對路徑都會根據(jù)這個路徑來構(gòu)造。 basePath: "", // 使用到的框架 // 目前支持的框架: https://npmjs.org/browse/keyword/karma-adapter frameworks: ["jasmine", "requirejs"], // 將會在瀏覽器里面執(zhí)行的代碼 files: [ "test/main.js", { pattern: "src/**/*.js", // false 表示初始化的時候不會使用 script 標(biāo)簽直接將相關(guān) js 引入到瀏覽器,需要自己寫代碼加載 included: false }, { pattern: "test/**/*Spec.js", included: false } ], // 需要從 files 中排除掉的文件 exclude: [], // 需要做預(yù)處理的文件,以及這些文件對應(yīng)的預(yù)處理器。 // 此處就可以將 coffee 、 ES6 等代碼轉(zhuǎn)換一下。 preprocessors: { "src/**/*.js": ["babel", "coverage"], "test/**/!(main).js": ["babel", "coverage"], "node_modules/protectobject/src/**/*.js": ["babel"] }, // babel 預(yù)處理器的配置 babelPreprocessor: { options: { presets: ["es2015", "stage-0"], plugins: ["transform-decorators-legacy", "transform-es2015-modules-amd"] } }, // 覆蓋率報告器配置 coverageReporter: { type: "html", dir: "coverage" }, // 實(shí)際使用的報告期 // 可用的報告器: https://npmjs.org/browse/keyword/karma-reporter reporters: ["dots", "coverage"], // 服務(wù)器端口號 port: 9876, // 在輸出內(nèi)容(報告器和日志)中啟用/禁用顏色 colors: true, // 日志級別 // 取值: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG logLevel: config.LOG_INFO, // 啟用/禁用監(jiān)視文件變化重新執(zhí)行測試的功能 autoWatch: true, // 要測試的目標(biāo)環(huán)境 browsers: ["Chrome", "Firefox", "Safari"], // Continuous Integration mode // if true, Karma captures browsers, runs the tests and exits singleRun: false, // Concurrency level // how many browser should be started simultaneous concurrency: Infinity }); };配置 Require.js
對于 Require.js ,還要注意配置一個入口文件,主要用于配置 Require.js 的模塊信息等。
上述 karma 配置文件中的 test/main.js 即為 Require.js 的入口文件,在該文件中的代碼一般來說應(yīng)該是這樣的:
var TEST_REGEXP = /(spec|test).js$/i; var allTestFiles = []; // Get a list of all the test files to include Object.keys(window.__karma__.files).forEach(function(file) { if (TEST_REGEXP.test(file)) { // Normalize paths to RequireJS module names. // If you require sub-dependencies of test files to be loaded as-is (requiring file extension) // then do not normalize the paths var normalizedTestModule = file.replace(/^/base/|.js$/g, ""); allTestFiles.push(normalizedTestModule); } }); require.config({ // Karma serves files under /base, which is the basePath from your config file baseUrl: "/base/src", // example of using a couple of path translations (paths), to allow us to refer to different library dependencies, without using relative paths paths: { "jquery": "../lib/jquery", "underscore": "../lib/underscore", }, // example of using a shim, to load non AMD libraries (such as underscore) shim: { "underscore": { exports: "_" } }, // dynamically load all test files deps: allTestFiles, // we have to kickoff jasmine, as it is asynchronous callback: window.__karma__.start });執(zhí)行測試
運(yùn)行如下命令,執(zhí)行測試:
karma startkarma 分析
在執(zhí)行測試的時候,點(diǎn)擊 debug 按鈕,進(jìn)入 debug 頁面,然后打開瀏覽器開發(fā)者工具,可以看到在 HTML 中有一段 js 代碼:
// Configure our Karma window.__karma__.config = {"args":[],"useIframe":true,"captureConsole":true,"clearContext":true}; // All served files with the latest timestamps window.__karma__.files = { "/base/node_modules/requirejs/require.js": "2c8b45573db27c131094a113e995236d20f043bb", "/base/node_modules/karma-requirejs/lib/adapter.js": "2621a4400d4a8a49588243fce2d8609ef950b46a", "/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js": "391e45351df9ee35392d2e5cb623221a969fc009", "/base/node_modules/karma-jasmine/lib/boot.js": "945a38bf4e45ad2770eb94868231905a04a0bd3e", "/base/node_modules/karma-jasmine/lib/adapter.js": "7975a273517f1eb29d7bd018790fd4c7b9a485d5", "/base/test/main.js": "fc5206f4dff3b583db818cb10ed7c5cade572896", "/base/src/State.js": "db89a58b4570983b8f8febfd4dedbc586c353670", "/base/test/StateSpec.js": "faf31b373690a6d7a7035fdfdc9c85d906ace5c1" };
可以看到 window.__karma__.files 中列出了所有的可能會在瀏覽器中執(zhí)行的 js ,如果通過 Require.js 加載這里沒有列舉出來的 js ,就會報錯。
然后再看下面的一堆 script 標(biāo)簽,大致是這樣的:
可以看到,直接引入了 require.js 、 karma 相關(guān)的一堆 js 、jasmine 相關(guān)的 js ,還直接引入了剛才配置的 test/main.js (Require.js 入口文件)。注意,此處并沒有直接引入 included: false 的 js 。
URL 路徑中的 base如果仔細(xì)看各種資源請求的 URL 地址,會發(fā)現(xiàn)除了 debug.js 和 context.js 之外,其它 js 文件都會以 /base 開頭,在配置 Require.js 的時候,務(wù)必注意這一點(diǎn)。
coverage可以引入 karma 的 coverage 插件來查看測試覆蓋率,該插件會在目標(biāo)代碼中插入很多額外的代碼,用于判斷測試代碼執(zhí)行流程有沒有走到這些地方。在 debug 的時候,最好關(guān)掉 coverage 功能,不然這些額外的代碼非常影響調(diào)試。
另外 karma-coverage-es6 聲稱支持 ES6 ,但是似乎并不行?
jasmine 的 HTML reporter默認(rèn)情況下,瀏覽器中 debug 頁面是不會輸出任何 jamine 測試結(jié)果的,可以借助 karma-jasmine-html-reporter 解決這個問題。
但是,karma-jasmine-html-reporter 有坑,在該插件的 index.js 中,有這樣一段代碼:
var createPattern = function(path) { return {pattern: path, included: true, served: true, watched: false}; }; var initReporter = function(files, baseReporterDecorator) { baseReporterDecorator(this); files.unshift(createPattern(__dirname + "/lib/adapter.js")); files.unshift(createPattern(__dirname + "/lib/html.jasmine.reporter.js")); files.unshift(createPattern(__dirname + "/css/jasmine.css")); }; initReporter.$inject = ["config.files", "baseReporterDecorator"]; module.exports = { "reporter:kjhtml": ["type", initReporter] };
files 指的就是 karma.conf.js 中配置的 files ,此處使用 unshift 方法將這堆 js 、 css 放在了 files 最前面,這樣就會導(dǎo)致 html.jasmine.reporter.js 先于 jasmine.js 加載,從而報錯(html.jasmine.reporter.js 是要依賴 jasmine.js 的),所以這里最好根據(jù)項目的實(shí)際情況,合理調(diào)整一下順序。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/79842.html
摘要:但是,項目中的一些公共封裝,比如公共的組件公用的功能模塊等是可以使用單元測試的。因此特為組件庫引入單元測試,目的在于能減少組件的,避免重復(fù)的發(fā)布不必要的包。 項目github地址:https://github.com/yuanalina/installAsRequired這里必須要提前說明,前端項目的單元測試不是必須的,特別是業(yè)務(wù)型項目,增加單元測試反而會成為累贅,增加開發(fā)成本且無意義...
摘要:可以監(jiān)控文件變化自動執(zhí)行單元測試,可以緩存測試結(jié)果,可以顯示測試過程中的變量測試框架。執(zhí)行單元測試三測試在的理念中,組件應(yīng)該分為視覺組件和高階組件,與邏輯分離,更利于測試。 一、工具介紹 karma:測試過程管理工具。可以監(jiān)控文件變化自動執(zhí)行單元測試,可以緩存測試結(jié)果,可以console.log顯示測試過程中的變量 mocha:測試框架。提供describe,it,beforeEac...
摘要:的官方下載地址點(diǎn)我進(jìn)入的官方下載地址下載電腦系統(tǒng)對應(yīng)文件,然后進(jìn)行安裝,安裝成功之后通過命令行工具進(jìn)入安裝目錄。注系統(tǒng)命令行工具通過開始菜單輸入打開,系統(tǒng)為終端。 showImg(https://segmentfault.com/img/bVPL6q?w=200&h=200); Vue — 漸進(jìn)式 JavaScript 框架 介紹 Vue.js 是什么 vue.js 是一套構(gòu)建用戶界面...
摘要:的官方下載地址點(diǎn)我進(jìn)入的官方下載地址下載電腦系統(tǒng)對應(yīng)文件,然后進(jìn)行安裝,安裝成功之后通過命令行工具進(jìn)入安裝目錄。注系統(tǒng)命令行工具通過開始菜單輸入打開,系統(tǒng)為終端。 showImg(https://segmentfault.com/img/bVPL6q?w=200&h=200); Vue — 漸進(jìn)式 JavaScript 框架 介紹 Vue.js 是什么 vue.js 是一套構(gòu)建用戶界面...
摘要:的官方下載地址點(diǎn)我進(jìn)入的官方下載地址下載電腦系統(tǒng)對應(yīng)文件,然后進(jìn)行安裝,安裝成功之后通過命令行工具進(jìn)入安裝目錄。注系統(tǒng)命令行工具通過開始菜單輸入打開,系統(tǒng)為終端。 showImg(https://segmentfault.com/img/bVPL6q?w=200&h=200); Vue — 漸進(jìn)式 JavaScript 框架 介紹 Vue.js 是什么 vue.js 是一套構(gòu)建用戶界面...
閱讀 3027·2023-04-25 18:06
閱讀 3272·2021-11-22 09:34
閱讀 2857·2021-08-12 13:30
閱讀 2045·2019-08-30 15:44
閱讀 1661·2019-08-30 13:09
閱讀 1630·2019-08-30 12:45
閱讀 1715·2019-08-29 11:13
閱讀 3608·2019-08-28 17:51