iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0

Mocha.js(官方文件) 是一個專為 Node.js 設計的 JavaScript 測試框架。其不具備斷言庫。一般常見熱門的搭配是使用 Chai 斷言庫。亦可搭配 should.js、expect.js 等斷言庫,或是使用 Node.js 自帶的原生 assertion。

斷言庫

這裡補充介紹一下斷言庫(assertion library),是一種邏輯判斷,為驗證程式碼是否與預期相符。會依照斷言「成功/失敗」返回「正確/錯誤」的訊息。

安裝與運行

底下會簡單介紹怎麼使用 Mocha.js 搭配 Chai 斷言庫進行單元測試。首先,安裝 Mocha.js、Chai:
npm install --save-dev mocha chai
並在 package.json 配置好 scripts

"scripts": {
  "test": "mocha",
  "testwatch": "mocha --watch"
},

即可執行測試:

npm run test // 單次測試
npm run testwatch // 時時監控測試的更新

describe/it

接著,我們要來撰寫測試,首先討論到在測試中,我們會使用 describe 作為一個 group、用 it 作為一個單元的範圍鍊。昨天的 Jest 也具備此功能。例如:

describe('addHandler()', function() {
    it('addHandler answer should be above 5', () => {
      let result = app.addNumbers(5, 5);
      assert.isAbove(result, 5);
    })
  
    it('addHandler answer should return type number', () => {
      let result = app.addNumbers(5, 5);
      assert.typeOf(result, 'number');
    })
})

生命週期鉤子

而在 Mocha.js 中也有生命週期鉤子,分別為 before()、after()、beforeEach()、afterEach()。也與 Jest 相似,分別會在測試,可分別於每筆 test 開始/結束時某些行為;或針對所有 test 的開始/結束時執行某些操作。並可搭配 describe 作為範圍鍊去區隔測試。

describe('testing classmates info data', () => {
  beforeEach(() => {
    console.log('beofre each test')
  });
  afterEach(() => {
    console.log('finished running a test');
  });
  before(() => {
    console.log('start to test');
  });
  after(() => {
    console.log('finished all tests');
  });

  it('sayHello', () => {
    let sayHelloResult = sayHello();
    assert.equal(sayHelloResult, 'hello');
  });

  it('sayGoodbye', async () => {
    let sayGoodbyeResult = sayGoodbye();
    assert.typeOf(sayGoodbyeResult, 'string');
  });
});

Chai 斷言庫

Chai 斷言庫,又提供了三種風格的斷言,分別為:assert、should、expect。其中,assert 的用法是比較 TDD(Test Drivin Development),是確保程式碼正確性的風格。使用方式如下:

let assert = require('chai').assert;
let testVal = 'abc';
assert.equal(testVal, 'abc');
assert.typeof(testVal, 'string');

而 should/expect 則是 BDD(Behavior Drivin Development)風格,此風格測試碼著重於預期的行為,使用方式如下:

let should = require('chai').should;
let testVal = 'abc';
testVal.should.equal('abc');
testVal.should.be.a('string');

let expect = require('chai').expect;
expect(testVal).to.be.a('string');
expect(testVal).to.equal('abc');

上一篇
[Day 11] 理解單元測試(二)- 簡介 Jest
下一篇
[Day 13] 理解單元測試(四)- 測試替身
系列文
手動測試好累喔!一起來寫前端自動化測試吧~30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言