使用mocha測試
概念
測試類型
- 單元測試: 以軟件的單元為單位,對軟件進(jìn)行測試
- 避免依賴性問題巩检,例如不存取數(shù)據(jù)庫趾撵、不訪問網(wǎng)絡(luò)赡译,而是使用工具虛擬出運(yùn)行環(huán)境
- 步驟
- 準(zhǔn)備所有的測試條件
- 調(diào)用(觸發(fā))所要測試的函數(shù)
- 驗(yàn)證運(yùn)行結(jié)果是否正確
- 還原被修改的記錄
- 集成測試: 多個(gè)部分在一起測試, 例如數(shù)據(jù)庫連接模塊測試
- 功能測試: 自動(dòng)測試整個(gè)程序的某個(gè)功能濒析,使用
Selenium
工具自動(dòng)打開瀏覽器測試 - 端對端測試: 全鏈路測試正什,從開始端到結(jié)束端的測試
- 確保整個(gè)系統(tǒng)能正常運(yùn)行,各個(gè)子系統(tǒng)依賴關(guān)系正常号杏,數(shù)據(jù)在子系統(tǒng)婴氮、模塊之間傳遞正常
- 冒煙測試: 正式的全面測試開始之前,對主要功能進(jìn)行的預(yù)測試
- 目的: 確認(rèn)主要功能十分滿足需要, 軟件是否能運(yùn)行
開發(fā)模式
- TDD(Test-Driven Development): 測試驅(qū)動(dòng)開發(fā)
- 步驟
- 寫一個(gè)測試
- 寫出最小代碼盾致,使其能通過測試
- 優(yōu)化代碼
- 重復(fù)前三步
- 提供4個(gè)方法
suite()
test()
setup()
teardown()
- 步驟
- BDD(Behavior-Driven Development): 行為驅(qū)動(dòng)開發(fā)
- 概念:針對行為寫測試, 不應(yīng)針對代碼實(shí)現(xiàn)細(xì)節(jié)
- 提供6個(gè)方法
describle()
it()
before()
after()
beforeEach()
afterEach()
命令
mocha
- 默認(rèn)會運(yùn)行
test
目錄下第一層的腳本 -
--recursive
會運(yùn)行當(dāng)前目錄以及子目錄的腳本
通配符
- shell通配符
mocha spec/{one,two}.js mocha test/unit/*.js mocha test/{,**/}*.{js,jsx}
- node通配符
mocha 'test/**/*.@(js|jsx)'
命令行
-
--help
,-h
: 查看所有命令參數(shù) -
--reporter
,-R
: 指定測試報(bào)告格式主经,官方詳細(xì)介紹-
spec
: 默認(rèn)格式 -
tap
: `` -
mochawesome
: 以HTML格式報(bào)告 - 生成不同格式的報(bào)告
- 生成markdown格式的報(bào)告
mocha --recursive -R markdown > spec.md
- 生成html格式的報(bào)告
mocha -recursive -R doc > spec.html
- 生成markdown格式的報(bào)告
-
-
--growl
,-G
: 測試結(jié)果在桌面顯示 -
--watch
,-w
: 監(jiān)視指定測試腳本,有變化會自動(dòng)運(yùn)行mocha
-
--bail
,-b
: 指定只要有一個(gè)測試沒有通過庭惜,就停止執(zhí)行后面的測試用例 -
--grep
,-g
: 用于搜索測試用例的名稱 -
--invert
,-i
: 只運(yùn)行不符合條件的測試腳本, 必須與--grep
配合使用mocha --grep "1 加 1" --invert
mocha.opts
- 命令行
mocha --recursive --reporter tap --growl
- 配置項(xiàng)
mocha.opts
文件--reporter tap --recursive --growl
- 指定測試目錄
mocha.opts
文件server-tests --recursive ```
語言轉(zhuǎn)換
- ES6
- 依賴包安裝
npm i babel-polyfill --save npm i @babel/core @babel/preset-env -D
-
.babelrc
配置{ "presets": [ ["@babel/env", { "modules": false, "useBuiltIns": "usage", "corejs": 2, "shippedProposals": true }] ] }
- 指定轉(zhuǎn)換器
- ES6
npx mocha --compilers js:@babel/core/register
- ES6
- 依賴包安裝
- CoffeScript
npx mocha --compilers coffee:coffee-script/register
延時(shí)測試
- 延時(shí)執(zhí)行done
it('延時(shí)1000毫秒', function(done) { setTimeout(() => { done() }, 1e3) }) it('請求之后執(zhí)行', function() { request .get('https://api.github.com') .end(function(err, res) { expect(res).to.be.an('object') done() }) })
- 返回一個(gè)promise
it('請求之后執(zhí)行', function() { return request .get('https://api.github.com') .end(function(err, res) { expect(res).to.be.an('object') }) })
- 通過命令行
-
mocha -t 1000
: 設(shè)置超時(shí)時(shí)間未1000毫秒 -
mocha -s 1000
: 設(shè)置測試延時(shí)1000毫秒執(zhí)行
-
鉤子函數(shù)
before
after
beforeEach
afterEach
用例管理
-
only
只運(yùn)行某個(gè)用例
在瀏覽器中查看用例運(yùn)行結(jié)果
- 執(zhí)行命令:
mocha init test
- 新建
add.js
function add(x, y) { return x + y; }
- 把
add.js
和chai.js
加入index.html
<script> mocha.setup('bdd'); </script> <script src="add.js"></script> <script src="http://chaijs.com/chai.js"></script> <script src="tests.js"></script> <script> mocha.run(); </script>
- 新建
tests.js
var expect = chai.expect; describe('加法函數(shù)的測試', function() { it('1 加 1 應(yīng)該等于 2', function() { expect(add(1, 1)).to.be.equal(2); }); it('任何數(shù)加0等于自身', function() { expect(add(1, 0)).to.be.equal(1); expect(add(0, 0)).to.be.equal(0); }); });