精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Vitest:替代 Jest 的前端測試工具新選擇

開發(fā) 前端
這篇文章中筆者會給大家介紹一下 vitest 這一測試框架,以及從 jest 到 vitest 遷移過程中的一些踩坑記錄,希望能有所幫助。

前言

有一段時間沒更新文章了,最近在公司項目中對現(xiàn)有的測試框架從 jest 遷移到 vitest (一個 Monorepo 類型的項目,里面測試大概有700組)。

最后僅僅從性能上來看,還是取得了不錯的成效,同樣也很大程度上減少了因為臃腫的 jest 帶來的很多配置心智負擔。

同時也發(fā)現(xiàn)其實現(xiàn)在社區(qū)中關(guān)于 vitest 的一些文章介紹還是比較少的,因此這篇文章中筆者會給大家介紹一下 vitest 這一測試框架,以及從 jest 到 vitest 遷移過程中的一些踩坑記錄,希望能有所幫助。

vitest 定位是個高性能的前端單元測試框架,具體官網(wǎng)地址可以參考: https://vitest.dev/。

目前在社區(qū)中也有一部分明星開源項目用上了,例如 vite 就在使用 vitest 作為測試框架來 "eat dog food"(具體參考 pr: https://github.com/vitejs/vite/pull/8076)

Vitest 除了本身相比于 jest 帶來了比較大的性能提升之外,同時還提供了很好的 ESM 支持。不過目前 vitest 官方并沒有給出具體對比的 benchmark,但在其官方的 twitter 頻道上能看到不少使用遷移后的用戶得到了極大的速度提升:

特性介紹

首先在 vitest 官網(wǎng)上是能看到關(guān)于其重點特性的一些介紹的,這里筆者帶大家粗略過一下一些我覺得比較重要的且實用的特性。

ESM 優(yōu)先支持

ESM 目前是前端模塊的一個未來發(fā)展趨勢,已經(jīng)有越來越多的包在打包輸出 esm 格式的產(chǎn)物,例如社區(qū)中有名的 ora、chalk 等庫。

關(guān)于 ESM 以及 CJS 的包產(chǎn)物格式可以參考 antfu 的這篇文章: https://antfu.me/posts/publish-esm-and-cjs。

不過目前很多的項目還是在使用 CJS,也有許多的項目正在開始向 ESM 進行遷移。而目前主流的測試框架 jest 對于 ESM 的支持實際上是一言難盡的。包括前面提到的 vite 倉庫本身從 jest 遷移到 vitest 很大原因也是由于 jest 本身的 esm 支持問題導致的:

關(guān)于 jest 對于 esm 的 native support 可以參考這個 issue: https://github.com/facebook/jest/issues/9430

而 vitest 則是天然對于 ESM 有著比較好的支持,其底層會使用 esbuild 進行文件的 transform,不過由于 ESM 的優(yōu)先支持,同樣給 vitest 帶來了不少的“問題”,這點后續(xù)介紹遷移的時候會詳細講解。

Vite 同步的配置文件

對于本來使用 vite 作為構(gòu)建工具的項目來說或許是個好處,因為這樣本質(zhì)上就可以復用一份配置文件了,例如項目使用 vite.config.ts ,那么則可以直接配置 vitest 的相關(guān)配置即可,例如:

import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
// ...
}
});

不過對于沒有使用 vite 構(gòu)建的項目,是需要直接新建一個配置文件的,不過需要注意的是,目前最新版本的 vitest 使用并不需要用戶在項目中安裝 vite 了,如果你只是使用 vitest 的話,那么只用安裝 vitest 就行。

當然如果想單獨使用一份測試配置而不是和 vite 對應的構(gòu)建配置共用一份,那么可以使用一個叫做 vitest.config.ts 的配置文件,vitest 會以該文件為最高優(yōu)先級配置。

內(nèi)置的 TypeScript / JSX 支持

一般 jest 的用戶如果需要測試 ts 或者 tsx 的代碼邏輯的話,一般會需要使用到 ts-jest ,項目中還需要增加一份配置,例如一份 jest.config.js 配置:

module.exports = {
transform: {
'^.+\.(t|j)sx?$': 'ts-jest',
},
globals: {
'ts-jest': {
tsconfig: `${__dirname}/tsconfig.test.json`,
},
},
};

實際上現(xiàn)在很多應用都使用 TS 來進行開發(fā)了,使用 jest 每次都要增加一些冗余配置以及額外的包引入,而如果使用 vitest 則就沒這方面的負擔。

即時的 watch 模式

對比而言,這個算是 vitest 的一個比較大的優(yōu)勢,在 watch 模式下進行測試的熱更新,速度提升是要遠遠快于 jest 的,至于 vitest 的 watch 模式為什么這么快,可以參考 antfu 的一條 twitter 內(nèi)容(https://twitter.com/antfu7/status/1468233216939245579):

圖片

和 vite 的原理類似,vitest 知道應用依賴的每個模塊,因此它可以清楚地決定在文件更改之后重新運行哪些模塊的測試內(nèi)容。這點對于正在開發(fā)的模塊測試是非常實用的。

vitest 的使用 & 遷移

前面介紹了一些關(guān)于 vitest 的亮點特性,下面來給大家介紹一下 vitest 的使用操作,這里就不從一個簡單的 demo 開始了,這些內(nèi)容在官方文檔上比較好找,筆者這里不做過多展開。

實際上 vitest 的整體 API 都和 Jest 是比較對齊的,如果是一些比較小的項目去做遷移的話,vitest 官方提供了一篇相關(guān)的遷移流程文檔: https://vitest.dev/guide/migration.html#migrating-from-jest。

這里筆者結(jié)合自己在遷移過程中踩過的一些坑來對于 vitest 的使用以及遷移做一個比較確切的介紹,也希望對有這方面需求的讀者有幫助。

全局 API 的適配

Jest 是默認開啟了全局 API 的訪問,而 vitest 則是默認關(guān)閉的,因此如果你不開啟的話,在測試文件中訪問一些關(guān)于 vitest 相關(guān)的 API,是會有拋錯的,默認情況下得寫成下面這種方式:

// 需要對 API 進行導入
import { describe, expect } from 'vitest';
describe('test', () => {
expect(1+1).toBe(1);
})

如果你的項目之前使用了 Jest,進行遷移過程中會有很多文件需要進行重新導入,簡單的解決方案就是在對應的 config 文件中開啟 globals API 的訪問,同時 tsconfig 也需要設置對應的類型訪問:

// vitest.config.ts
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
globals: true
}
})
// tsconfig.json
{
"compilerOptions": {
"types": ["vitest/globals"]
}
}

這樣就可以和 Jest 類似一樣使用全局的測試 API 了。

Jest 相關(guān) API 及類型替換

基本上很多 Jest 相關(guān)的 API 是可以做到直接替換的,舉個例子例如:

jest.mock()
jest.fn()
jest.spyOn()
// 這一類 API 可以直接替換為
vi.mock()
vi.fn()
vi.spyOn()

這里如果圖簡單的話,我們可以直接在 vitest 的 setUp 腳本中對全局的 jest 對應做一個替換即可,這里其實不是很推薦這種做法,如果只是短期的替換還是可以的:

// vitest.config.ts
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
setupFiles: ['./vitest.setup.ts']
}
});
// vitest.setup.ts
if(!global.jest) {
global.jest = vi;
}

當然也有一些 Jest 中一些比較特殊的 API 在 vitest 中并沒有支持,這里后續(xù)會做介紹,然后就是相關(guān)的類型聲明調(diào)整,vitest 的一些通用類型和 Jest 還是有一些區(qū)別,例如返回值的類型是相反的:

// jest
let jestFn: jest.Mock<string, [number]>
let jestFn: jest.SpyInstance<string, [number]>
// vitest
import type { SpyInstance, Mock } from 'vitest';
let vitestFn: Mock<string, [number]>
let vitestFn: SpyInstance<string, [number]>

這點可以具體參考 vitest 的遷移文檔相關(guān)說明即可。

alias 相關(guān)配置替換

一般如果你使用了 tsconfig 中的 paths 配置,在 jest 的中同樣需要需要通過配置來聲明別名配置,不然 jest 在測試的時候會無法識別項目中的路徑寫法,例如一般這樣配置:

// jest.config.js
module.exports = {
roots: ['<rootDir>/src'],
moduleNameMapper: {
'^src/(.*)': '<rootDir>/src/$1'
}
}

一般這一類別名的處理在 vitest 需要借助于 vite 的相關(guān)配置來完成:

// vitest.config.ts
import { defineConfig } from 'vitest/config';
import path from 'path';
export default defineConfig({
resolve: {
alias: {
src: path.resolve(__dirname, 'src')
}
}
})

這樣基本就等同于上面 jest 的別名處理,同樣的因為 vitest 的底層是基于 vite 在做的(源碼中使用到了 vite 的 createServer 方法),因此 vite 中很多配置都是可以等價進 vitest 中的。

snapshotSerializers 兼容

在 jest 中提供了 snapshot 的一些序列化的配置,例如:

// jest.config.js
module.exports = {
snapshotSerializers: ['jest-serializer-path']
}

在 vitest 對這一類庫的接口以及數(shù)據(jù)類型的導出都是兼容的,因此我們其實是可以直接在 vitest 中使用 jest 的對應的 snapshot 序列化相關(guān)的庫的,具體使用方法可以參考文檔: https://vitest.dev/guide/migration.html#migrating-from-jest

借助前面提到的 setup 文件的相關(guān)配置:

// vitest.setup.ts
import serializer from 'jest-serializer-path';
expect.addSnapshotSerializer(serializer);

遷移踩坑及 workaround

在上面一節(jié)中主要介紹了如果把項目從 jest 遷移到 vitest 整體上需要做哪些事情,但實際上做完這些事情之后你的項目還是跑不起來測試,這里筆者給大家談一下實際遷移過程中遇到的坑,希望可以對你有一些幫助。

庫的產(chǎn)物 CJS 引用出現(xiàn)拋錯

由于前面提到過 vitest 是一個以 ESM First 的測試框架,其實某種程度上來說,它并不是很支持 CJS 和 ESM 的一些混用情況,這里出現(xiàn)的問題是在于 monorepo 下有個子包產(chǎn)出的產(chǎn)物內(nèi)容是 cjs,因為 vitest 底層基于的 vite,vite 本身會使用 esbuild 去對一些庫文件去 transform,這里會把 cjs 的代碼當作 esm 去進行處理,然后就出現(xiàn)了這里的一個拋錯。

筆者這里處理的方式比較簡單,直接把 CJS 導出的包,產(chǎn)物改成了 ESM 格式,因為是在 Monorepo 內(nèi)部使用的包,這里修改并沒有特別大的風險。

不過筆者在社區(qū)中也看到有一些實踐者對 cjs 以及 esm 的混用情況提供了一些 workaround,具體可以參考這篇文章: https://blog.csdn.net/qq_21567385/article/details/124742193。

不過這里更建議的方式還是得先擁抱了 native esm 再去嘗試 vitest 會比較好一些。

跨 workspace 引用 const enum 拋錯

如果你當前的測試的包引用了其他包里面的一個 const enum 類型的變量,在 vitest 下進行 transform 的時候是會變成 undefined 的。舉個例子:

import { TestConst } from '@test/shared'
console.log(TestConst.TestA)
// @test/shared 包
export const enum TestConst {
TestA = 'test_a',
}

這里在 vitest 中進行測試的時候會拋錯: TypeError: Cannot read property 'TestA' of undefined 。

這里前面提到過,因為 vitest 底層基于的 transform 工具是 esbuild ,esbuild 目前看來并不支持從第三包導入的 const enum 的語句導入編譯,參考 issue: https://github.com/evanw/esbuild/issues/128。

在 vitest 的 discord 中和 vitest 的核心開發(fā)者溝通之后發(fā)現(xiàn)這個問題確實是 vite 本身的一些限制導致:

因此這里的解決方案其實也很簡單,直接修改第三包的 const enum 為 enum 就行,實際上并不會帶來特別大的體積損失,筆者這里因為是內(nèi)部的 Monorepo 包,因此調(diào)整也很簡單。

vi.mock 導致模塊 undefined

如果你在一個用到了 vi.mock() 的測試文件中導入了其他的方法并且在 mock 中使用了,很大程度上 在 mock 上你是拿不到這些方法的,舉例:

import { mocktest } from '../test-a';
describe('Test', () => {
it('xxx', async() => {
vi.mock('@test-shared', () => {
getTestFunc: vi.fn(),
mocktest
})
})
})

很大程度上這里會因為 mocktest 拿不到拋一個 ReferenceError ,具體也可以看 vitest 的相關(guān) issue: https://github.com/vitest-dev/vitest/issues/1336 。

vitest 的核心工作者給出的意見是在這種情況下使用 vi.doMock() 替換掉 vi.mock() ,因為 vi.mock() 會出現(xiàn)提升到頂層而忽略其他 import 的情況:

同樣的有一些其他的奇怪 mock 問題拋錯也可以使用該方法來解決,例如拋錯 ReferenceError: Cannot access '__vite_ssr_import_1__' before initialization ,參考 issue: https://github.com/vitest-dev/vitest/issues/1084 。

jest 的 isolateModules 模塊替換

這個 api 在 jest 中實際上比較冷門,因為 jest 實際上是在全局共享一些變量實例的,例如有一些模塊的 require 導入 mock,實際上是會在一個測試文件中的多個測試 case 共享的,因此想讓他們不共享的話,在 jest 中一般會使用 isolateModules 對這些模塊的導入做個隔離:

// xxx.test.ts
describe('test-case', () => {
let mod: typeof import('../src/test-case');
beforeEach(async () => {
jest.isolateModule(() => {
mod = require('../src/test-case');
})
})
})

而 vitest 中實際上因為 esm first 的特性,導致其文件之間的實例共享都是單獨隔離開的,如果需要在文件中對這樣的模塊導入 mock 做個隔離,可以使用 vi.resetModules() 這個方法,同樣也需要把 jest 中的 require 模塊導入修改成動態(tài) import 導入(ESM first):

// xxx.test.ts
describe('test-case', () => {
let mod: typeof import('../src/test-case');
beforeEach(async () => {
vi.resetModules();
mod = await import('../src/test-case');
})
})

這樣實際上就能解決問題了,同樣參考 vitest 核心貢獻者建議:

總結(jié)

總體來說,如果你想給你的新項目使用 vitest 或者將舊項目的測試方案從 jest 遷移到 vitest,筆者認為你可以從以下幾個方面著手:

  •  擁抱 native esm
  •  熟悉對應的遷移官方文檔
  •  參考 vite 倉庫的用法(unit test 及 e2e test 的使用)

本質(zhì)上 vitest 帶來的性能提升除了 vitest 研發(fā)團隊做的一些關(guān)于依賴圖的優(yōu)化,更大程度上還是來源于 esbuild 的高性能,如果 jest 使用 swc-jest 的 preset 配置來進行文件的 transform,可能從性能上并不一定會輸 vitest 很多,但 vitest 僅僅從配置的簡潔以及一些現(xiàn)代化的工具(例如 TS、JSX、ESM)的開箱即用,本質(zhì)上是要比臃腫的 jest 要靈活不少的。

雖然目前 vitest 還處于一個初期迭代階段,但由于 vite 本身的使用以及社區(qū)中的一些流行框架的使用,筆者覺得 vitest 本身已經(jīng)具備了在實際項目中使用的能力。

歡迎長按圖片加 ssh 為好友,我會第一時間和你分享前端行業(yè)趨勢,學習途徑等等。2022 陪你一起度過!

責任編輯:龐桂玉 來源: 前端從進階到入院
相關(guān)推薦

2009-03-31 09:49:40

Rational功能測試性能測試

2022-08-08 10:09:08

Vitest單元測試

2009-08-11 09:52:37

軟件測試測試工具

2021-10-12 19:16:26

Jest單元測試

2019-11-14 09:00:00

前端測試工具框架

2022-11-28 11:31:37

2009-10-09 16:43:36

服務器測試工具

2021-06-26 07:40:21

前端自動化測試Jest

2011-05-31 18:09:05

動態(tài)測試

2009-06-26 10:22:58

JSF測試

2023-05-18 14:01:00

前端自動化測試

2023-11-08 13:18:00

JestJavaScript框架

2023-11-27 17:40:45

VitestPlaywright前端

2022-01-24 16:55:09

LinuxTCP工具

2013-11-13 10:49:50

2011-05-31 18:25:25

測試工具

2010-06-04 16:31:33

Linux網(wǎng)絡測試

2023-12-27 07:35:29

HyBench數(shù)據(jù)字段

2019-02-26 08:30:48

2014-07-01 10:09:01

點贊
收藏

51CTO技術(shù)棧公眾號

国产亚洲午夜高清国产拍精品| 欧美日本二区| 欧美午夜精品久久久| 国产精品h视频| 婷婷开心激情网| 青青草原综合久久大伊人精品优势 | 欧美日韩尤物久久| 亚洲精品久久久久久国产精华液| 国产伦精品一区二区三区免| 中文字幕天堂在线| 在线观看一区| 日韩中文在线中文网三级| 成人做爰69片免费| 日韩毛片在线| 性久久久久久久久久久久| 日日夜夜精品网站| 日日夜夜精品免费| 久久国内精品自在自线400部| 国内精品久久久久伊人av| 99精品欧美一区二区| 岛国精品一区| 欧美精品高清视频| 国产一级不卡毛片| 交100部在线观看| 亚洲摸摸操操av| 日韩精品久久一区| 欧美 日韩 人妻 高清 中文| 精品亚洲porn| 国产精品日韩欧美大师| 日韩乱码一区二区| 亚洲国产一区二区三区在线播放| 亚洲人成电影在线观看天堂色| 久久久久久无码精品人妻一区二区| 四虎影视4hu4虎成人| 午夜av一区二区三区| wwwwww欧美| 黄色的网站在线观看| 国产人久久人人人人爽| 久久久99爱| 熟妇高潮一区二区三区| 国产精品一级黄| 成人午夜激情网| 一区二区三区亚洲视频| 日产国产高清一区二区三区| 欧洲亚洲免费视频| 日本韩国欧美中文字幕| 99伊人成综合| 韩国一区二区电影| 精品少妇一二三区| 好看不卡的中文字幕| 超在线视频97| 妺妺窝人体色www聚色窝仙踪| 久久精品久久久| 久久久999国产| 亚洲精品卡一卡二| 88国产精品视频一区二区三区| 在线观看久久av| 国产三级黄色片| 日韩av有码| www国产亚洲精品久久网站| 9.1片黄在线观看| 欧美激情成人| y97精品国产97久久久久久| 黄色裸体一级片| 97人人精品| 超碰精品一区二区三区乱码| 青娱乐国产在线| 亚洲激情另类| 人人澡人人澡人人看欧美| 色老头在线视频| 蜜臀av一区二区在线观看 | 99久久精品国产亚洲| 一本一道久久综合狠狠老精东影业| 97免费视频在线播放| 日韩不卡视频在线| 日韩1区2区日韩1区2区| 国产中文日韩欧美| 精品人妻一区二区三区四区不卡 | 日韩片在线观看| 亚洲视频分类| 综合欧美国产视频二区| 东方av正在进入| 亚洲人成人一区二区三区| 91精品国产精品| 久久久久亚洲视频| 国产精品一二一区| 欧美黄色直播| 日韩在线观看www| 亚洲最大成人综合| 欧美牲交a欧美牲交aⅴ免费真| 九九久久国产| 精品福利av导航| 国产黄色大片免费看| 综合天天久久| 青青久久av北条麻妃黑人| 91精品在线视频观看| 成人网在线免费视频| 日韩精品一区二区三区四区五区| 麻豆av在线免费看| 欧美日韩精品中文字幕| www.se五月| 欧亚精品一区| 日日噜噜噜夜夜爽亚洲精品| 免费在线一级片| 免费成人在线影院| 国产综合18久久久久久| 日日夜夜精品一区| 欧美性猛交xxxxx水多| 色噜噜狠狠一区二区三区狼国成人| 国产精品自在| 日韩视频精品在线| 国产亚洲欧美在线精品| 国产乱码精品一区二区三区忘忧草| 九九九热999| 91最新在线视频| 色噜噜狠狠成人网p站| 国产大学生av| 国产精品久久久久久久久妇女 | 97精品国产综合久久久动漫日韩| 日韩欧美中文字幕公布| 精品人妻中文无码av在线 | 国产欧美日韩一区二区三区四区 | 都市激情亚洲一区| 精品国产自在久精品国产| 日本黄区免费视频观看| 免费精品视频| 国产日韩亚洲精品| 中文字幕在线观看网站| 精品视频在线视频| 国产三级av在线播放| 日韩午夜高潮| 国产精品一区二区三区精品 | 亚洲欧洲综合另类| 欧美三级理论片| 精品成人影院| 日本精品性网站在线观看| 日韩性xxxx| 亚洲高清在线精品| 最新日本中文字幕| 欧美日本国产| 成人性色av| 男女在线视频| 精品成人免费观看| 日本少妇激情舌吻| 成人av电影在线播放| 91.com在线| 亚洲日本va午夜在线电影| 欧美大奶子在线| 精品国产av 无码一区二区三区| 中文字幕制服丝袜成人av| 美女一区二区三区视频| 欧美美女视频| 国产精品久久久久免费a∨大胸| 巨骚激情综合| 欧洲一区二区三区在线| 无码少妇一区二区| 免费观看久久久4p| 在线播放 亚洲| 麻豆国产一区| 久久久久久国产精品三级玉女聊斋| 午夜精品久久久久久久99| 亚洲精品欧美专区| 2一3sex性hd| 久久久久网站| 亚洲人一区二区| 国产亚洲久久| 欧美激情啊啊啊| 婷婷开心激情网| 欧美影视一区二区三区| avhd101老司机| 国产专区综合网| 日本精品福利视频| 久久九九热re6这里有精品| 91高清免费视频| 1769在线观看| 日韩欧美在线一区二区三区| 亚洲精品午夜久久久久久久| 91视频精品在这里| 国产日韩欧美久久| 欧美日韩免费| 欧美成熟毛茸茸复古| 欧美日韩va| 久久久久久久久爱| 国产在线视频网站| 日韩一区二区三区在线| 国产精品suv一区二区三区| 国产精品美女久久久久久2018| 三级黄色片播放| 久久久久欧美精品| 青青草综合在线| 狠狠做六月爱婷婷综合aⅴ| 成人欧美在线视频| 成人三级高清视频在线看| 伊人一区二区三区久久精品| 国产99久一区二区三区a片 | 色综合久综合久久综合久鬼88| 五月婷婷综合久久| 9191成人精品久久| 青青草免费观看视频| 亚洲少妇最新在线视频| 亚洲av无码国产精品久久| 久久99国内精品| 国产h视频在线播放| 亚洲不卡av不卡一区二区| 久久久久久久久久久一区| 成人亚洲精品| 国产精品精品视频| a级大胆欧美人体大胆666| 日韩性xxxx爱| 三级视频网站在线| 欧美一区二区视频在线观看2022 | 欧美精品成人一区二区三区四区| 久久久久久久极品内射| 国产精品全国免费观看高清| 日本一级片在线播放| 国模娜娜一区二区三区| 99视频精品免费| 影音国产精品| 佐佐木明希av| 色琪琪久久se色| 日本不卡二区高清三区| 欧美大胆a级| 91传媒视频在线观看| 在线成人免费| 国产美女久久久| а√天堂资源国产精品| 欧美在线免费看| av中文在线资源库| 欧美国产日韩一区二区| 毛片网站在线免费观看| 国产亚洲a∨片在线观看| 台湾av在线二三区观看| 精品国产91洋老外米糕| www.黄色国产| 日韩精品一区二| 亚洲AV无码成人片在线观看| 4438x亚洲最大成人网| 中文字幕在线观看你懂的| 在线观看成人小视频| 国产成人自拍偷拍| 在线精品视频免费观看| 无码人妻精品一区二| 日韩欧美成人免费视频| 欧美一区二区三区四| 黄色成人在线播放| 综合激情网五月| 欧美性高跟鞋xxxxhd| 亚洲不卡视频在线观看| 欧美性生活大片免费观看网址| 国产午夜精品久久久久| 欧美日韩中文字幕在线视频| 国产免费观看av| 一本久久a久久免费精品不卡| av网站中文字幕| 色欧美片视频在线观看| 国产一级精品毛片| 欧美日韩亚洲综合一区| 91影院在线播放| 欧美一卡二卡三卡四卡| 亚洲精品视频网| 亚洲国产精久久久久久| 欧洲天堂在线观看| 中文字幕精品久久久久| 国产1区2区3区在线| 日韩有码片在线观看| 欧美成人视屏| 欧美黄色片视频| ririsao久久精品一区| 久久久久久久久爱| 欧美三区四区| 国产精品久久久久久久久久久不卡 | 国产成人精品久久二区二区| 国产人妖一区| 91gao视频| 亚洲最大在线| 久久久一二三四| 亚洲久久一区| 天天干在线影院| 国产成人av一区二区三区在线 | 成人欧美一区二区三区| 免费一级肉体全黄毛片| 色呦呦国产精品| 国产精品毛片久久久久久久av| 精品少妇一区二区三区免费观看| 青青草在线播放| 久久成人综合视频| 涩涩网在线视频| 亚洲精品免费av| 亚洲美女久久| 综合一区中文字幕| 在线视频日韩| 91视频这里只有精品| 99久久夜色精品国产网站| 久久久免费看片| 亚洲成人精品在线观看| 中国老头性行为xxxx| 精品福利在线导航| 免费在线观看黄色| 欧美在线日韩在线| 91麻豆精品国产91久久久久推荐资源| 欧美精品在线一区| 国产精品多人| www.99r| 国产午夜三级一区二区三| 免费在线看黄网址| 欧美欧美欧美欧美| 精品视频三区| 国内偷自视频区视频综合| 久久久久伊人| 欧美日韩无遮挡| 韩国av一区| 午夜xxxxx| 中文字幕+乱码+中文字幕一区| 中文字幕在线字幕中文| 欧美一区二区三区在线| 成人高清网站| 555www成人网| 草莓视频一区二区三区| 中文字幕一区二区三区5566| 老牛嫩草一区二区三区日本| 国产情侣久久久久aⅴ免费| 最新日韩av在线| 中文av免费观看| 亚洲欧美日韩精品| 国产资源在线观看入口av| 51国偷自产一区二区三区| 欧美aaaa视频| 亚洲欧美视频二区| 欧美国产视频在线| 国产99免费视频| 亚洲女成人图区| 小视频免费在线观看| 国产精品手机在线| 韩国自拍一区| 久久国产劲爆∧v内射| 亚洲欧美日韩国产成人精品影院| 亚洲一区中文字幕永久在线| 一区二区成人av| 嫩草伊人久久精品少妇av杨幂| 日韩av不卡在线播放| 麻豆成人精品| 在线小视频你懂的| 欧美性感一类影片在线播放| 免费黄色片在线观看| 国产精品91久久久久久| 精品成人影院| 91插插插插插插插插| 国产精品国产三级国产普通话蜜臀| 波多野结衣理论片| 视频在线观看99| 91麻豆精品一二三区在线| 自拍偷拍视频在线| 国产一区二区三区av电影| 欧美日韩精品在线观看视频| 日韩亚洲国产中文字幕欧美| 欧美家庭影院| 精品一区久久| 天堂影院一区二区| 国产第一页精品| 欧美一区二区三区男人的天堂| 欧美78videosex性欧美| 久久99九九| 轻轻草成人在线| 破处女黄色一级片| 精品少妇一区二区三区免费观看| av剧情在线观看| 日本一区二区精品视频| 久久精品久久久精品美女| 国产盗摄x88av| 国产丝袜一区二区三区| 惠美惠精品网| 欧美日韩视频免费在线观看| 国产风韵犹存在线视精品| 国产性xxxx高清| 一区二区中文字幕| 秋霞影院一区| 国产精品-区区久久久狼| 国产精品美女久久久久久久久久久| 国产高清免费av| 日本久久精品视频| 九九这里只有精品视频| 欧美视频精品一区| 中文字幕在线免费| 国产精品一区二区免费| 日韩成人dvd| 久久久精品国产sm调教| 亚洲人成在线观看网站高清| 97久久精品一区二区三区的观看方式| 妞干网视频在线观看| 久久精品一二三| 亚洲国产精品久久人人爱潘金莲| 日韩av快播网址| 欧美在线高清| www色com| 亚洲第一页自拍| av在线播放一区二区| 国产亚洲天堂网| 怡红院av一区二区三区| 国产私拍精品| 精品无人乱码一区二区三区的优势 |