Jest 單元測試入門

Jest 單元測試入門

今天,咱們要講的是 Jest 單元測試的入門知識。javascript

爲什麼要進行單元測試?

在學習 Jest 以前,咱們須要回答一個問題:爲什麼要進行單元測試?編寫單元測試能夠給你帶來不少好處:java

  • 將測試自動化,無需每次都人工測試。
  • 變動檢查,當代碼發生重構,能夠及時發現,並作出相應的調整。
  • 列舉測試用例,能夠幫你瞭解全部的邊界狀況。
  • 看成文檔,若是你的測試描述足夠詳細,生成的測試報告甚至能夠看成文檔。
  • ……

總之,單元測試會讓你的生活更加美好。正則表達式

使用 Jest 進行單元測試

編寫測試一般都會基於某個測試框架,在衆多測試框架中我選擇了 Jest,不只由於我是個 React 開發者(React 與 Jest 都是 Facebook 出的),並且由於它確實簡單好用。讓咱們開始編寫測試吧!npm

首先,安裝 Jest:json

1
npm install --save-dev jest

而後,編寫一個待測試的文件,以Stack類爲例:數組

Stack.js框架

function Stack() {
// 私有變量 items,用於記錄數組,對象不能直接操做
var items = [];
// 類方法 push,在數組末尾添加項,對象能夠直接調用
this.push = function (element) {
items.push(element);
};
// 刪除並返回數組末尾的項
this.pop = function () {
return items.pop();
};
}

  


接下來,編寫一個測試文件 Stack.test.js: 單元測試

Stack.test.js學習

// 導入 Stack
var Stack = require('./Stack');
 
test('Stack', function () {
// 實例化一個 stack 對象
var stack = new Stack();
 
stack.push(8);
// 指望 stack 最後一項是8
expect(stack.pop()).toBe(8);
});

 

而後,在 package.json 中添加:測試

"scripts": {
"test": "jest"
}

  

最後,打開命令行運行:

npm test


PASS Stack.test.js
結果會在命令行中生成測試報告:

 
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 0.386s
Ran all test suites.

在上面的測試代碼中有個 expect().toBe() 來判斷結果是不是預期,這叫斷言。

什麼是斷言?在程序設計中,斷言(assertion)是一種放在程序中的一階邏輯(如一個結果爲真或是假的邏輯判斷式),目的是爲了標示與驗證程序開發者預期的結果。除了expect().toBe()以外,其餘經常使用的斷言包括:斷言簡介

  • expect().toEqual():判斷結果是否和預期等價。
  • expect().toBeFalsy():判斷結果是否爲假。
  • expect().toBeTruthy():判斷結果是否爲真。

普通匹配器

  • toBe - toBe 使用 Object.is 來測試是否徹底相等
  • .not - 用來測試相反的用例
  • .toEqual - 若是你想檢查某個對象的值,請改用 toEqual。

toBe

最簡單的測試值的方法是看是否精確匹配。

test('two plus two is four', () => { 
    expect(2 + 2).toBe(4); 
});

toEqual

若是你想檢查某個對象的值,請改用 toEqual。

test('object assignment', () => { 
    const data = {one: 1}; 
    data['two'] = 2; 
     expect(data).toEqual({one: 1, two: 2}); 
});

.not

用來測試相反的用例

test('null', () => {
  const n = null;
  expect(n).not.toBeUndefined();
  expect(n).not.toBeTruthy();
});

布爾值匹配器

  • toBeNull 只匹配 null
  • toBeUndefined 只匹配 undefined
  • toBeDefined 與 toBeUndefined 相反
  • toBeTruthy 匹配任何 if 語句爲真
  • toBeFalsy 匹配任何 if 語句爲假
test('null', () => {
  const n = null;
  expect(n).toBeNull();
  expect(n).toBeDefined();
  expect(n).not.toBeUndefined();
  expect(n).not.toBeTruthy();
  expect(n).toBeFalsy();
});

test('zero', () => {
  const z = 0;
  expect(z).not.toBeNull();
  expect(z).toBeDefined();
  expect(z).not.toBeUndefined();
  expect(z).not.toBeTruthy();
  expect(z).toBeFalsy();
});

  

數字匹配器

  • .toBeGreaterThan() - 大於
  • .toBeGreaterThanOrEqual() 大於等於
  • .toBeLessThan() - 小於
  • .toBeLessThanOrEqual() - 小於等於
  • .toBeCloseTo() - 浮點數比較

toBeGreaterThan、toBeGreaterThanOrEqual、toBeLessThan、toBeLessThanOrEqual

test('two plus two', () => { 
const value = 2 + 2; 
 expect(value).toBeGreaterThan(3); 
 expect(value).toBeGreaterThanOrEqual(3.5); 
 expect(value).toBeLessThan(5); 
 expect(value).toBeLessThanOrEqual(4.5);

// toBe 和 toEqual 對於數字來講是同樣的
 expect(value).toBe(4); 
 expect(value).toEqual(4); 
});

  

.toBeCloseTo()

對於比較浮點數的相等,應該使用 toBeCloseTo

test('兩個浮點數字相加', () => {
    const value = 0.1 + 0.2;        // 0.30000000000000004 
    expect(value).toBe(0.3);        // 這句會報錯,由於 js 浮點數有舍入偏差
    expect(value).toBeCloseTo(0.3); // 這句能夠運行
});

字符串匹配器

  • toMatch - 正則表達式的字符
  • .toHaveLength(number) - 判斷一個有長度的對象的長度

toMatch

正則表達式的字符

test('there is no I in team', () => {
  expect('team').not.toMatch(/I/);
});

test('but there is a "stop" in Christoph', () => {
  expect('Christoph').toMatch(/stop/);
});

.toHaveLength(number)

判斷一個有長度的對象的長度

expect([1, 2, 3]).toHaveLength(3);
expect('abc').toHaveLength(3);
expect('').not.toHaveLength(5);

數組匹配器

  • .toContain(item) - 判斷數組是否包含特定子項
  • .toContainEqual(item) - 判斷數組中是否包含一個特定對象

.toContain

判斷數組是否包含特定子項

const shoppingList = [
  'diapers',
  'kleenex',
  'trash bags',
  'paper towels',
  'beer',
];

test('購物清單(shopping list)裏面有啤酒(beer)', () => {
  expect(shoppingList).toContain('beer');
});

.toContainEqual(item)

能夠判斷數組中是否包含一個特定對象,相似 toEqual 與 toContain 的結合

function myBeverages() {
    return [
        {delicious: true, sour: false},
        {delicious: false, sour: true}
    ]
}
test('is delicious and not sour', () => {
    const myBeverage = {delicious: true, sour: false};
    expect(myBeverages()).toContainEqual(myBeverage);
});
相關文章
相關標籤/搜索