国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

測試框架千千萬,我偏愛 vitest

開發 前端
Vitest 由核心Vite團隊成員Anthony fu(一個托尼)開發,它建立在Vite之上,但非vite項目其實也可以使用vitest。而vite想必大家都非常熟悉了,它可以快速的啟動開發服務器,利用瀏覽器的ES模塊系統,從而加快本地開發速度,這讓vite變得十分受歡迎。

前端測試框架千千萬,jest、vitest、Jasmine、mocha等等,但我個人更偏愛 vitest,簡潔,高效,現代化,這篇文章就帶大家了解一下關于vitest的一些知識和特性,幫助大家更好的使用vitest。

why vitest

Vitest 由核心Vite團隊成員Anthony fu(一個托尼)開發,它建立在Vite之上,但非vite項目其實也可以使用vitest。而vite想必大家都非常熟悉了,它可以快速的啟動開發服務器,利用瀏覽器的ES模塊系統,從而加快本地開發速度,這讓vite變得十分受歡迎。

雖然用vite開發的項目也可以和jest一起使用,但是vite和jest中其實有很多配置重復的部分,迫使用戶要維護和運行兩套流程。

所以,vitest一開始要解決的問題就是便于在vite項目中方便集成測試能力;在開發中,將Vitest與Vite結合使用的主要優勢是他們都有很好的性能,方便一起集成,以及他們都共享配置同一份配置。

vite的爆火一定程度上也讓vitest增加了曝光度,它也在社區中十分受歡迎,成為了越來越多測試框架的首選:

Vitest 對比 jest

說到vitest,不得不提另外一個測試框架也就是jest。

早在2011年,還沒有JavaScript測試框架能滿足Facebook(meta)團隊的測試需求,所以他們創建了Jest。Jest在2014年開源,就在React開源后不久,jest也隨著React迅速流行起來。2016年,jest成為create react APP(CRA)命令創建react應用的首選測試框架,Next.js V12版本也把jest作為默認測試框架,jest主流地位已然確立。

2022年,jest所有權已經轉移給OpenJS基金會,由meta外部人員維護,之后jest的更新和維護就變得相對緩慢。jest的最新一次更新版本在1年前,jest的v30版本早在2023年就已經發布alpha版本,但是現在已經2025年了,v30版本仍然沒有發布;但是vitest去年就從v1版本更新到了v3版本......

vitest對比jest一個顯著的優勢是vitest原生支持typescript、ESM,而jest v29版本現在對于ESM的支持還是實驗性的,此外如果要支持typescript還需要配置babel,通過babel來轉譯支持typescript。而vitest對于現代特性都是開箱即用的。

關于性能方面,在redit論壇 (https://www.reddit.com/r/reactjs/comments/10zyse3/is_jest_still_faster_than_vitest/)上有很多關于jest和vitest的性能測試的討論,有的反饋說jest比較快,有的說vitest比較快。但不管怎么樣,vitest的HMR特性是要比jest是要快的,也就是開發過程中只運行修改文件的測試。原因是vitest是基于修改模塊的依賴樹去做的分析重新運行,而jest是基于git未提交代碼做的分析,這可能不太準確,因為并非所有檢測到的更改文件都與現在運行的測試相關。

下面是關于jest和vitest特性的一個全面對比:

vitest有更多的現代特性,以及vitest處于一個快速迭代社區逐漸繁榮的階段,如果是一個使用現代特性的新項目,那么vitest肯定是首選!

vitest的一些特性

關于怎么開始和配置,比較簡單,本文就不展開了,下面詳細聊聊vitest的一些特性,了解完這些特性后,想必你對vitest有更全面的認識。

兼容jest API 但是更強

因為jest的API已經設計的比較優秀(從他的下載占有率可以看出),vitest幾乎完全兼容了jest的API設置。比如Expect、Mock、Setup and TearDown等API。所以從jest項目遷移到vitest只需要做很少的調整,具體可以參考官方文檔(https://vitest.dev/guide/migration.html#jest),其中一個都會遇到的調整是globals的配置,他可以不用引入vitest,也能使用全局API。

此外,vitest的v3 API增加了更多的能力,比如toHaveBeenCalledExactlyOnceWith,他可以檢測某個函數只被調用了一次且調用參數為預期值。

test('vitest mocking example', () => {
const mock = vi.fn();
  mock('hello');
// New matcher for more precise assertions
  expect(mock).toHaveBeenCalledExactlyOnceWith('hello');

// Spy reuse example
const obj = {
    method: () => {}
  };
const spy = vi.spyOn(obj, 'method');
// Spy is automatically reused if spyOn is called again
const sameSpy = vi.spyOn(obj, 'method');
  expect(spy === sameSpy).toBe(true);
});

默認watch模式

在jest中,我們要使用watch模式的時候,需要增加--watch參數(即jest --watch);但是vitest默認使用watch模式(即vitest),不需要增加--watch參數,也能自動進入watch模式。

但是如果是CI環境,我們運行watch模式,是不是不符合預期?

vitest會根據是否有環境變量process.env.CI判斷是否處于CI環境,如果有環境變量則不會啟動watch模式。

當然也可以通過指定--watch參數以及--run參數,來指定watch模式還是單次運行。

源碼內聯測試

什么是源碼內聯測試(In-Source Testing)呢?

這是一個rust模塊測試的方式,他可以讓我們把測試代碼寫在源碼中。

這可以讓測試代碼和源碼代碼使用相同的閉包環境,關注的邏輯和代碼在同一地方,這可以讓我們更快速的發現問題、修復問題,每次代碼修改后都能立即運行測試代碼并進行修復,便于維護;但是由于測試代碼和源代碼在一個文件里,非常容易耦合,所以對代碼質量有一定要求。

下面是一個內聯代碼測試的demo:

export function add(...args: number[]) {
return args.reduce((a, b) => a + b, 0)
}

// in-source test suites
if (import.meta.vitest) {
const { it, expect } = import.meta.vitest
  it('add', () => {
    expect(add()).toBe(0)
    expect(add(1)).toBe(1)
    expect(add(1, 2, 3)).toBe(6)
  })
}

官方建議對更復雜的測試使用單獨的測試文件,源代碼內測試適用于對小函數進行單元測試和原型設計,因此對于為 JavaScript 庫編寫測試特別有用。

此外,如果我們在生產環境使用該模式,應該為bundler增加變量定義,以便于bundler分析dead code并刪除:

import { defineConfig } from 'vitest/config'

export default defineConfig({
  test: {
    includeSource: ['src/**/*.{js,ts}'],
  },
  define: { 
    'import.meta.vitest': 'undefined', 
  }, 
})

真正的瀏覽器測試

在vitest v2版本引入了瀏覽器模式,該模式還處于實驗階段。該模式將在瀏覽器環境直接運行代碼,所以他可以訪問真正的dom API,所以理論上在實際環境中運行的測試將會更加可靠。缺點就是慢!

在node環境的測試中,我們一般通過js-dom或者happy-dom來模擬瀏覽器環境,happy-dom支持更少的瀏覽器API,但是更快,js-dom則相反。我們可以根據需要選擇不同的dom模擬環境,vitest同時支持js-dom和happy-dom。

vitest支持在不同的容器運行測試,比如playwright或者webdriverio ,這兩者比較顯著的差異是他們底層協議不同,playwright使用的Chrome DevTools 協議,而webdriverio使用的是WebDriver 協議:

vitest提供了開箱即用的包來渲染常用的前端框架的組件,下面是一個react的demo:

import { expect, test } from'vitest'
import { render } from'vitest-browser-react'
import HelloWorld from'../src/HelloWorld'

test('renders name', async () => {
const { getByText, getByRole } = render(<HelloWorld name="Vitest" />)

await expect.element(getByText('Hello Vitest x1!')).toBeInTheDocument()
await getByRole('button', { name: 'Increment '}).click()

await expect.element(getByText('Hello Vitest x2!')).toBeInTheDocument()
})

可以看到API和用法幾乎和@testing-library/react幾乎相同,相同的代碼可以讓運行環境切換到瀏覽器環境!

其他的特性

  • Browber UI。直接啟動一個前端頁面,在這個頁面中可以更好的調試、運行、修復測試;
  • 類型測試。提供類型斷言的API可以對TS的類型進行測試;
  • 提供benchmark
  • workspace配置。v3版本的vitest增加了workspace配置,它特別適用于monorepo,可以在一個配置文件里配置多個項目的配置。
  • ...

這里就不一一列舉了,感興趣的小伙伴建議直接查看官網。

一些技巧

下面分享個人在使用vitest的過程中的一些有用的技巧。

使用vscode的debug terminal

這是一個node調試比較通用的技巧,對于vitest同樣適用。使用vscode 的debug terminal可以非常方便的查看變量的參數,這非常適合我們在mock出現問題的時候debug。

使用skip或者only來快速調試

在調試單元測試的時候,我們經常會遇到單測報錯,但是可能因為mock或者一些上下文影響,十分難以調試,這個時候可能會用到skiponly API,這兩個API可以只運行某個case或者跳過某個case,可以減少影響面,幫助我們快速調試(而不是注釋代碼)

it.only('should be open', () => {
   //...
  });

 it.skip('should be closed', () => {
   //...
  });

優雅的retry

vitest中有很多重試的方法,比如:

import { expect, test } from"vitest";
import { sum } from"./sum.js";

it(
"adds 1 + 2 to equal 3",
  {
    retry: 3,
    timeout: 3000,
  },
  () => {
    expect(sum(1, 2)).matchSnapshot();
  }
);

it支持傳入第二個配置參數,該參數可以配置retry和timeout等,可以針對一整個case retry的場景。

此外,vitest還支持waifor API,該API可以不斷嘗試和獲取API:

// @vitest-environment jsdom

import { expect, test, vi } from'vitest'
import { getDOMElementAsync, populateDOMAsync } from'./dom.js'

test('Element exists in a DOM', async () => {
// start populating DOM
  populateDOMAsync()

const element = await vi.waitFor(async () => {
    // try to get the element until it exists
    const element = await getDOMElementAsync() as HTMLElement | null
    expect(element).toBeTruthy()
    expect(element.dataset.initialized).toBeTruthy()
    return element
  }, {
    timeout: 500, // default is 1000
    interval: 20, // default is 50
  })
  expect(element).toBeInstanceOf(HTMLElement)
})

上面這個case會在dom真正渲染出來,才會執行下面的語句,之前會一直輪詢執行語句,判斷是否正確執行。

另外,@testing-library/react里面也有很多類似的API底層其實就是使用waitfor,例如findAllByTextAPI,該API會等待元素渲染完成之后,再繼續進行下面的代碼。

Bad case:

使用盡量詳細的斷言

我遇到一些單測的case,因為沒有運行每個case前mockReset,導致之前spy函數調用記錄仍然存在,于是好幾個case在不同的測試場景中,相同的斷言均是toHaveBeenCalledWith,該斷言因為只會判斷歷史調用中是否存在某參數調用就行了,所以導致這幾個case均成功了,但是實際上是有問題的。

我們應該使用更加詳細的斷言,比如toHaveBeenNthCalledWith或者上文提到的toHaveBeenCalledExactlyOnceWith。

總結

vitest能夠快速火起來,我認為其原因有三點。首先提供了和jest兼容的API設計,這一點對于開源工具來說十分重要,讓用戶可以更少的遷移成本;第二個是擁抱社區,提供了很多很現代的功能,比如瀏覽器模式、源碼內聯測試;第三個基于vite的設計理念,使用現代的API和工具,讓開發者開箱即用ESM和typescript,無需任何其他配置,提供更好的開發者體驗。

我們應該關注vitest最新特性,及時升級vitest,使用最新特性和技術來保證我們代碼的穩定性。

責任編輯:姜華 來源: Tecvan
相關推薦

2024-10-10 17:23:31

2013-04-15 10:12:38

2019-10-24 07:50:52

勒索病毒勒索軟件網絡安全

2021-05-14 16:34:53

軟件電腦硬件

2019-11-17 16:09:45

勒索病毒網絡攻擊網絡安全

2019-08-30 16:22:30

編程語言PythonJava

2021-05-17 15:23:07

電腦廣告軟件

2017-11-02 10:45:21

2023-09-11 15:34:53

2023-12-06 09:02:12

Vitest前端

2011-09-29 10:24:08

項目方法項目變更項目風險

2014-06-17 14:26:25

Windows 7補丁

2022-08-09 13:08:27

VitestJest前端

2018-01-10 14:57:56

2011-08-25 10:15:54

視頻演講喬布斯

2023-01-03 10:30:00

Java工具

2020-10-29 18:38:39

PythonGitHub代碼

2023-11-27 17:40:45

VitestPlaywright前端

2023-08-31 08:19:51

ViteSVGBase64
點贊
收藏

51CTO技術棧公眾號

国产无遮挡一区二区三区毛片日本| 91精品国产欧美一区二区18| 久久黄色片视频| 国产在线播放一区二区三区| 国产女主播av| 国产精品美女久久久久久久久久久 | 国产亚洲欧美另类一区二区三区| 亚洲区国产区| 91制片厂免费观看| 国产午夜精品一区二区三区四区| 国产精品㊣新片速递bt| 91国产福利在线| 最新中文字幕在线播放| 国内精品久久久久| 一本到12不卡视频在线dvd| 亚洲精品乱码视频| 国产亚洲婷婷免费| 国产精品久久一区二区三区不卡| 亚洲欧美激情视频| 日韩av密桃| 永久免费看av| 亚洲国产视频直播| 欧美aa在线| 国产91免费观看| 久久99精品国产| 日本在线免费观看视频| 亚洲国产福利在线| 欧美一区二区性| 欧美交换配乱吟粗大25p| 亚洲1区2区3区4区| 久久99国产精品二区高清软件| 91久久久久久国产精品| kk眼镜猥琐国模调教系列一区二区| 中文在线a在线| 神马久久久久久| 亚洲色图88| 日本新janpanese乱熟| 欧美图区在线视频| 国产精品久久久久久久久久辛辛 | 99在线精品观看| 亚洲伦理在线| xvideos成人免费中文版| 亚洲视频精品| 色乱码一区二区三区在线| 亚洲成av人乱码色午夜| 国产麻豆精品久久| 人妻av中文系列| 欧美一区二区三区成人| 欧美精品一区二区三区中文字幕| 亚洲黄色网址在线观看| 欧美艳星brazzers| 九九免费精品视频在线观看| 日韩极品视频在线观看| 91精品国产一区二区三区| 欧美限制电影| 国产又粗又长又大的视频| 亚洲国产精品99| 亚洲视频狠狠| 黄色仓库视频网站| 中文字幕亚洲欧美日韩高清| 国产日韩高清一区二区三区在线| 草草久视频在线观看电影资源| 亚洲欧美日韩久久久久久| 欧美一区亚洲| 米奇777在线影院线| 久久国产精品久久久久久| 韩国毛片一区二区三区| 欧美日韩视频在线播放| 国产在线观看精品| 亚洲人成小说网站色在线| 超碰国产精品一区二页| 成人在线观看毛片| 欧美精品一区二区三区蜜桃| 亚洲国产日韩欧美一区二区三区| qvod激情图片| 欧美激情第99页| 成人精品在线视频观看| 乡村艳史在线观看| 欧美日韩免费精品| 欧美日本国产视频| 国产一区二区三区自拍| 在线视频毛片| 国产精品美女999| 亚洲美腿欧美偷拍| 欧美成a人免费观看久久| 国产精品自拍片| 日韩在线视频观看正片免费网站| 国产一区二区成人久久免费影院| 手机在线免费av| 欧美日韩在线精品一区二区三区| 在线免费av一区| 综合精品久久| 欧美香蕉爽爽人人爽| 91九色国产在线| 欧美日韩激情小视频| 久久视频在线| 噜噜噜在线观看播放视频| 粉嫩av免费一区二区三区| 欧亚一区二区三区| 国产日韩欧美一区在线| 黄色网页在线免费观看| 欧美精品一区二区视频| 亚洲精品一区二区在线观看| 久久精品免费观看| 久久电影tv| 精品国产av无码一区二区三区| 亚洲亚裔videos黑人hd| 91老师片黄在线观看| 神马久久影院| 玖草视频在线| 国产伦精品一区二区三区视频黑人| 欧美视频三区在线播放| 麻豆久久婷婷| 桃子视频成人app| 熟女少妇精品一区二区| 青青在线视频一区二区三区| 亚洲成人av福利| 精品999网站| 国产精品yjizz视频网| 97视频在线免费| 欧美精品xxx| 亚洲6080在线| 久久亚洲色图| 精品中文视频| 亚洲成av人影片在线观看| 欧洲亚洲一区| 久久伊人精品视频| 亚洲午夜久久久久| 亚洲欧美日本视频在线观看| 欧洲亚洲两性| 日韩精品视频一二三| 91精品国自产在线观看| 日韩精品高清在线| 亚洲同性同志一二三专区| 亚洲视频电影在线| 国产传媒在线观看| 亚洲jizzjizz妇女| 九九99久久| 欧美大片大片在线播放| 在线观看亚洲专区| 国产高清不卡一区| 成人av二区| 日韩激情电影| 最近中文字幕mv2018在线高清| 日韩女优中文字幕| 欧美一级淫片aaaaaaa视频| 欧美日韩情趣电影| 26uuu另类欧美| 欧美日韩少妇| 成人久久网站| 久草在线网址| aa在线免费观看| 99porn视频在线| 在线日韩中文字幕| 日韩欧美成人精品| 不卡欧美aaaaa| 午夜国产精品视频| 国产精品成人3p一区二区三区| 成人在线免费公开观看视频| 国产一线二线三线女| 7777精品伊久久久大香线蕉语言 | 99国内精品久久| 亚洲色图网站| 日韩美香港a一级毛片| 国产最新视频在线| 男人用嘴添女人下身免费视频| 亚洲自拍偷拍色片视频| 中文字幕久热精品在线视频| 欧美艳星brazzers| 中文一区二区在线观看| 免费av成人在线| 日韩欧美伦理| 精品一级视频| 国产美女一区视频| 中文在线√天堂| 国产精品人人妻人人爽人人牛| 欧美久久综合性欧美| 国产精品极品美女粉嫩高清在线| 亚洲人成网站999久久久综合| 日韩欧美在线视频| 国产精品欧美久久久久无广告 | 中国在线观看免费国语版电影| 国产成人免费高清视频| 亚洲综合成人婷婷小说| 欧美精品aaa| 国产亚洲视频在线| 91精品国产综合久久久蜜臀图片| 亚洲激情欧美激情| 久久综合久久99| 国产在线视频不卡二| 国产欧美成人| 亚洲一区 二区 三区| 伊人久久大香线蕉| 久久综合给合| 3d性欧美动漫精品xxxx软件| 免费人成在线观看播放视频| 美女的诞生在线观看高清免费完整版中文| 啊啊啊一区二区| 一本色道久久88亚洲精品综合| 欧美精品123|