在jest中,如果測試用例中需要使用到某個對象 或 在執行測試代碼的某個時刻需要做一些必要的處理,直接在測試文件中寫基礎代碼是不推薦的,可以使用jest的鉤子函數。
鉤子函數的作用:在代碼執行的某個時刻,會自動運行的一個函數。
=> 常用的鉤子函數
beforeAll
- 在所有測試用例執行之前執行
beforeEach
- 每個測試用例執行前執行,可讓每個測試用例中使用的變量互不影響,因爲分別爲每個測試用例實例化了一個對象
afterAll
- 等所有測試用例都執行之後執行 ,可以在測試用例執行結束時,做一些處理
afterEach
- 每個測試用例執行結束時,做一些處理
=> describe測試用例分組
import Counter from './Counter'
// 使用類中的方法,首先要實例化
let counter = null
beforeEach(() => { // 每個測試用例執行前執行,可讓每個測試用例中使用的變量互不影響,因爲分別爲每個測試用例實例化了一個對象
counter = new Counter()
})
// 測試用例分組,讓測試代碼更清晰
describe('Counter 的測試代碼', () => {
describe('Counter 中的加法測試代碼', () => {
test('測試 Counter 中的 addOne 方法', () => {
counter.addOne()
expect(counter.number).toBe(1)
})
test('測試 Counter 中的 addTwo 方法', () => {
counter.addTwo()
expect(counter.number).toBe(2)
})
})
describe('Counter 中的減法測試代碼', () => {
test('測試 Counter 中的 minusOne 方法', () => {
counter.minusOne()
expect(counter.number).toBe(-1)
})
test('測試 Counter 中的 minusTwo 方法', () => {
counter.minusTwo()
expect(counter.number).toBe(-2)
})
})
})
執行npm test:測試結果縮進顯示,清晰易讀。
=> 鉤子函數的作用域
鉤子函數的作用域爲: 所在的describe分組;
例子:
import Counter from './Counter'
// 使用類中的方法,首先要實例化
let counter = null
beforeAll(() => {
console.log('外部的 beforeAll 執行')
})
beforeEach(() => {
counter = new Counter()
console.log('外部的 beforeEach 執行')
})
describe('Counter 的測試代碼', () => {
describe('Counter 中的加法測試代碼', () => {
beforeAll(() => {
console.log('內部的 beforeAll 執行')
})
test('測試 Counter 中的 addOne 方法', () => {
counter.addOne()
expect(counter.number).toBe(1)
})
test('測試 Counter 中的 addTwo 方法', () => {
counter.addTwo()
expect(counter.number).toBe(2)
})
})
describe('Counter 中的減法測試代碼', () => {
test('測試 Counter 中的 minusOne 方法', () => {
counter.minusOne()
expect(counter.number).toBe(-1)
})
test('測試 Counter 中的 minusTwo 方法', () => {
counter.minusTwo()
expect(counter.number).toBe(-2)
})
})
})
打印結果:
由打印結果可知,寫在內層describe中的beforeAll鉤子函數只作用了當前的分組,所以可得:鉤子函數的作用域爲自身所在的describe分組。
=> test.only的使用
當我們的測試用例非常多時,也可以只對單個測試用例進行調試,使用test.only即可。
import Counter from './Counter'
// 使用類中的方法,首先要實例化
let counter = null
beforeAll(() => {
console.log('外部的 beforeAll 執行')
})
beforeEach(() => {
counter = new Counter()
console.log('外部的 beforeEach 執行')
})
describe('Counter 的測試代碼', () => {
describe('Counter 中的加法測試代碼', () => {
beforeAll(() => {
console.log('內部的 beforeAll 執行')
})
test.only('測試 Counter 中的 addOne 方法', () => {
counter.addOne()
expect(counter.number).toBe(1)
})
test('測試 Counter 中的 addTwo 方法', () => {
counter.addTwo()
expect(counter.number).toBe(2)
})
})
describe('Counter 中的減法測試代碼', () => {
test('測試 Counter 中的 minusOne 方法', () => {
counter.minusOne()
expect(counter.number).toBe(-1)
})
test('測試 Counter 中的 minusTwo 方法', () => {
counter.minusTwo()
expect(counter.number).toBe(-2)
})
})
})
執行npm test:
當使用test.only時,只有當前測試用例被執行,其他用例均不執行。
=> describe中的基礎代碼執行順序
import Counter from './Counter'
// 使用類中的方法,首先要實例化
let counter = null
beforeEach(() => {
counter = new Counter()
console.log('外部的 beforeEach 執行')
})
describe('Counter 的測試代碼', () => {
console.log('describe 11111')
describe('Counter 中的加法測試代碼', () => {
console.log('describe 22222')
beforeAll(() => {
console.log('內部的 beforeAll 執行')
})
test.only('測試 Counter 中的 addOne 方法', () => {
counter.addOne()
expect(counter.number).toBe(1)
})
test('測試 Counter 中的 addTwo 方法', () => {
counter.addTwo()
expect(counter.number).toBe(2)
})
})
describe('Counter 中的減法測試代碼', () => {
console.log('describe 33333')
test('測試 Counter 中的 minusOne 方法', () => {
counter.minusOne()
expect(counter.number).toBe(-1)
})
test('測試 Counter 中的 minusTwo 方法', () => {
counter.minusTwo()
expect(counter.number).toBe(-2)
})
})
})
執行npm test:
由打印結果可以看出,describe中的基礎代碼並沒有按照我們的意願去執行,而是最先執行了,所以當我們在寫測試代碼的基礎代碼時,一定要在鉤子函數內完成。