Jest中的鉤子函數

在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中的基礎代碼並沒有按照我們的意願去執行,而是最先執行了,所以當我們在寫測試代碼的基礎代碼時,一定要在鉤子函數內完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章