第一次做 Unit test

好像很厲害的感覺。

單元測試在做什麼?

單元測試也可以稱為「模組測試」。

一個程式可以劃分成很多個小單位,function 就是其中之一。

而 unit test 要做的事情是,測試每一個 function 的正確性,並確保每一個小的單位(unit)都沒有錯。

另外,這篇筆記的內容是以 jest 來做測試。

基本用法

Step1 把你要測試的 function 給輸出

1
2
3
4
5
6
7
8
9
10
// index.js
function repeat(str, times) {
let result = ''
for (let i = 0; i < times; i++) {
result += str
}
return result
}
// 輸出模組
module.exports = repeat

簡單來說,這個 function 的回傳值是「n 個新字串」

Step2 建立 index.test.js 測試執行檔

一般測試執行檔都會把 .test.js 當做後綴檔名。可以算是個約定俗成,盡量維持這個習俗。

另外如果你剛好也有檔案叫 test.js 的話,會被誤以為是測試執行檔而一起被執行,要多注意。

Step3 撰寫測試內容

有不懂的就參考 README 上的說明,這裡就簡單示範一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// index.test.js
const repeat = require('./repeat') // 引入要測試的模組

describe('測試 repeat', () => {
test('結果應該要是 aaaaa', () => {
expect(repeat('a', 5)).toBe('aaaaa')
})
test('結果應該要是 ""', () => {
expect(repeat('a', 0)).toBe('')
})
test('結果應該要是 abcabc', () => {
expect(repeat('abc', 2)).toBe('abcabc')
})
test('結果應該要是 ""', () => {
expect(repeat('', 5)).toBe('')
})
})

describe(message, function) 是用來把一個要測試的群組給包起來,這樣在結構上會比較好。message 可以填入跟這個群組有關的名稱,function 裡面會放要測試的所有項目。

test(message, function) 是用來執行測試函式,message 可以填入這個函式要測試什麼?

expect(received).toBe(expected) received 放你要執行的函式,expected 填預期的輸出結果。

Step4 執行測試執行檔

特別注意,因為 jest 是安裝在專案底下,所以沒辦法直接在 terminal 上用這個指令,必須透過 npm scriptnpx jest 來執行,詳細可以參考 npm script 與 npx 的用途

成功執行後就能看到結果如下:

unit01

如果有發現錯誤的結果:

unit02

補充

當想要檢查的值是陣列 or 物件的話,要改用 toEual 不是 toBe。這樣就會檢查裡面的每一個值是否相同,而不是檢查記憶體位置。

1
2
3
4
5
6
7
// myFunction 會回傳 [1, 2, 3]
const myFunction = require('./myfunction')
describe('複習 jest', () => {
test('is array === [1, 2, 3] ?', () => {
expect(myFunction()).toBe([1, 2, 3])
})
})

test-array-01

改成 toEqual 就正確了:

1
2
3
4
5
6
7
// myFunction 會回傳 [1, 2, 3]
const myFunction = require('./myfunction')
describe('複習 jest', () => {
test('is array === [1, 2, 3] ?', () => {
expect(myFunction()).toEqual([1, 2, 3])
})
})

test-array-02

總結

第一次寫單元測試還蠻有趣的,以前也是很常聽到 unit test 這個技術用語,但都不知道實際上在做什麼,今天算是解決這個疑惑了,也學到一項新的技能,開心!

npm script 與 npx 的用途 清除雜訊的重要性
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×