[tools] Vitest
配置
預設不需要配置檔案也能運行,配置檔案執行優先度較高,有兩種配置檔案的撰寫方式
- 統一撰寫於
vite.config.js
- 額外撰寫一個
vitest.config.js
//撰寫於 vite.config.js
export default {
test:{
//vitest 的配置撰寫位置
}
}
官方是推薦統一撰寫在
vite.config.js
內,原因是 要維護兩邊文件因為 vitest 並不會繼承 vite 的配置內容,例如你在 vite 有設定 css 要如何被編譯,但在 vitest 並不會知道這個設定,在測試時可能會因為兩邊配置不同步而衍生的問題。
下面是 vitest 主打的特色
- 預設支援 ESM
- HMR 功能,當你修改文件後會立刻更新
- 支援 Vue, React 等進行元件測試
- 支援 Typescript, JSX
- 快照測試、Mock 測試
- 包含 Jest 多數的功能
mode
預設是 watch mode
,當你變更文件時會立刻觸發改變
test API
it
, test
比較
以 it
, test
兩者進行測試結果上沒有差異,只是測試程式碼風格上的差別,自己的理解如下:
- 用
it
撰寫在閱讀程式碼更有 情境 的感覺,可想像為it
是主詞 test
就是單純描述這個功能怎麼運作
舉例來說,今天要測試一個按鈕點擊後的功能
it('should become 3, when user clicks this button',()=>{
expect(wrapper.trigger('button')).toBe(3)
})
test('should become 3, when user clicks this button',()=>{
expect(wrapper.trigger('button')).toBe(3)
})
用 it
撰寫的測試,搭配 it Should 的命名風格,讀起來就有 它應該會 ... 語感,而用 test
撰寫的就比較單純是描述一個功能。
加入時間
default: 5000 ms
你可以在測試方法的第三個參數加入時間長度,也可以透過調整配置 testTimeout
修改預設值
test('test with time',()=>{
console.log('call test when time is out.')
},1000)
https://vitest.dev/config/#testtimeout
跳過特定測試
加入 skip()
可實現
- 單一測試情境跳過
- 系列測試情境跳過
//跳過單一測試
describe('many test',()=>{
//this test will be skiped
it.skip('',()=>{
})
})
//跳過整個系列測試
describe.skip('many test is skiped',()=>{
test('test1',()=>{})
test('test2',()=>{})
})
只執行單一測試
describe('many test is skiped',()=>{
//只執行這個測試
test.only('test1',()=>{})
//skip
test('test2',()=>{})
//skip
test('test3',()=>{})
})
測試失敗也會繼續進行
it("should failure, but test contiued",()=>{
const x = 1
expect.soft(x).toBe(3) // failure ,but test will be continued
expect(x).toBe(2) //failure
})
非同步行為同時觸發
使用 .concurrent()
讓兩個非同步行為同時觸發
import { describe, it } from 'vitest'
// All tests within this suite will be started in parallel
describe.concurrent('suite', () => {
it('concurrent test 1', async ({ expect }) => { /* ... */ })
it('concurrent test 2', async ({ expect }) => { /* ... */ })
it.concurrent('concurrent test 3', async ({ expect }) => { /* ... */ })
})
expect API
比較兩者是否相等
toBe
主要是比較 Primitive type 的變數值,或是同址物件
//primitive type
const a = 2
expect(a).toBe(2)
//reference type
const x = {name:1}
let y = x
expect(x).toBe(y)
請不要使用它測試浮點數相加,請改用 toBeCloseTo
進行測試。
test("two number plus",()=>{
expect(0.1+0.2).toBe(0.3) // error 0.300000000004
})
類似功能方法
expect(x).toBeNull() //equal .toBe(null)
expect(x).toBeNaN() // equal .toBe(NaN)
toEqual
與 toBe
功能類似,主要用於比較物件型別變數,這個方法只比較物件內架構,不比較記憶體指向,飲用官方文件範例,這個兩個相同架構的物件,分別使用 toBe
, toEqual
測試是否相等。
import { expect, test } from 'vitest'
const stockBill = {
type: 'apples',
count: 13,
}
const stockMary = {
type: 'apples',
count: 13,
}
test('stocks have the same properties', () => {
expect(stockBill).toEqual(stockMary)
})
test('stocks are not the same', () => {
expect(stockBill).not.toBe(stockMary)
})
toStrictEqual
類似前者,差別在於
測試畫面元素
toMatchSnapShot
以快照方式檢查元素是否存在
1.toBeNull
=>
比較變數型別
toBeTypeof
物件型別:[]
,{}
,new Map()