本文是最近在學習 Node.js 測試方面的總結,包括單元測試、整合測試、基準測試以及程式碼涵蓋範圍測試等多方面的的內容。對於中大型項目,完備的測試案例有助於保證項目的持續整合能力和代碼的健壯性。Unit Test 單元測試,又稱模組測試,針對程式中的最小執行單元進行正確性測試。常見的開發模式包括 TDD 和 BDD 兩類。 TDD(Test-driven development,測試驅動開發),先編寫測試案例,然後針對測試案例開發模組,當測試案例不足時,補充測試案例;當模組無法通過測試時,持續更新模組代碼,直到完全通過測試案例。其開發核心圍繞測試案例展開,即測試案例的完整性決定了開發模組的健壯性和正確性,這容易由邊界條件引發單元測試覆蓋度不夠的問題。 BDD(Behavior-driven development,行為驅動開發),用語義化的程式設計語言開發緊貼業務需求的測試案例,繼而驅動相關模組的開發。 AVA 是 JavaScript 生態中最新潮的測試架構,其內建了 Babel,可以直接使用 ES6 文法,具有輕量高效、並發執行、強制隔離等優點,安裝方法:
npm install --save-dev ava
|
設定 package.json 中的 scripts 欄位:
{ "scripts": { "test": "ava", "test:watch": "ava --watch" } }
|
運行:
npm test
# or npm test:watch
|
下面是一個基本的測試代碼:
import test from 'ava';
const fibonacci = (n) => { if (n === 0 || n === 1) { return n; } return fibonacci(n - 1) + fibonacci(n - 2); }
test('Test Fibonacci(0)', t => { t.is(fibonacci(0), 0); });
test('Test Fibonacci(1)', t => { t.is(fibonacci(1), 1); });
// HOOK CALLS test.before('Before', t => { console.log('before'); });
test.after('After', t => { console.log('after'); });
test.beforeEach('BeforeEach', t => { console.log(' beforeEach'); });
test.afterEach('AfterEach', t => { console.log(' afterEach'); });
|
在上面的代碼中,我們首先引入了 AVA 模組,然後建立了待測試的 fibonacci 函數,接下來是兩個測試案例,最後是四個鉤子方法:before() / after() / beforeEach() / afterEach()。 AVA 提供了一下修飾方法來指定測試的執行方式: 1、skip(),跳過添加了 skip() 的測試案例;2、only(),只執行添加了 only() 的測試案例;3、todo(),佔位標識符,表示將來需要添加的測試案例;4、serial(),串列執行測試案例,預設情況下 AVA 會以並行的方式執行測試案例。
test('Test Fibonacci(0)', t => { t.is(fibonacci(0), 0); });
|
在上面代碼回呼函數中的 t,稱為斷言執行對象,該對象包含以下方法: ·t.end(),結束測試,只在 test.cb() 中有效·t.plan(count),指定執行次數·t.pass([message]),測試通過·t.fail([message]),測試失敗·t.ok(value, [message]),斷言 value 的值為真值·t.notOK(value, [message]),斷言 value 的值為假值·t.true(value, [message]),斷言 value 的值為 true·t.false(value, [message]),斷言 value 的值為 false·t.is(value, expected, [message]),斷言 value === expected·t.not(value, expected, [message]),斷言 value !== expected·t.same(value, expected, [message]),斷言 value 和 expected 深度相等·t.notSame(value, expected, [message]),斷言 value 和 expected 深度不等·t.throws(function | promise, [error, [message]]),斷言 function 拋出異常或 promisereject 錯誤·t.notThrows(function | promise, [message]),斷言 function 不會異常或 promise resolve·t.regex(contents, regex, [message]),斷言 contents 匹配 regex·t.ifError(error, [message]),斷言 error 是假值 整合測試 相對於專註微觀模組的單元測試,整合測試是從宏觀整體的角度發現問題,所以也稱為組裝測試和聯合測試。Travis CI 是一款優秀的持續整合工具,可以監聽 Github 項目的更新,便於開源軟體的整合測試。使用 Travis CI 需要在項目的根目錄下建立 .travis.yml 設定檔(以 Node.js 為例):
language: node_js
node_js: - "6" - "5"
before_script:
script: - npm test - node benchmark/index.js
after_script:
|
預設情況下,Travis CI 會自動安裝依賴並執行 npm test 命令,通過 script 欄位可以自訂需要執行的命令,其完整的生命週期包括: ·Install apt addons·before_install·install·before_script·script·after_success or after_failure·OPTIONAL before_deploy·OPTIONAL deploy·OPTIONAL after_deploy·after_script 基準測試 基準測試使用嚴謹的測試方法、測試載入器或測試系統評定目標模組的效能,常用於觀測軟硬體環境發生變化後的效能表現,其結果具有可複現性。在 Node.js 環境中最常用的基準測試載入器是 Benchmark.js,安裝方式:
npm install --save-dev benchmark
|
基本樣本:
const Benchmark = require('benchmark'); const suite = new Benchmark.Suite;
suite.add('RegExp#test', function() { /o/.test('Hello World!'); }) .add('String#indexOf', function() { 'Hello World!'.indexOf('o') > -1; }) .on('cycle', function(event) { console.log(String(event.target)); }) .on('complete', function() { console.log('Fastest is ' + this.filter('fastest').map('name')); }) // run async .run({ 'async': true });
|
程式碼涵蓋範圍 程式碼涵蓋範圍工具根據測試案例覆蓋的程式碼數和分支數來判斷模組的完整性。AVA 推薦使用 nyc 測試程式碼涵蓋範圍,安裝 nyc:
npm install nyc --save-dev
|
修改 .gitignore 忽略相關檔案:
node_modules coverage .nyc_output
|
修改 package.json 中的 test 欄位:
{ "scripts": { "test": "nyc ava" } }
|
執行 npm test,得到:
➜ test-in-action (master) ✔ npm test
> test-in-action@1.0.0 test /Users/sean/Desktop/test-in-action > nyc ava
2 passed ----------|----------|----------|----------|----------|----------------| File | % Stmts | % Branch | % Funcs | % Lines |Uncovered Lines | ----------|----------|----------|----------|----------|----------------| ----------|----------|----------|----------|----------|----------------| All files | 100 | 100 | 100 | 100 | | ----------|----------|----------|----------|----------|----------------|
|
由於上傳附件及文字限制,有時部分圖片、文字可能顯示不了,詳情請見:http://mp.weixin.qq.com/s?__biz=MzI5ODI3NzY2MA==&mid=100000510&idx=2&sn=8339d4fca5f54ab3a9ec305eae756436#rd歡迎大家一起交流。掃描以下二維碼,擷取更多更精美文章!(掃碼關注有意向不到的驚喜的哦!!)訂閱號二維碼.jpg (39.39 KB, 下載次數: 0) 下載附件 2016-5-18 16:44 上傳 關注我們訂閱號( uniguytech100) 與服務號(uniguytech),擷取更多更精美文章!也歡迎加入【大家技術網討論QQ群】,群號碼:256175955,請備忘你個人的介紹!讓我們一起聊聊it的那些事!
|