前端動手開始試著寫單元測試

單元測試分為 TDD(測試驅(qū)動開發(fā))和 BDD(行為驅(qū)動開發(fā))兩種類型
兩者的區(qū)別是驅(qū)動者、主導(dǎo)者不同

斷言庫

node是內(nèi)置斷言模塊assert的,也有一些其他的斷言庫瞬沦,如should.js expect.js

下面是assert圆到, should.js, expect.js的一些寫法

let a = 10, obj = {a: '1'}
// assert
assert.equal(a, 10, 'a != 10啊老鐵')

// should.js
a.should.equal(10, 'a != 10啊老鐵')
should(a).equal(10, 'a != 10啊老鐵')
obj.should.have.key('a').be.a.Number()

// expect.js
expect(a).to.equal(10, 'a != 10啊老鐵')
expect(obj).to.have.property('a').to.be.a('number')

斷言庫各有優(yōu)缺點,可根據(jù)實際情況揍拆,選擇使用哪種斷言

測試框架

Mocha

Mocha是一個能夠運(yùn)行在Node和瀏覽器中的多功能的js測試框架

首先在我們測試的項目中安裝Mocha
npm i mocha -D

然后在我們的項目中新建一個test文件夾,Mocha會自動檢索這個目錄下的測試文件并運(yùn)行茶凳。

test/hello-test.js

const should = require('should')
let a = 10
describe('it is test', function() {
  it('a should equal 10', () => {
    should(a).equal(10, 'a != 10啊老鐵')
  });
  it('a should equal 11', () => {
    should(a).equal(11, 'a != 11啊老鐵')
  });
})

在控制臺中輸入mocha嫂拴,即可看到運(yùn)行結(jié)果

it is test
  ? a should equal 10
  1) a should equal 11


1 passing (11ms)
1 failing

1) it is test a should equal 11:

    AssertionError: a != 11啊老鐵
    + expected - actual

    -10
    +11

describe用來描述你要測的主體是什么,可以多層嵌套
it 描述具體的一條測試用例的內(nèi)容

Karma

Karma是個將我們的測試用例跑在瀏覽器上的框架

karma的使用

首先安裝karma
npm i -g karma-cli
npm i --save-dev karma

然后在測試項目里輸入karma init來初始化karma項目

$ karma init
Which testing framework do you want to use ?
Press tab to list possible options. Enter to move to the next question.
> jasmine
// 是選擇你所用的測試框架 這里我們選擇mocha(按tab健切換至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
// 是否在測試項目里使用require.js播揪, 這里我們選擇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
// 默認(rèn)打開的瀏覽器,選擇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.
// 哪些是需要引入的文件筒狠,這里除了本地文件猪狈,也可以引入cdn文件,和聽過npm安裝在依賴包里的文件辩恼,比如https://cdn.bootcss.com/jquery/2.2.4/jquery.js   node_modules/should/should.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.
>
// 加載的目標(biāo)文件不需要測試的文件
Do you want Karma to watch all the files and run the tests on change ?
Press tab to list possible options.
> yes
// 是否watch所有的文件
Config file generated at "/mocha_lean/karma.conf.js".
// 會生成karma.conf.js在測試的項目里雇庙,剛才所有的選項都可以在這里就行修改

在命令行中輸入 karma start就會起一個端口默認(rèn)為9876的服務(wù),并且自動打開chrome运挫,命令行中也出現(xiàn)了測試結(jié)果

09 11 2018 20:03:53.283:WARN [karma]: No captured browser, open http://localhost:9876/
09 11 2018 20:03:53.312:INFO [karma-server]: Karma v3.1.1 server started at http://0.0.0.0:9876/
09 11 2018 20:03:53.312:INFO [launcher]: Launching browsers Chrome with concurrency unlimited
09 11 2018 20:03:53.320:INFO [launcher]: Starting browser Chrome
09 11 2018 20:03:56.367:INFO [Chrome 70.0.3538 (Mac OS X 10.14.0)]: Connected on socket gUMQo5IzqR60ZdIVAAAA with id 35123873

如何在瀏覽器中查看當(dāng)前運(yùn)行的測試結(jié)果呢状共?

http://localhost:9876頁面的右上角有一個debug按鈕,點開后谁帕,在打開的頁面中打開控制臺峡继,測試結(jié)果會輸出在控制臺中

karma.conf.js的內(nèi)容
// Karma configuration
// Generated on Fri Nov 09 2018 19:57:45 GMT+0800 (CST)

module.exports = function(config) {
  config.set({

    // base path that will be used to resolve all patterns (eg. files, exclude)
    basePath: '', //基礎(chǔ)路徑


    // frameworks to use
    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
    frameworks: ['mocha'],//測試框架


    // list of files / patterns to load in the browser
    files: [ //引入的文件,這里的文件會被karma以標(biāo)簽移入到html中,所以需要注意文件的順序
      'test/hello-test.js',
      'https://cdn.bootcss.com/jquery/2.2.4/jquery.js'
    ],


    // list of files / patterns to exclude
    exclude: [
    ],


    // preprocess matching files before serving them to the browser
    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
    preprocessors: {
    },


    // test results reporter to use
    // possible values: 'dots', 'progress'
    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
    reporters: ['progress'],


    // web server port
    port: 9876, //端口號


    // 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: ['Chrome'],


    // Continuous Integration mode
    // if true, Karma captures browsers, runs the tests and exits
    singleRun: false, // 持續(xù)集成模式 如果該值為true匈挖,karma將會啟動和捕獲配置的瀏覽器碾牌,運(yùn)行測試然后退出 這里需要注意的是如果配置了travis-ci的話,需要設(shè)置為true儡循,不然travis-ci會一直跑下去舶吗,沒法自動結(jié)束

    // Concurrency level
    // how many browser should be started simultaneous
    concurrency: Infinity
  })
}

框架適配器(framework adapters)比如:Karma-mocha, Karma-chai ,reporters 比如 Karma-spec-reporter (后面我們還會介紹 Karma-coverage)择膝,以及預(yù)處理器誓琼,比如 Karma-webpack, Karma-sourcemap-loader,還有加載器(launchers)肴捉,比如 Karma-chrome-launcher腹侣,都是作為 Karma 插件工作的。

針對這些 Karma 插件 我們都要安裝對應(yīng)的 npm 包齿穗,這些插件一般是以 karma- 開頭傲隶,而 Karma 默認(rèn)會自動加載 karma- 開頭的 npm 包。因此我們沒有在配置文件中明確指定 plugins 配置項(實際上它的默認(rèn)配置項為 karma-*)窃页,但是一定要記得安裝相應(yīng)的 npm 包跺株,特別是框架適配器和加載器,框架指定 Mocha 就要安裝 Karma-mocha脖卖,瀏覽器指定 Chrome 乒省,就要安裝 Karma-chrome-launcher。

更多karma.conf.js的配置

Travis CI

Travis CI 提供的是持續(xù)集成服務(wù) 它綁定 Github 上面的項目畦木,只要有新的代碼袖扛,就會自動抓取。然后馋劈,提供一個運(yùn)行環(huán)境攻锰,執(zhí)行測試,完成構(gòu)建妓雾,還能部署到服務(wù)器娶吞。

首先我們需要進(jìn)入Travis CI官網(wǎng)
用我們的github賬號登錄,并將我們github上的一個項目關(guān)聯(lián)到travis-ci上械姻,并加以配置

之后在我們的項目的根目錄下新建一個.travis.yml文件妒蛇,這是配置文件,指定了 Travis 的行為楷拳。之后我們每次向github提交代碼時都會在travis-ci中跑一遍我們的測試腳本

Travis 提供了7個鉤子绣夺。

before_install:install 階段之前執(zhí)行
before_script:script 階段之前執(zhí)行
after_failure:script 階段失敗時執(zhí)行
after_success:script 階段成功時執(zhí)行
before_deploy:deploy 步驟之前執(zhí)行
after_deploy:deploy 步驟之后執(zhí)行
after_script:script 階段之后執(zhí)行

.travis.yml文件

language: node_js // 指定運(yùn)行的語言
script: npm run test // 所需要跑的script命令, 如果不需要運(yùn)行欢揖,可設(shè)置為true
# 緩存 node_modules 文件夾陶耍,不需要每次都下載安裝全部 npm 包。
cache:
  directories:
    - node_modules
# 指定 node 版本
node_js:
  - "11"
os: osx // 指定跑的測試腳本的環(huán)境
before_install: //在運(yùn)行之前所需要運(yùn)行的腳本她混,這里是安裝karma-cli
- npm install karma-cli -g
// 可能會報沒有chrome的錯烈钞,需要加這兩條命令
sudo: required 
addons:
  chrome: stable
// 如果travis-ci測試腳本一直跑,無法終結(jié)坤按,可以通過配置karma的singleRun為true即可解決

配置好后把項目代碼提交至github上毯欣,就可以去Travis CI官網(wǎng)查看是否運(yùn)行通過了。
Travis-CI 還可以做很多事情臭脓,想要了解更多有關(guān) Travis-CI 的使用方式酗钞,可以自行去 Travis-CI 官網(wǎng) 查看文檔。我們只是使用了它的自動化測試的功能

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末来累,一起剝皮案震驚了整個濱河市砚作,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌佃扼,老刑警劉巖偎巢,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異兼耀,居然都是意外死亡压昼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門瘤运,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窍霞,“玉大人,你說我怎么就攤上這事拯坟〉穑” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵郁季,是天一觀的道長冷溃。 經(jīng)常有香客問我钱磅,道長,這世上最難降的妖魔是什么似枕? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任盖淡,我火速辦了婚禮,結(jié)果婚禮上凿歼,老公的妹妹穿的比我還像新娘褪迟。我一直安慰自己,他們只是感情好答憔,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布味赃。 她就那樣靜靜地躺著,像睡著了一般虐拓。 火紅的嫁衣襯著肌膚如雪心俗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天侯嘀,我揣著相機(jī)與錄音另凌,去河邊找鬼。 笑死戒幔,一個胖子當(dāng)著我的面吹牛吠谢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诗茎,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼工坊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了敢订?” 一聲冷哼從身側(cè)響起王污,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎楚午,沒想到半個月后昭齐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡矾柜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年阱驾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怪蔑。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡里覆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缆瓣,到底是詐尸還是另有隱情喧枷,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站隧甚,受9級特大地震影響车荔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜戚扳,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一夸赫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咖城,春花似錦、人聲如沸呼奢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽握础。三九已至,卻和暖如春禀综,著一層夾襖步出監(jiān)牢的瞬間孤澎,已是汗流浹背覆旭。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腕铸。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像亚茬,于是被迫代替她去往敵國和親碗暗。 傳聞我的和親對象是個殘疾皇子言疗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容