摘要:懶惰,是促使人類科技發(fā)展的重要因素。就筆者了解,目前前端領(lǐng)域比較流行的單元測試框架有等等。。什么你想打開控制臺粘帖代碼執(zhí)行為了拯救你于無盡的加班測試中,是時候推薦你接入使用了。
懶惰,是促使人類科技發(fā)展的重要因素。我們告別刀耕火種的時代,正是因為人們不斷地通過發(fā)明工具和優(yōu)化精簡手動的流程來實現(xiàn)效率的提升,讓人們能專注于自己專業(yè)的領(lǐng)域,其他的事情交給機械去處理。而同樣在前端的領(lǐng)域,我們也是從蠻荒的時代走向如今的繁榮發(fā)達,各類框架百花齊放,前端也不再是局限于靜態(tài)頁面,形態(tài)更加接近于傳統(tǒng)應用的開發(fā),功能的復雜度呈指數(shù)級的提升。有可能一個庫要同時滿足多個項目使用,版本的迭代也會導致功能的變化,如果每次到這個時候,就要讓我重新測試一遍代碼,那我還能不能準時下班了……
所以我們需要在開發(fā)之前,就確定這個框架/庫的使用規(guī)則,通過這個規(guī)則去寫我們的測試用例,這樣我們開發(fā)完之后,跑一遍測試用例,讓機器取代我們?nèi)斯な謩拥厝y試代碼,就可以知道我們的框架在各種環(huán)境和使用情況下會否報錯,而不再需要逐一項目去驗證。
當然并不是只有我有這種想法,大神們早就想到了,于是測試框架應運而生。
就筆者了解,目前前端領(lǐng)域比較流行的單元測試框架有 mocha、 Jasmine 等等。。
事不宜遲,我們看看如何上手測試,這里我們以mocha舉例子。
首先要在項目中安裝mocha
npm install mocha --save-dev
在項目的根目錄創(chuàng)建 test 文件夾 并創(chuàng)建文件 index.js。現(xiàn)在要測試 Array.prototype.indexOf
var assert = require("assert") describe("Array", function() { describe("#indexOf()", function() { it("should return -1 when the value is not present", function() { assert.equal(-1, [1, 2, 3].indexOf(4)) }) }) })
在命令行中執(zhí)行
mocha
如果看到這樣的結(jié)果,恭喜你,你的代碼已經(jīng)通過了測試(滑稽)
Array #indexOf() ? should return -1 when the value is not present 1 passing (13ms)
以上是一個簡單例子,可能有很多同學還是會一臉懵逼,說好的講測試框架,你給引入一個assert的是什么鬼?
這我就要解釋一下了,這個是nodejs中內(nèi)置的斷言模塊。
何謂斷言?
在程序設計中,斷言(assertion)是一種放在程序中的一階邏輯(如一個結(jié)果為真或是假的邏輯判斷式),目的是為了標示與驗證程序開發(fā)者預期的結(jié)果-當程序運行到斷言的位置時,對應的斷言應該為真。若斷言不為真時,程序會中止運行,并給出錯誤消息。 -- 摘自維基百科
測試框架的職責,只是幫你對項目中各種各樣的測試來進行一個規(guī)劃,方便對測試來進行拆分整理,并在測試中添加一些描述來方便人眼判別,實際上,輸入?yún)?shù)到函數(shù)中執(zhí)行,最終輸出什么結(jié)果才能通過測試,是需要我們?nèi)ァ案嬖V”測試框架的。而斷言,正好滿足我們這種行為的語義,也是最自然的。
一般來說使用默認的斷言模塊已經(jīng)足以應對多種情況,當然如果你對這種語法使用表示很不爽的時候,也可以在測試框架中選擇使用其他斷言庫, 比如 should.js , chai 這里就不再過多地贅述。
如何測試異步代碼
你可以在回調(diào)中執(zhí)行done
var assert = require("assert") describe("Array", function() { describe("#indexOf()", function() { it("should return -1 when the value is not present", function(done) { setTimeout(function() { var value = 1; if (value) done(assert.equal(-1, [1, 2, 3].indexOf(4))) else done() }, 30) }) }) })
promise
it("should xxx", function(done) { return new Promise(function(resolve, reject){}).then(done) })
支持 async await
it("should return -1 when the value is not present", async function(done) { let a = await func(); if (a) done() else done(new Error("xxx")) })
需要注意的是,在使用mocha api的時候并不提倡 箭頭函數(shù)的寫法,因為這樣你會拿不到當前執(zhí)行的context, 當前context下內(nèi)置了比如 timeOut 等等的一些api,詳情請翻閱文檔,這里就不做過多展開了。
測試環(huán)境
是時候在瀏覽器跑一下了!
沒錯,截止到現(xiàn)在,我們一直都是在nodejs的環(huán)境下執(zhí)行代碼,至于瀏覽器的執(zhí)行環(huán)境有多少差異,大家不言自明,簡簡單單在node上面跑一下測試時不具有普適性,不可靠的,我們需要在瀏覽器環(huán)境都跑一遍。
什么?你想打開控制臺粘帖代碼執(zhí)行?為了拯救你于無盡的加班測試中,是時候推薦你接入使用karma了。
karma 是一套測試執(zhí)行管理工具,可以配置需要測試的瀏覽器環(huán)境,以及測試前的一系列準備工作等,需要時還可以接入測試覆蓋率的報告生成。
為了降低同學們配置karma的門檻,這里我換用了斷言庫should.js
npm install should --save-dev
斷言寫法替換如下
// assert.equal([1,2,3].indexOf(4), -1) [1,2,3].indexOf(4).should.equal(-1)
首先我們需要安裝karma
npm install karma-cli -g npm install karma --save-dev
進到項目中初始化karma
karma init
接下來你會收到一連串的詢問
Which testing framework do you want to use ? Press tab to list possible options. Enter to move to the next question. > mocha Do you want to use Require.js ? This will add Require.js plugin. Press tab to list possible options. Enter to move to the next question. > no Do you want to capture any browsers automatically ? Press tab to list possible options. Enter empty string to move to the next question. > Chrome > What is the location of your source and test files ? You can use glob patterns, eg. "js/*.js" or "test/**/*Spec.js". Enter empty string to move to the next question. > node_modules/should/should.js > test/*.js Should any of the files included by the previous patterns be excluded ? You can use glob patterns, eg. "**/*.swp". Enter empty string to move to the next question. > Do you want Karma to watch all the files and run the tests on change ? Press tab to list possible options. > yes
配置完成后,項目的根目錄會出現(xiàn)一個 karma.conf.js 文件,我很想展開,但是如果繼續(xù)講下去估計講到天亮,所以想深入了解每個配置項的作用可以翻閱karma文檔
// Karma configuration // Generated on Fri Aug 04 2017 20:53:38 GMT+0800 (CST) module.exports = function(config) { let configuration = { // base path that will be used to resolve all patterns (eg. files, exclude) basePath: "", // frameworks to use // available frameworks: https://npmjs.org/browse/keyword/karma-adapter frameworks: ["mocha"], // list of files / patterns to load in the browser files: [ "node_modules/should/should.js", "js/*.js", "quz/*.js", "test/*.js" ], // list of files to exclude exclude: [ ], // preprocess matching files before serving them to the browser // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor preprocessors: { "quz/*.js": "coverage", "js/*.js": "coverage" }, // test results reporter to use // possible values: "dots", "progress" // available reporters: https://npmjs.org/browse/keyword/karma-reporter reporters: ["progress", "coverage", "coveralls"], coverageReporter: { type : "lcov", dir : "coverage/" }, // web server port port: 9876, plugins: [ "karma-mocha", "karma-chrome-launcher", "karma-firefox-launcher", "karma-coverage", "karma-coveralls" ], // enable / disable colors in the output (reporters and logs) colors: true, // level of logging // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG logLevel: config.LOG_INFO, // enable / disable watching file and executing tests whenever any file changes autoWatch: true, // start these browsers // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher browsers: ["ChromeHeadless", "FirefoxHeadless"], customLaunchers: { Chrome_travis_ci: { base: "ChromeHeadless", flags: ["--no-sandbox"] }, FirefoxHeadless: { base: "Firefox", flags: ["-headless"] } }, // Continuous Integration mode // if true, Karma captures browsers, runs the tests and exits singleRun: process.env.TRAVIS, // Concurrency level // how many browser should be started simultaneous concurrency: Infinity } if (process.env.TRAVIS) { configuration.browsers = ["Chrome_travis_ci", "FirefoxHeadless"]; } config.set(configuration) }
接下來我們跑一發(fā)
karma start
你的黑窗口會有這樣的日志
02 02 2018 18:10:26.181:WARN [karma]: No captured browser, open http://localhost:9876/ 02 02 2018 18:10:26.193:INFO [karma]: Karma v2.0.0 server started at http://0.0.0.0:9876/ 02 02 2018 18:10:26.194:INFO [launcher]: Launching browser Chrome with unlimited concurrency 02 02 2018 18:10:26.199:INFO [launcher]: Starting browser Chrome 02 02 2018 18:10:27.346:INFO [Chrome 63.0.3239 (Mac OS X 10.13.2)]: Connected on socket lv0dmScnbh5jC2NgAAAA withid 45333497 Chrome 63.0.3239 (Mac OS X 10.13.2): Executed 1 of 1 SUCCESS (0.003 secs / 0.001 secs)
這時候你的電腦會自動開啟瀏覽器,并且常駐在桌面,karma一旦觀測到你的代碼發(fā)生變動,就會重新跑一次測試用例,從此告別繁復的測試環(huán)節(jié),專心寫代碼。perfect!
完了么?并沒有!你還可以更懶,把當前測試流程接入CI,成為部署環(huán)境前的一個環(huán)節(jié),當然這已經(jīng)超出了本文應該討論的范圍。
長路漫漫,本文僅限于大家作為了解測試的開篇,實際上隱藏了很多的細節(jié),真正的環(huán)境,其實碰到的問題比這個要復雜得多,但是如果懂得了測試的原理,相信聰明的你碰到再難的問題也能想到解決的辦法。
學海無涯,共勉之。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/8805.html
摘要:懶惰,是促使人類科技發(fā)展的重要因素。就筆者了解,目前前端領(lǐng)域比較流行的單元測試框架有等等。。什么你想打開控制臺粘帖代碼執(zhí)行為了拯救你于無盡的加班測試中,是時候推薦你接入使用了。 懶惰,是促使人類科技發(fā)展的重要因素。我們告別刀耕火種的時代,正是因為人們不斷地通過發(fā)明工具和優(yōu)化精簡手動的流程來實現(xiàn)效率的提升,讓人們能專注于自己專業(yè)的領(lǐng)域,其他的事情交給機械去處理。而同樣在前端的領(lǐng)域,我們也...
摘要:根據(jù)國際數(shù)據(jù)公司全球半年度服務追蹤器數(shù)據(jù),年下半年全球服務和商業(yè)服務的收入總計為,億美元,同比增長按固定匯率計算。年全年,全球服務收入距離萬億美元大關(guān)只有一線之差預計年收入將超過此門檻。預測該地區(qū)未來幾年年增長率將低于。根據(jù)國際數(shù)據(jù)公司(IDC)全球半年度服務追蹤器數(shù)據(jù),2017年下半年全球IT服務和商業(yè)服務的收入總計為5,020億美元,同比增長3.6%(按固定匯率計算)。2017年全年,全...
摘要:純前端開發(fā)主要是針對靜態(tài)頁面。自主權(quán)最大,正常是使用進行輔助開發(fā),上線等。大致原因使用是為了和端的保持同步。四總結(jié)對于比較正式的項目,前端技術(shù)選型策略一定是產(chǎn)品收益最大化,用戶在首位。 對于前端團隊,可以實現(xiàn)企業(yè)受益最大化要點。 一、技術(shù)選型的策略 1、保證產(chǎn)品質(zhì)量 (1)功能穩(wěn)健:網(wǎng)頁不白屏,不錯位,不卡死;操作正常;數(shù)據(jù)精準。 (2)體驗優(yōu)秀:加載體驗,交互體驗,視覺體驗,無障礙訪...
摘要:多行省略就是大段文字后面的花式點點點。但它固定使用省略號,無法直接擴展。年月日,騰訊控股有限公司在香港聯(lián)交所主板公開上市股票代號。 轉(zhuǎn)載請注明出處:http://hai.li/2017/03/08/css-... 什么是多行省略? showImg(https://segmentfault.com/img/bVKr2N?w=660&h=325); 當字數(shù)多到一定程度就顯示省略號點點點。最...
摘要:多行省略就是大段文字后面的花式點點點。但它固定使用省略號,無法直接擴展。年月日,騰訊控股有限公司在香港聯(lián)交所主板公開上市股票代號。 轉(zhuǎn)載請注明出處:http://hai.li/2017/03/08/css-... 什么是多行省略? showImg(https://segmentfault.com/img/bVKr2N?w=660&h=325); 當字數(shù)多到一定程度就顯示省略號點點點。最...
閱讀 1768·2023-04-26 01:44
閱讀 1211·2021-11-12 10:34
閱讀 1578·2021-09-09 09:33
閱讀 1729·2019-08-30 15:44
閱讀 2892·2019-08-30 13:49
閱讀 2190·2019-08-29 15:26
閱讀 943·2019-08-26 13:30
閱讀 1409·2019-08-23 18:15