觀察程序員把時間耗在哪里慈省,其實編碼只占據(jù)很小的一部分瓮恭,最多的時間則花在了調(diào)試上,有時甚至為了找出一個小問題不惜花費好幾個小時來調(diào)試定位。如果在編碼開始就為每一個功能編寫相應測試嫌蚤,雖然每次需要花費額外的時間精力來編寫測試市袖,但一旦測試代碼運行正常咙鞍,工作就可以結束了苞冯,不需要再額外花費時間到調(diào)試代碼上。因此肯尺,引入單元測試是有必要的?(實際開發(fā)中我其實沒見過誰寫過測試:joy:)
單元測試是什么沃缘?
在計算機編程中,單元測試(英語:Unit Testing)又稱為模塊測試, 是針對程序模塊(軟件設計的最小單位)來進行正確性檢驗的測試工作蟆盹。 程序單元是應用的最小可測試部件孩灯。
Node.js 單元測試框架
比較受歡迎的單元測試框架有Jasmine,Mocha逾滥,Jest峰档,AVA败匹,Tape。Jasmine開箱即用讥巡,無需斷言庫掀亩;Mocha應該是使用人數(shù)最多的框架,需要導入其他庫來實現(xiàn)斷言功能欢顷;Jest廣泛應用于測試React應用槽棍;AVA利用JS異步特性和并發(fā)運行測試,性能有所提高抬驴;Tape比較小炼七,搭建運行比較簡潔,無需過多的配置布持,支持TypeScript/CoffeeScript/ES6豌拙。本文主要介紹下Mocha。
斷言庫
由于Mocha本身沒有斷言功能题暖,需要選擇一款斷言庫搭配使用按傅。與Mocha搭配的斷言庫主要有5種(should.js/chai/expect.js/better-assert/unexpected),本文使用的是TJ大神的should.js胧卤,該斷言庫更加類似于自然語言的寫法唯绍。
Mocha測試腳本基本結構
- describe 測試套件(test suite)一組相關的測試
-
it 測試用例(test case)測試的最小單元
測試腳本應包括一個或多個describe,每個describe塊應包括一個或多個it塊
Mocha用法
命令行執(zhí)行測試腳本:
$ mocha 'filename.{test|spec}.js'
指定測試腳本時枝誊,可以使用通配符况芒,同時指定多個文件(支持node與shell通配符)
瀏覽器執(zhí)行測試腳本:
執(zhí)行$ mocha init
生成index.html及配套css、js叶撒,添加mocha.setup
配置并引入should.js及測試腳本牛柒,末尾添加mocha.run()
,瀏覽器打開index.html就可以看到測試腳本的執(zhí)行結果
Mocha命令行參數(shù)
Usage: mocha [debug] [options] [files]
Options:
-V, --version output the version number
-A, --async-only force all tests to take a callback (async) or return a promise
-c, --colors force enabling of colors
-C, --no-colors force disabling of colors
-G, --growl enable growl notification support
-O, --reporter-options <k=v,k2=v2,...> reporter-specific options
-R, --reporter <name> specify the reporter to use (default: spec)
-S, --sort sort test files
-b, --bail bail after first test failure
-d, --debug enable node's debugger, synonym for node --debug
-g, --grep <pattern> only run tests matching <pattern>
-f, --fgrep <string> only run tests containing <string>
-gc, --expose-gc expose gc extension
-i, --invert inverts --grep and --fgrep matches
-r, --require <name> require the given module
-s, --slow <ms> "slow" test threshold in milliseconds [75]
-t, --timeout <ms> set test-case timeout in milliseconds [2000]
-u, --ui <name> specify user-interface (bdd|tdd|qunit|exports) (default: bdd)
-w, --watch watch files for changes
--check-leaks check for global variable leaks
--full-trace display the full stack trace
--compilers <ext>:<module>,... use the given module(s) to compile files (default: )
--debug-brk enable node's debugger breaking on the first line
--globals <names> allow the given comma-delimited global [names] (default: )
--es_staging enable all staged features
--harmony<_classes,_generators,...> all node --harmony* flags are available
--preserve-symlinks Instructs the module loader to preserve symbolic links when resolving and caching modules
--icu-data-dir include ICU data
--inline-diffs display actual/expected differences inline within each string
--no-diff do not show a diff on failure
--inspect activate devtools in chrome
--inspect-brk activate devtools in chrome and break on the first line
--interfaces display available interfaces
--no-deprecation silence deprecation warnings
--exit force shutdown of the event loop after test run: mocha will call process.exit
--no-timeouts disables timeouts, given implicitly with --debug
--no-warnings silence all node process warnings
--opts <path> specify opts path (default: test/mocha.opts)
--perf-basic-prof enable perf linux profiler (basic support)
--napi-modules enable experimental NAPI modules
--prof log statistical profiling information
--log-timer-events Time events including external callbacks
--recursive include sub directories
--reporters display available reporters
--retries <times> set numbers of time to retry a failed test case
--throw-deprecation throw an exception anytime a deprecated function is used
--trace trace function calls
--trace-deprecation show stack traces on deprecations
--trace-warnings show stack traces on node process warnings
--use_strict enforce strict mode
--watch-extensions <ext>,... specify extensions to monitor with --watch (default: js)
--delay wait for async suite definition
--allow-uncaught enable uncaught errors to propagate
--forbid-only causes test marked with only to fail the suite
--forbid-pending causes pending tests and test marked with skip to fail the suite
--file <file> include a file to be ran during the suite (default: )
--exclude <file> a file or glob pattern to ignore (default: )
-h, --help output usage information
Commands:
init <path> initialize a client-side mocha setup at <path>
Mocha異步測試
callback方式
it塊執(zhí)行時需要傳入done參數(shù),當測試結束時椭更,必須顯式調(diào)用這個done函數(shù)哪审,告訴Mocha測試結束了,否則虑瀑,Mocha會一直等到超時報錯湿滓。
Promise
Mocha內(nèi)置對Promise的支持,允許直接返回Promise舌狗,等到它的狀態(tài)改變叽奥,再執(zhí)行斷言,而不用顯式調(diào)用done函數(shù)
Mocha提供的鉤子及測試腳本管理
鉤子:
- before 在該test suite內(nèi)所有test case之前運行
- after 在該test suite內(nèi)所有test case之后運行
- beforeEach 在該test suite內(nèi)每個test case之后運行
- afterEach 在該test suite內(nèi)每個test case之后運行
腳本管理:
- describe.only/it.only 只運行帶only的test suite/test case
- describe.skip/it.skip 跳過帶skip的test suite/test case
參考:
Mocha 文檔
阮一峰Mocha教程