精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

在线亚洲午夜片av大片| 亚洲国产精品一区二区www| 国产精品高清网站| 波兰性xxxxx极品hd| 成人在线精品| 午夜a成v人精品| 日韩欧美亚洲在线| jizz中国女人| 久久一日本道色综合久久| 在线视频中文亚洲| 波多野结衣办公室双飞| 国产精品久久久久av电视剧| 一区二区三区在线视频免费观看| 欧美日韩一区二区三区在线观看免| 伊人久久国产精品| 亚洲精华国产欧美| 99成人在线视频| 中文字幕av一区 二区| 7777精品久久久大香线蕉小说| 好吊妞视频一区二区三区| 精品久久中文| 亚洲第一级黄色片| 日本在线观看视频一区| 欧美性猛交xxx高清大费中文| 亚洲精品免费一二三区| 神马一区二区影院| 亚洲区小说区图片区| 国产激情偷乱视频一区二区三区| 欧美一级大片视频| 久久精品国产亚洲av无码娇色 | 精品国产大片大片大片| 久9re热视频这里只有精品| 67194成人在线观看| 老司机午夜av| 一根才成人网| 精品久久久久久国产| 91麻豆天美传媒在线| av每日在线更新| 97久久超碰国产精品| 99re视频在线| av免费在线不卡| 韩国精品免费视频| 成人午夜在线观看| 中文字幕乱码一区二区| 日韩和欧美一区二区| 欧美做爰性生交视频| 青青草免费观看视频| 亚洲人成久久| 午夜精品视频网站| 五月婷婷开心网| 国产欧美综合一区二区三区| 午夜精品一区二区三区在线视| 国产小视频在线观看免费| 欧美福利网址| 欧美国产日本在线| 国产在线欧美在线| 伊人成人在线视频| 2019中文在线观看| 无码人妻精品一区二区蜜桃色欲| 国产一级视频在线观看| 精品视频一区二区三区| 在线成人午夜影院| 污视频在线观看免费网站| 久久天堂久久| 精品国产乱码久久久久久夜甘婷婷 | 欧美片第一页| 91久久免费观看| 国产精品涩涩涩视频网站| 日韩一级二级| 在线播放日韩导航| 可以看的av网址| 粉嫩av一区二区| 日韩精品一二三四区| 国产 欧美 在线| 91久久高清国语自产拍| 欧美精品制服第一页| 国产精彩视频在线| 久久精品道一区二区三区| 国产成人综合一区二区三区| 伊人22222| 成人免费福利片| 美女视频久久| 老司机在线视频二区| 亚洲一区二区视频| 日本三区在线观看| 精品99re| 日韩麻豆第一页| 男人天堂资源网| 国精品一区二区三区| 欧美在线日韩在线| 97精品人妻一区二区三区| 国产1区2区3区精品美女| 欧美大陆一区二区| 精品国产白色丝袜高跟鞋| 亚洲国产精品久久一线不卡| 免费观看精品视频| 国产成人免费视频网站视频社区| 亚洲激情 国产| 国产第一页精品| 亚洲无线视频| 国产精品视频导航| 欧美一级特黄aaaaaa| 巨大黑人极品videos精品| 久久精品国产一区二区| 国产精品一区免费观看| 国产视频在线看| 亚洲黄色小视频| 国产v亚洲v天堂无码久久久 | 1stkiss在线漫画| 日韩欧美主播在线| 天天爽人人爽夜夜爽| 成人精品毛片| 久久久91精品国产| 无码人妻精品一区二区三区蜜桃91| 国产精品99久久久久久似苏梦涵 | 亚洲va码欧洲m码| 久久久资源网| 一区二区三区中文字幕在线观看| 亚洲福利精品视频| 亚洲最大在线| 午夜精品久久久久久久99热| av网站免费播放| 中文字幕av一区二区三区高| 日本www在线播放| 2021年精品国产福利在线| 中文字幕日韩精品在线| 99热只有这里有精品| 成人深夜在线观看| 日本三级中文字幕在线观看| 日韩成人综合网| 在线观看精品自拍私拍| 国产九色在线播放九色| 成人午夜在线播放| 成年人视频网站免费| 亚洲在线资源| 中国人与牲禽动交精品| 国产一区二区视频免费| 91丨九色丨尤物| 999在线观看视频| 北条麻妃一区二区三区在线观看| 久久夜色撩人精品| 91麻豆成人精品国产免费网站| 久久久99精品久久| 国产精品-区区久久久狼| 给我免费播放日韩视频| 欧美高清一级大片| 亚洲国产成人精品一区二区三区| 亚洲综合一二区| 免费观看黄网站| 国产一区二区视频网站| 在线播放不卡| 国产精选一区二区| av中文字幕在线看| 亚洲福利视频网站| 欧美一区二区激情视频| 成人污视频在线观看| 欧美精品久久久久久久自慰| 精品五月天堂| 5252色成人免费视频| 亚洲av成人无码久久精品老人| 婷婷成人激情在线网| 催眠调教后宫乱淫校园| 国产日韩欧美一区二区三区在线观看| 国产日韩欧美一区二区三区四区| 538在线精品| 亚洲美女性视频| 午夜精品久久久久久久蜜桃| 日本一区免费视频| 中文字幕视频三区| 欧美激情四色| 精品视频第一区| 精品欧美一区二区三区在线观看| 夜夜嗨av色一区二区不卡| 亚洲系列第一页| 亚洲免费在线视频一区 二区| 日本亚洲一区二区三区| 在线亚洲成人| 亚洲aⅴ天堂av在线电影软件| 91久久青草| 国外视频精品毛片| 麻豆app在线观看| 欧美特级限制片免费在线观看| 黄色录像二级片| 岛国精品在线播放| 北条麻妃视频在线| 欧美成人国产| 久久久水蜜桃| 日韩黄色三级在线观看| 欧美激情一级二级| 麻豆av电影在线观看| 日韩三级精品电影久久久| 日韩av综合在线| 国产精品无人区| 免费在线观看日韩av| 久久久久久9| 国内自拍中文字幕| 天美av一区二区三区久久| 国产一区二中文字幕在线看| 福利写真视频网站在线| 中日韩美女免费视频网址在线观看| 亚洲av无码国产精品永久一区| 色综合久久久久网| 成人免费看片98| 精品国产一区一区二区三亚瑟| 欧美日韩小视频| 国产在线视频99| 中文av一区特黄| 国产熟女高潮一区二区三区| 激情文学综合插| 欧美成人黑人猛交| 激情综合激情| 在线国产伦理一区| 影视先锋久久| 成人综合电影| 日韩成人综合网| 国产精品xxx视频| 91福利在线免费| 久久成人精品视频| 97超碰人人在线| 日韩av最新在线观看| 国产av无码专区亚洲av| 在线观看不卡一区| 日韩激情综合网| 国产精品全国免费观看高清| 国产精品无码网站| 国产成人h网站| 国产乱码一区二区三区四区| 日韩精品一二三区| 毛片在线播放视频| 欧美午夜国产| 国产资源第一页| 91久久夜色精品国产按摩| 精品日本一区二区三区在线观看| 一区二区三区欧洲区| 91久久大香伊蕉在人线| 欧洲精品久久久久毛片完整版| 清纯唯美亚洲激情| 男人av在线播放| 69视频在线播放| 爱啪视频在线观看视频免费| 欧美国产日韩视频| 欧美日韩经典丝袜| 欧美成人合集magnet| 成人免费网站在线观看视频| 日韩中文在线中文网三级| av在线女优影院| 一区二区三区无码高清视频| h视频网站在线观看| 国产一区二区三区在线免费观看| 四虎在线免费观看| 亚洲欧美日韩另类| 黄视频在线播放| 亚洲一区二区久久| 自拍视频在线免费观看| 在线成人中文字幕| 麻豆免费在线观看| 久久久久999| 国产丝袜视频在线播放| 午夜剧场成人观在线视频免费观看| 欧美videossex| 26uuu另类亚洲欧美日本一| 麻豆视频在线看| 日本高清视频一区| 国产精品第一| 成人免费淫片aa视频免费| 午夜免费欧美电影| 国产一区二区三区黄| 久久不卡国产精品一区二区| 日本成人三级| 欧美一区网站| 黄色一级视频片| 日本特黄久久久高潮| 日本在线播放一区二区| 国产成人精品一区二区三区网站观看| 国产人成视频在线观看| 久久综合色8888| 在线观看天堂av| 亚洲最色的网站| 久久久久99精品成人片三人毛片| 色爱区综合激月婷婷| 一区二区三区精| 亚洲国产精品悠悠久久琪琪| 三级毛片在线免费看| 中日韩美女免费视频网址在线观看| 3d玉蒲团在线观看| 欧美在线亚洲在线| 9999精品视频| 精品一区二区不卡| 日韩一区二区在线| 欧美久久在线观看| 热久久久久久久| av在线天堂网| 亚洲国产高清aⅴ视频| 久久综合久久鬼| 欧美性视频一区二区三区| www.com欧美| 国产一区av在线| 丁香花在线影院| 国产精品日韩欧美| 欧美电影在线观看完整版| 日韩中文字幕av在线| 黄色在线成人| 少妇一级淫免费播放| 成人av先锋影音| 男人在线观看视频| 日韩欧美黄色动漫| 亚洲av无码乱码国产精品| 亚洲午夜久久久影院| av有码在线观看| 92看片淫黄大片看国产片| 精品国产视频| 浮妇高潮喷白浆视频| 国产精品91一区二区| 殴美一级黄色片| 色综合久久久久久久久久久| 国产小视频一区| 久久精品国产综合| 欧美三区四区| 免费在线观看一区二区| 国内在线观看一区二区三区| 天天操天天干天天做| 国产日韩欧美精品一区| 色婷婷在线观看视频| 欧美成人bangbros| 美女羞羞视频在线观看| 国产精品久久久av久久久| 亚洲三级性片| 91猫先生在线| 91亚洲国产成人精品一区二三 | 国产精品免费在线免费 | 欧洲美女精品免费观看视频| 欧美日韩系列| 久久综合婷婷| 亚洲国产无码精品| 婷婷一区二区三区| 天堂av资源网| 久久久亚洲网站| 99久久人爽人人添人人澡| 日本成人性视频| 国产美女精品一区二区三区| 可以免费看av的网址| 欧美色综合久久| 在线观看免费黄视频| 国产美女主播一区| 99精品视频在线观看播放| 无限资源日本好片| 欧美国产禁国产网站cc| 中国黄色一级视频| 日韩亚洲欧美成人| 亚洲人成网站在线在线观看| 成年人免费观看的视频| 国产传媒久久文化传媒| 一级黄色录像视频| 精品久久久久久久久久久院品网| 女人天堂av在线播放| 国产精品亚洲不卡a| 99精品视频网| 黄色aaa视频| 欧美日韩一区精品| 顶级网黄在线播放| www日韩av| 国产农村妇女毛片精品久久莱园子| 国产呦小j女精品视频| 色8久久人人97超碰香蕉987| 浮生影视网在线观看免费| 国产欧美精品日韩| 欧美激情91| 日b视频在线观看| 色婷婷久久一区二区三区麻豆| 成人午夜电影在线观看| 成人午夜两性视频| 亚洲激情成人| 日韩精品无码一区二区三区久久久| 在线观看亚洲精品| 老司机午夜在线| 国产一区免费在线| 老鸭窝91久久精品色噜噜导演| 亚洲一级理论片| 欧美xxxx老人做受| 国产精品一区二区av影院萌芽| 视频一区二区三| 国产成人免费视频一区| 日产精品久久久| 北条麻妃99精品青青久久| ccyy激情综合| 日本熟妇人妻中出| 一区二区三区**美女毛片| 欧美色图另类| 亚洲一区二区久久久久久 | 玖玖爱视频在线| 香蕉成人啪国产精品视频综合网| 第一福利在线| 国产精品自拍首页| 毛片av一区二区三区| 精品无码久久久久| 在线播放国产一区二区三区| 136福利精品导航| 性欧美1819| 精品国产999| 中日韩高清电影网|