国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

【W(wǎng)eb技術(shù)】1320- 一篇文章搞定前端單元測試框架 Jest

共 9813字,需瀏覽 20分鐘

 ·

2022-05-16 04:22

前言

雖然有很多前端團(tuán)隊(duì)壓根現(xiàn)在甚至未來都不太可能使用單元測試,包括我自己的團(tuán)隊(duì),原因無非是耽誤時(shí)間,開發(fā)任務(wù)本身就比較重等等理由。

但是我覺得一味的圖快,永遠(yuǎn)是飲鴆止渴,陷入惡性循環(huán),項(xiàng)目快 \--> 代碼爛 \--> 修改和加功能花費(fèi)更多的時(shí)間和精力 \--> 來不及做優(yōu)化必須更快 \--> 項(xiàng)目快 \--> 代碼爛 \--> ... 無限循環(huán)。

這就是做單元測試我認(rèn)為最重要的原因就是,重構(gòu)代碼時(shí),確認(rèn)功能沒有問題,不怕人員流動(dòng),功能遷移,最主要的是跟產(chǎn)品撕b,測試用例就是最好的證據(jù)??。

業(yè)務(wù)項(xiàng)目用不到的話,如果你寫庫,不寫單測,可能用的同學(xué)都會有所顧忌,所以會寫單測是對高級以上前端必備的技能。

單元測試框架基本原理

例如如下的一個(gè)測試用例,感受一下基本的樣子長啥,我們后面會把其中用到的方法自己實(shí)現(xiàn)一個(gè)簡單版本

//?意思是字符串hello是否包含ll
test('測試字符串中是否包含?ll'),?()?=>?{
????expect(findStr('hello')).toMatch('ll')
})

function?findStr(str){
????return?`${str}?world`
}
復(fù)制代碼

我們可以簡單的實(shí)現(xiàn)一下上面測試用例用到的方法,test、expect、toMatch,這樣就算掌握了基本的測試框架原理

test

function?test(desc,?fn){
????try{
????????fn();
????????console.log(`???通過測試用例`)
????}catch{
????????console.log(`??沒有通過測試用例`)
????}
}
復(fù)制代碼

expect、toMatch

function?expect(ret){
????return?{
????????toMatch(expRet){
????????????if(typeof?ret?===?'string'){?throw?Error('')?}
????????????if(!ret.includes(expRet)){?throw?Error('')?}
????????}
????}
}
復(fù)制代碼

jest基本配置

必備工具:

$?npm?i?-D?jest?babel-jest?ts-jest?@types/jest
復(fù)制代碼

參考配置jest.config.js,測試文件均放在tests目錄中:下面的testRegex表示匹配的tests文件夾下的以test或者spec結(jié)尾的jsx或者tsx文件

module.exports?=?{
??transform:?{
????'^.+\\.tsx?$':?'ts-jest',
??},
??testRegex:?'(/tests/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$',
??moduleFileExtensions:?['tsx',?'ts',?'js',?'jsx',?'json',?'node'],
};
復(fù)制代碼

最后在package.json的scripts中加入

{
????test:?"jest"
????//?如果要測試覆蓋率,后面加上--coverage
????//?如果要監(jiān)聽所有測試文件?--watchAll
}
復(fù)制代碼

匹配器

匹配器(Matchers)是Jest中非常重要的一個(gè)概念,它可以提供很多種方式來讓你去驗(yàn)證你所測試的返回值。舉個(gè)例子就明白什么是匹配器了。

這里的匹配器掃一眼即可,大概知道有那么回事,用的時(shí)候查你想要的匹配器就行,不用刻意去記憶。

相等匹配,這是我們最常用的匹配規(guī)則

test('two?plus?two?is?four',?()?=>?{
??expect(2?+?2).toBe(4);
});
復(fù)制代碼

在這段代碼中 expact(2 + 2) 將返回我們期望的結(jié)果,通常情況下我們只需要調(diào)用expect就可以,括號中的可以是一個(gè)具有返回值的函數(shù),也可以是表達(dá)式。后面的toBe 就是一匹配器。

下面列舉一些常用的匹配器:

普通匹配器

  • toBe:object.is 相當(dāng)于 ===
test('測試加法?3?+?7',?()?=>?{
??//?toBe?匹配器?matchers?object.is?相當(dāng)于?===
??expect(10).toBe(10)
})
復(fù)制代碼
  • toEqual:內(nèi)容相等,匹配內(nèi)容,不匹配引用
test('toEqual?匹配器',?()?=>?{
??//?toEqual?匹配器?只會匹配內(nèi)容,不會匹配引用
??const?a?=?{?one:?1?}
??expect(a).toEqual({?one:?1?})
})
復(fù)制代碼

與真假有關(guān)的匹配器

  • 真假
  • toBeNull:只匹配 Null
test('toBeNull?匹配器',?()?=>?{
??//?toBeNull
??const?a?=?null
??expect(a).toBeNull()
})
復(fù)制代碼

toBeUndefined:只匹配 undefined

test('toBeUndefined?匹配器',?()?=>?{
??const?a?=?undefined
??expect(a).toBeUndefined()
})
復(fù)制代碼

toBeDefined:與 toBeUndefined 相反,這里匹配 null 是通過的

test('toBeDefined?匹配器',?()?=>?{
??const?a?=?null
??expect(a).toBeDefined()
})
復(fù)制代碼

toBeTruthy:匹配任何 if 語句為 true

test('toBeTruthy?匹配器',?()?=>?{
??const?a?=?1
??expect(a).toBeTruthy()
})
復(fù)制代碼

toBeFalsy:匹配任何 if 語句為 false

test('toBeFalsy?匹配器',?()?=>?{
??const?a?=?0
??expect(a).toBeFalsy()
})
復(fù)制代碼

not:取反

test('not?匹配器',?()?=>?{
??const?a?=?1
??//?以下兩個(gè)匹配器是一樣的
??expect(a).not.toBeFalsy()
??expect(a).toBeTruthy()
})
復(fù)制代碼

數(shù)字

toBeGreaterThan:大于

test('toBeGreaterThan',?()?=>?{
??const?count?=?10
??expect(count).toBeGreaterThan(9)
})
復(fù)制代碼

toBeLessThan:小于

test('toBeLessThan',?()?=>?{
??const?count?=?10
??expect(count).toBeLessThan(12)
})
復(fù)制代碼

toBeGreaterThanOrEqual:大于等于

test('toBeGreaterThanOrEqual',?()?=>?{
??const?count?=?10
??expect(count).toBeGreaterThanOrEqual(10)?//?大于等于?10
})
復(fù)制代碼

toBeLessThanOrEqual:小于等于

test('toBeLessThanOrEqual',?()?=>?{
??const?count?=?10
??expect(count).toBeLessThanOrEqual(10)?//?小于等于?10
})
復(fù)制代碼

toBeCloseTo:計(jì)算浮點(diǎn)數(shù)

test('toBeCloseTo',?()?=>?{
??const?firstNumber?=?0.1
??const?secondNumber?=?0.2
??expect(firstNumber?+?secondNumber).toBeCloseTo(0.3)?//?計(jì)算浮點(diǎn)數(shù)
})
復(fù)制代碼

字符串

toMatch:匹配某個(gè)特定項(xiàng)字符串,支持正則

test('toMatch',?()?=>?{
??const?str?=?'http://www.zsh.com'
??expect(str).toMatch('zsh')
??expect(str).toMatch(/zsh/)
})
復(fù)制代碼

數(shù)組

toContain:匹配是否包含某個(gè)特定項(xiàng)

test('toContain',?()?=>?{
??const?arr?=?['z',?'s',?'h']
??const?data?=?new?Set(arr)
??expect(data).toContain('z')
})
復(fù)制代碼

異常

toThrow

const?throwNewErrorFunc?=?()?=>?{
??throw?new?Error('this?is?a?new?error')
}
test('toThrow',?()?=>?{
??//?拋出的異常也要一樣才可以通過,也可以寫正則表達(dá)式
??expect(throwNewErrorFunc).toThrow('this?is?a?new?error')
})
復(fù)制代碼

測試異步代碼

假設(shè)請求函數(shù)如下

const fethUserInfo = fetch('http://xxxx')
復(fù)制代碼

測試異步代碼有好幾種方式,我就推薦一種我認(rèn)為比較常用的方式

//?fetchData.test.js

//?測試promise成功需要加.resolves方法
test('the?data?is?peanut?butter',?async?()?=>?{
????await?expect(fethUserInfo()).resolves.toBe('peanut?butter');
});

//?測試promise成功需要加.rejects方法
test('the?fetch?fails?with?an?error',?async?()?=>?{
????await?expect(fethUserInfo()).rejects.toMatch('error');
});
復(fù)制代碼

作用域

jest提供一個(gè)describle函數(shù)來分離各個(gè)test測試用例,就是把相關(guān)的代碼放到一類分組中,這么簡單,看個(gè)例子就懂了。

//?分組一
describe('Test?xxFunction',?()?=>?{
??test('Test?default?return?zero',?()?=>?{
??????expect(xxFunction()).toBe(0)
??})

??//?...其它test
})

//?分組二
describe('Test?xxFunction2',?()?=>?{
??test('Pass?3?can?return?9',?()?=>?{
??????expect(xxFunction2(3)).toBe(9)
??})

??//?...其它test
})
復(fù)制代碼

鉤子函數(shù)

jest中有4個(gè)鉤子函數(shù)

  • beforeAll:所有測試之前執(zhí)行
  • afterAll:所有測試執(zhí)行完之后
  • beforeEach:每個(gè)測試實(shí)例之前執(zhí)行
  • afterEach:每個(gè)測試實(shí)例完成之后執(zhí)行

我們舉例來說明為什么需要他們。

index.js 中寫入一些待測試方法

export?default?class?compute?{
??constructor()?{
????this.number?=?0
??}
??addOne()?{
????this.number?+=?1
??}
??addTwo()?{
????this.number?+=?2
??}
??minusOne()?{
????this.number?-=?1
??}
??minusTwo()?{
????this.number?-=?2
??}
}
復(fù)制代碼

假如我們要 在 index.test.js 中寫測試實(shí)例

import?compute?from?'./index'

const?Compute?=?new?compute()

test('測試?addOne',?()?=>?{
??Compute.addOne()
??expect(Compute.number).toBe(1)
})

test('測試?minusOne',?()?=>?{
??Compute.minusOne()
??expect(Compute.number).toBe(0)
})
復(fù)制代碼
  • 這里兩個(gè)測試實(shí)例相互之間影響了,共用了一個(gè)computet實(shí)例,我們可以將const Compute = new compute()放在beforEach里面就可以解決了,每次測試實(shí)例之前先重新new compute

  • 同理,你想在每個(gè)test測試完畢后單獨(dú)運(yùn)行什么可以放入到afterEach

我們接著看一下什么情況下使用beforeAll,假如我們測試數(shù)據(jù)庫數(shù)據(jù)是否保存正確

  • 我們在測試最開始,也就是?beforeAll生命周期里,?新增1條數(shù)據(jù)到數(shù)據(jù)庫里
  • 測試完后,也就是?afterAll周期里,?刪除之前添加的數(shù)據(jù)
  • 最后利用全局作用域?afterAll?確認(rèn)數(shù)據(jù)庫是否還原成初始狀態(tài)

這里說到

//?模擬數(shù)據(jù)庫
const?userDB?=?[
??{?id:?1,?name:?'小明'?},
??{?id:?2,?name:?'小花'?},
]

//?新增數(shù)據(jù)
const?insertTestData?=?data?=>?{
??//?userDB,push數(shù)據(jù)
}

//?刪除數(shù)據(jù)
const?deleteTestData?=?id?=>?{
??//?userDB,delete數(shù)據(jù)
}

//?全部測試完
afterAll(()?=>?{
??console.log(userDB)
})

describe('Test?about?user?data',?()?=>?{

??beforeAll(()?=>?{
??????insertTestData({?id:?99,?name:?'CS'?})
??})
??afterAll(()?=>?{
??????deleteTestData(99)
??})

})
復(fù)制代碼

jest里的Mock

為什么要使用Mock函數(shù)?

在項(xiàng)目中,經(jīng)常會碰見A模塊掉B模塊的方法。并且,在單元測試中,我們可能并不需要關(guān)心內(nèi)部調(diào)用的方法的執(zhí)行過程和結(jié)果,只想知道它是否被正確調(diào)用即可,甚至?xí)付ㄔ摵瘮?shù)的返回值。此時(shí),就需要mock函數(shù)了。

Mock函數(shù)提供的以下三種特性,在我們寫測試代碼時(shí)十分有用:

  • 捕獲函數(shù)調(diào)用情況
  • 設(shè)置函數(shù)返回值
  • 改變函數(shù)的內(nèi)部實(shí)現(xiàn)

jest.fn()

jest.fn()是創(chuàng)建Mock函數(shù)最常用的方式。

test('測試jest.fn()',?()?=>?{
??let?mockFn?=?jest.fn();
??let?result?=?mockFn(1);

??//?斷言mockFn被調(diào)用
??expect(mockFn).toBeCalled();
??//?斷言mockFn被調(diào)用了一次
??expect(mockFn).toBeCalledTimes(1);
??//?斷言mockFn傳入的參數(shù)為1
??expect(mockFn).toHaveBeenCalledWith(1);
})
復(fù)制代碼

jest.fn()所創(chuàng)建的Mock函數(shù)還可以設(shè)置返回值,定義內(nèi)部實(shí)現(xiàn)返回Promise對象。

test('測試jest.fn()返回固定值',?()?=>?{
??let?mockFn?=?jest.fn().mockReturnValue('default');
??//?斷言mockFn執(zhí)行后返回值為default
??expect(mockFn()).toBe('default');
})

test('測試jest.fn()內(nèi)部實(shí)現(xiàn)',?()?=>?{
??let?mockFn?=?jest.fn((num1,?num2)?=>?{
????return?num1?*?num2;
??})
??//?斷言mockFn執(zhí)行后返回100
??expect(mockFn(10,?10)).toBe(100);
})

test('測試jest.fn()返回Promise',?async?()?=>?{
??let?mockFn?=?jest.fn().mockResolvedValue('default');
??let?result?=?await?mockFn();
??//?斷言mockFn通過await關(guān)鍵字執(zhí)行后返回值為default
??expect(result).toBe('default');
??//?斷言mockFn調(diào)用后返回的是Promise對象
??expect(Object.prototype.toString.call(mockFn())).toBe("[object?Promise]");
})
復(fù)制代碼

2. jest.mock()

fetch.js文件夾中封裝的請求方法可能我們在其他模塊被調(diào)用的時(shí)候,并不需要進(jìn)行實(shí)際的請求(請求方法已經(jīng)通過單測或需要該方法返回非真實(shí)數(shù)據(jù))。此時(shí),使用jest.mock()去mock整個(gè)模塊是十分有必要的。

下面我們在src/fetch.js的同級目錄下創(chuàng)建一個(gè)src/events.js

import?fetch?from?'./fetch';

export?default?{
??async?getPostList()?{
????return?fetch.fetchPostsList(data?=>?{
??????console.log('fetchPostsList?be?called!');
??????//?do?something
????});
??}
}
復(fù)制代碼
import?events?from?'../src/events';
import?fetch?from?'../src/fetch';

jest.mock('../src/fetch.js');

test('mock?整個(gè)?fetch.js模塊',?async?()?=>?{
??expect.assertions(2);
??await?events.getPostList();
??expect(fetch.fetchPostsList).toHaveBeenCalled();
??expect(fetch.fetchPostsList).toHaveBeenCalledTimes(1);
});
復(fù)制代碼

在測試代碼中我們使用了jest.mock('../src/fetch.js')去mock整個(gè)fetch.js模塊。如果注釋掉這行代碼,執(zhí)行測試腳本時(shí)會出現(xiàn)以下報(bào)錯(cuò)信息

從這個(gè)報(bào)錯(cuò)中,我們可以總結(jié)出一個(gè)重要的結(jié)論:

在jest中如果想捕獲函數(shù)的調(diào)用情況,則該函數(shù)必須被mock或者spy!

3. jest.spyOn()

jest.spyOn()方法同樣創(chuàng)建一個(gè)mock函數(shù),但是該mock函數(shù)不僅能夠捕獲函數(shù)的調(diào)用情況,還可以正常的執(zhí)行被spy的函數(shù)。實(shí)際上,jest.spyOn()jest.fn()的語法糖,它創(chuàng)建了一個(gè)和被spy的函數(shù)具有相同內(nèi)部代碼的mock函數(shù)。

上圖是之前jest.mock()的示例代碼中的正確執(zhí)行結(jié)果的截圖,從shell腳本中可以看到console.log('fetchPostsList be called!');這行代碼并沒有在shell中被打印,這是因?yàn)橥ㄟ^jest.mock()后,模塊內(nèi)的方法是不會被jest所實(shí)際執(zhí)行的。這時(shí)我們就需要使用jest.spyOn()。

//?functions.test.js

import?events?from?'../src/events';
import?fetch?from?'../src/fetch';

test('使用jest.spyOn()監(jiān)控fetch.fetchPostsList被正常調(diào)用',?async()?=>?{
??expect.assertions(2);
??const?spyFn?=?jest.spyOn(fetch,?'fetchPostsList');
??await?events.getPostList();
??expect(spyFn).toHaveBeenCalled();
??expect(spyFn).toHaveBeenCalledTimes(1);
})
復(fù)制代碼

執(zhí)行npm run test后,可以看到shell中的打印信息,說明通過jest.spyOn(),fetchPostsList被正常的執(zhí)行了。

快照

快照就是對你對比的數(shù)據(jù)會存一份副本,啥意思呢,我們舉個(gè)例子:

這是index.js

export?const?data2?=?()?=>?{
??return?{
????name:?'zhangsan',
????age:?26,
????time:?new?Date()
??}
}
復(fù)制代碼

index.test.js 中寫入一些測試實(shí)例

import?{?data2?}?from?"./index"

it('測試快照?data2',?()?=>?{
??expect(data2()).toMatchSnapshot({
????name:?'zhangsan',
????age:?26,
????time:?expect.any(Date)?//用于聲明是個(gè)時(shí)間類型,否則時(shí)間會一直改變,快照不通過
??})
})
復(fù)制代碼
  • toMatchSnapshot會將參數(shù)將快照進(jìn)行匹配
  • expect.any(Date) 用于匹配一個(gè)時(shí)間類型

執(zhí)行npm run test會生成一個(gè)__snapshots__文件夾,里面是生成的快照,當(dāng)你修改一下測試代碼時(shí),會提示你,快照不匹配。如果你確定你需要修改,按 u 鍵,即可更新快照。這用于UI組件的測試非常有用。

React的BDD單測

接下來我們看下react代碼如何進(jìn)行測試,用一個(gè)很小的例子來說明。

案例中引入了enzyme。_Enzyme_?來自 airbnb 公司,是一個(gè)用于 React 的 JavaScript 測試工具,方便你判斷、操縱和歷遍 React Components 輸出。

我們達(dá)成的目的是檢測:

  • 用戶進(jìn)入首頁,看到兩個(gè)按鈕,分別是counter1和counter2
  • 點(diǎn)擊counter1,就能看到兩個(gè)按鈕的文字部分分別是"counter1"和"counter2"

react代碼如下

import?React?from?'react';
function?Counter(){
????return?(
????????<ul>
????????????<li>
????????????????<button?id='counter1'?className='button1'>counter1button>

????????????li>
????????????<li>
????????????????<button?id='counter2'?className='button2'>counter2button>
????????????li>
????????ul>
????)
}
復(fù)制代碼

單測的文件:

import?Counter?from?xx;
import?{?mount?}?from?'enzyme';

describle('測試APP',()?=>?{
????test('用戶進(jìn)入首頁,看到兩個(gè)按鈕,分別是counter1和counter2,并且按鈕文字也是counter1和counter2',()=>{
????????const?wrapper?=?mount(<Counter?/>);
????????const?button?=?wrapper.find('button');
????????except(button).toHaveLength(2);
????????except(button.at(0).text()).toBe('counter1');
????????except(button.at(1).text()).toBe('counter2');
????})
})
復(fù)制代碼

Jest | 測試設(shè)置分類(describe)及作用域[1]

jest入門單元測試[2]


關(guān)于本文

作者:孟祥_成都

https://juejin.cn/post/7092188990471667749

瀏覽 46
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評論
圖片
表情
推薦
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 亚洲猛男操逼欧美国产视频| 成人无码激情| 一本色道久久综合熟妇人妻| 日韩精品| 这里都是精品| 天天日夜夜艹| 日本A在线观看| 国产精品宾馆在线| 一区二区三区四区成人| 成人中文字幕网站| 国产最新在线视频| 欧美大片视频| 黄色视频网站在线| 亚洲在线无码视频| 亚洲成人精品在线| 三级片网站在线播放| 91人妻无码精品一区二区三区| 狠狠色噜噜狠狠狠888| 黑人中文字幕| 色色网站免费| 黄色免费网站| AV电影在线观看| 国产欧美性爱| 日本不卡视频在线| 做爱视频无码| 亚洲女人视频| 无码福利视频| 成人精品一区日本无码网站suv| 国产一区二区不卡视频| 国产午夜福利视频在线观看| 日韩无码高清免费视频| 亚洲免费精品视频| 婷婷亚洲综合| 中文字幕一区在线观看| 人人看人人摸人人| 国产人人看| 亚洲电影av| 操少妇逼| 亚洲无码在线视频观看| 日韩无码视频免费| 精品码A片18| 人人看人人插| 国产精品无码无套在线照片 | 亚洲黄色免费观看| 日本A在线播放| 九九re精品视频在线观看| 国精产品一区二区三区在线观看| 性做久久久久久| 天天操嫩逼无套视频| 青草福利视频| 91精品久久久久久久| 欧美另类视频| 日逼综合网| 99超碰在线观看| 美女久久久| 无码国产一区二区三区四区五区| 婷婷五月天色色| 欧美一级欧美三级在线观看| 2019人人操| 日韩图色| 色欲欲www成人网站| 色鬼综合网| 國產精品777777777| 91国产精品在线| 热九九精品| 黄色视频大全在线观看| 99re这里只有精品6| 热久久最新地址| 国产AV综合网| 九九美女视频| 国产成人V在线精品一区| 欧美性爱内射| 久久黄色成人视频| 国内自拍网站| 婷婷在线影院| 国产黄色电影在线| 久草电影网站| 猛男大粗猛爽h男人味| 97精品超碰一区二区三区| 国产精品男女| 精品成人网| 东北老女人性爱视频| 欧美AAAAAAAA| 欧洲综合视频| 中文字幕无码观看| 国产a精品| 韩国三级HD久久精品| 一区二区三区在线观看免费| 日韩第1页| 久久中文字幕视频| 丁香五月婷婷久久| 久久久久久久97| 美女福利在线| 爱搞搞网| 丁香五月色情| 噜噜色色噜噜| 国产中文字幕在线播放| 韩国毛片| 精品人妻一区二区三区在| 青娱乐三级在线免| 小H片在线观看| 人人操人人摸人人射| 91精品国产人妻| 日韩特黄片| 亚洲狼人久久久精品| 一本久道视频一本久道| 亚洲AV女人18毛片水真多| 91精品国产一区三一| 17c白丝喷水自慰| 国产视频入口| 少妇无码在线观看| 日韩成人视频在线| 国产91在线亚洲| 三级久久久| 欧美成人h| 西西人体WW大胆无码| 五月丁香啪| 无码秘蜜桃一区二区| 一本到在线观看午夜剧场| 卡一卡二卡三| 日韩欧美一级A片| 色婷婷香蕉在线一区二区| 久久b| 婷婷五月天丁香在线| 99re国产视频| 欧美深夜福利| 操久| 91成人精品视频| 嫩BBB嫩BBB嫩BBBn嫩| 无码视频免费| 亚洲第一狼人综合网| 色AV网| 婷婷V亚洲V丁香月天V日韩V| 成人777777免费视频色| 日本AAAA片| 51国产黑料吃瓜在线入口| 亚洲久久久久久| av免费播放| 亚洲国产精品视频| 午夜性爽视频男人的天堂| 麻豆91精品91久久久停运原因| 久久草视频在线播放| 无码人妻一区二区三一区免费n狂飙| 无套内射无码| 亚洲国产成人91精品| 91久久精品视频| 黄频在线观看| 狠狠躁日日躁夜夜躁A片无码视频| 性感欧美美女| 色AV网| 东北老女人性爱视频| 国产视频入口| 黄色视频在线网站| 97超碰在| 日韩A级片| 亚洲va综合va国产va中文| 亚洲天堂美女| 中国丰满妇BBwBBwHD| 国产做爱视频| 操婊网| 少妇搡BBBB搡BBB搡澳门| 亚洲第一成人网站| 青操在线| 亚洲无码三级视频| 午夜69成人做爱视频网站| 91网站免费在线观看| 亲子乱AⅤ一区二区三区| 超碰大香蕉| 亚洲丁香五月激情| 又大又粗AV| 91人妻日韩人妻无码| 丁香五月婷婷五月天| 国模私拍视频| 国产日韩欧美在线观看| 安徽妇搡BBBB搡BBBB,另类老妇| 国产操逼网址| 三级AV网站| av怡红院| 欧美操B视频| 69午夜| 中文字幕免费av| 7799综合| 67194熟女| 怡红院成人网| free性欧美| 99免费小视频| 熟妇综合| 超碰91在线观看| 欧美天堂成人三级| AV777777| 国产亲子乱XXXXimim/| 国产不卡一区| 伊人网视频在线观看| 欧美日韩四区| av不卡在线观看| 91吴梦梦一区二区传媒| 在线超碰| gogogo高清在线观看免费直播中国 | 欧美专区一区| 四虎www| 囯产精品一区二区三区线一牛影视1| 国产成人在线免费视频| 国产精品毛片| 国产夫妻av| 亚洲精品久久久久毛片A级绿茶 | 天天爱av| 日韩一级无码特黄AAA片| 天堂成人| 国产亚洲色情| 日韩高清无码观看| 一本一道伊人99久久综| 国产精品秘久久久久久久久| 五月花在线视频| 青春草在线播放| Chinese搡老女人| 天天爽天天干| 猫咪亚洲AV成人无码电影| 久久99精品国产麻豆婷婷洗澡| 中文字幕网站在线观看| 国产美女做爱视频| 五月天开心网| 国产精品一级| 天天干夜夜操| 欧美久久性爱| 青青草精品| 中文字幕一区三区三A片密月| 天天日av| 久热国产精品| 高清无码在线免费观看| 大香蕉综合伊人| 女同久久另类99精品国产91 | 国产精品国产自产拍高清AV| 国产思思99re99在线观看| 先锋影音av资源站| 日韩成人无码AV| 六月丁香久久| 丁香网五月天| 一区二区三区四区免费| 91在线91| 国产丰满乱子伦无码| 欧美激情亚洲| 韩国日本美国免费毛片| 91三级片在线观看| 国产精品久久久久久久久久久久久久 | 成人午夜福利网站| 99精品视频北条麻妃国产版| 天堂在线观看av| 波多野结衣亚洲无码| 一本一道vs波多野结衣| 超碰福利导航| 操屄免费视频| 天天日天天日天天日| 一本加勒比HEZYO东京热无码 | 亚洲欧洲无码视频| HEZ-502搭讪绝品人妻系列| 99久久国内精品成人免费| 日本久久成人| 91精品久久久久久粉嫩| 亚洲美女喷水视频| 伊人久久大综合中文无码| 无套内射在线播放| 操屄小视频| 日本九九视频| 天堂中文在线资源| av无码免费在线观看| 亚洲AV无码精品成人| 国产成人视频| 免费在线观看内射| 爆草美女| 无码啪啪| 亚洲AV无码专区在线播放中文 | 波多野结衣高潮| 一级a免一级a做免费线看内裤的注意事项 | 日韩欧美一区二区三区不卡| 91视频第一页| 久久久久久AV| 骚骚网站| 美女操逼网站| 国产黄色大片| gogogo日本免费观看高清电视剧的注意| 精品码一区二在线观看| 国产成人无码区免费视频| 亚洲最新无码| 蜜桃久久久亚洲精品| 国内精品国产成人国产三级| 亚洲黄色小电影| 亚洲无码专区在线观看| 无码成人视频| 91AV电影网| 五月激情视频| 人人操夜夜爽| 亚洲精品国产av| 丁香四月婷婷| 91青青草在线| 免费毛片视频| h网站在线看| 国产视频你懂的| 巨爆乳肉感一区二区三区视频| 日本一级大片| 黄色视频免费看| 影音先锋色AV| 黄页网站在线免费观看| 久久亚洲AV无码午夜麻豆 | 成人a毛片| 在线看的av| 中文字幕精品无码一区二区| 欧美成人网站视频| 婷婷综合亚洲| 亚洲成人视频在线观看| 91蜜桃视频在线观看| 91狠狠综合久久久| 操逼视频下载| 久久穴| 欧美日韩中文在线视频| 国产精品无码专区AV免费播放 | 在线中文字幕亚洲| 99er热精品视频| 天天毛片| 91久久久久久久| 吴梦梦一区二区在线观看| 青草福利在线| 久久亚洲日韩天天做日日做综合亚洲 | 欧美一级AAA大片免费观看 | 青娱乐大香蕉| 成功精品影院| 成人网站在线免费| 亚欧精品久久久| 成人AV免费在线观看| 日韩无码黄色视频| 黄色成人网站免费在线观看| 西西444WWW无码视频软件功能介绍| 亚洲色老板| 国产老熟女高潮毛片A片仙踪林 | 伊人成人在线视频| 永久AV免费网站| 亚洲一二三| 国产久久久久久久久久| 91久久欧美极品XXXXⅩ| 影音先锋成人在线视频| 欧美精品久久久久久| 在线视频内射| 熟妇槡BBBB槡BBBB图| 日日碰狠狠添| 亚洲在线观看免费| 三级三级久久三级久久18| 狠狠躁夜夜躁人人爽视频| 欧美日韩爱爱| 成人国产片女人爽到高潮| 高清无码三级片在线观看| 在线免费观看黄片| 精品永久免费| 国产操B视频| 亚洲一级黄色大片| 无码国产精品一区二区免费式直播 | 中文一级片| 91无码人妻精品一区二区三区四| 色婷婷一区| 国产精品在线看| 国产精品久久久久久久久久王安宇 | 很很干在线视频| 亚洲精品字幕久久久久| 蜜桃av一区二区三区| 日韩精彩视频| 中文字幕11页| 久久精品无码一区二区无码性色 | 99精品偷自拍| 啪啪毛片| 高清无码高潮| H无码| 日韩一区二区无码视频| 一道本在线观看| 欧美色色视频| 娇小,学生,高潮,videos| 玖玖爱在线精品视频| 国产AV无码区亚洲| 色鬼综合| 先锋久久资源| 一区高清无码| 国产精品在线看| 91视频精品| 免费观看在线无码视频| 白虎高清无码大尺度免费在线观看 | ppypp电影频道| 国产高清黑人| 欧美视频中文字幕| 国产欧美日韩综合在线视频| 蜜桃视频一区| 欧美熟妇BBB搡BBB| www.国产豆花精品区| 亚洲性天堂| 2019中文字幕mv第三季歌词| 中文精品字幕人妻熟女| 操屄在线视频| 伊人中文字幕| 亚洲无码精品一区二区三区| 91国产精品视频在线| 亚洲VA| 天天操人人射| 在线观看黄色视频网站| 亚欧洲精品在线视频| 四虎Av| 91在线无精精品秘白丝| 91人妻人澡| 乱婬妺妺躁爽A片| 日本AA片视频| 欧美特级毛片| 91久久婷婷国产| 国产精品嫩草久久久久yw193| 欧美、日韩、中文、制服、人妻| 亚洲欧美日韩动漫| 亚洲成人性爱av| 亚洲精品无码视频在线观看| 国产成人小电影| 综合网久久| 欧美色视频一区二区三区在线观看| 欧美激情性爱网站| 中文字幕在线精品| 手机在线毛片| 91成人无码| jizzjizz欧美| 日本wwwwww| 欧美伊人网| 久久国产精品一区二区三区| 四川妇搡BBBB搡BBBB| 成人免费无码婬片在线观看免费 | 免费黄色视频网站| 欧美日韩国产免费观看成人片| 高清免费无码| 国产小电影在线| 国产91在线拍揄自揄拍无码九色| 操逼欧美| 在线免费观看亚洲| 熟妇操逼视频| 麻豆久久久| 最新国产精品| 国产性播放| 夜夜国自一区| 草草国产| 91AV天天在线观看| 精品人妻少妇| 国产做爱| 亚洲一区视频在线| 久9热| 中文字幕在线视频免费观看| 日韩porn| 天天日天天干天天操| 91人人爱| 国产秘精品区二区三区日本| 午夜黄片| 九九黄片| 色播av| 久久91人妻无码精品蜜桃HD| ThePorn人妻白浆| 日韩性爱片| 日韩免费Av| 久久成人片| 欧美性爱视频免费观看| 99久久国产视频| 亚洲婷婷在线| 99re这里| aV一区二区三区| 日本久久久久久久久视频在线观看| 亚洲电影av| 自拍偷拍亚洲无码| 在线观看视频日韩| 最近最好的2019中文| 国产乱码一区二区三区的区别| 91麻豆一区二区| 国产精品视频免费| 蜜芽AV在线| 日韩在线91| 俺来了俺去了www色官网| 暗呦网一区二区三区| 亚洲成人性爱视频| 国产免费性爱视频| 二区无码| 国产成人一级片| 中文字幕少妇| 亚洲一级二级片| 激情网页| 亚洲欧美日本在线观看| 大香蕉伊人综合在线| 久久黄色免费看| 三级黄色片| 精品一区二区三区视频| 欧美一区二区三区在线播放| 骚逼视频聊天记录| 中文字幕日韩人妻在线| 国产v在线观看| 国产成人V在线精品一区| 影音先锋成人资源AV在线观看| 囯产精品久久久久久久久| 北条麻妃AV在线播放| 亚洲AV片一区二区三区| 色婷婷视频在线观看| www.一区二区| 欧美日韩亚洲成人| 黄色香蕉网站| 黄网站在线观看| 欧美成人在线网站| 亚洲成人无码网站| 天堂网www| 国产偷拍精品视频| 国产精品久久久久毛片SUV| 日韩欧美操逼视频| 影音先锋成人在线视频| 久久成人在线视频| 久久精品99| 人人爽夜夜爽| 天堂一区在线观看| a黄色视频| 中文字幕视频在线免费观看| 最好看的MV中文字幕国语电影| 操东北女人逼| 亚洲少妇熟女| 高清免费在线中文Av| 亚洲国产熟妇综合色专区| 四川少扫搡BBw搡BBBB| 亚洲综合干| 操BBB操BBB| 欧美大胆视频| 日韩无码第一页| 九九无码视频| 91在线无码精品秘国产-百度| 欧美日韩国产成人综合| 噜噜噜噜射| 大香蕉75| 大香蕉人人| 日韩精品久久久久久久酒店| 九九韩剧网最新电视剧免费观看 | 东北老女人性爱视频| 日韩黄在线| 操B在线| 成人黄片视频| 强伦轩人妻一区二区三区四区| 天天干天天操天天爽| 女女女女女女BBBBBB手| 蜜桃一区二区中午字幕| 翔田千里珍藏版无码| 中文字幕不卡无码| 美女视频毛片| 影音先锋三级资源| 3DAV一区二区三区动漫| 天天色天天色| 91拍真实国产伦偷精品| 国产一级婬片A片AAA樱花| 人人摸人人操人人干| 偷拍视频图片综合网| 精品国产成人| 黄色大片AV在线| 成人网站在线免费看| 777Av| 香蕉一区二区| 亚洲精品18禁| 久久av一区二区三区观看| 免费观看高清无码视频| 精品无码一区二区| 91免费网站| 日本久久网站| 先锋影音成人| 日本爱爱网址| 污视频网站免费在线观看| 中文字幕成人在线播放| 日韩美在线视频| 少妇在线观看| 99视频网| 蜜桃传媒一区二区亚洲| 91啦丨露脸丨熟女色啦| 国产伦精品一区二区三区视频女 | 男人插女人网站| 日本天天色| 国产又黄又大又粗| 午夜操日在线| 欧美操B视频| 欧美在线网站| 国产色视频在线| 北条麻妃在线不卡| 精品无码一区二区Av蜜桃| 草草影院CCYYCOM屁屁影院合集限制影院 | 国产精品秘久久久久久| 久久综合17p| 欧美一区在线视频| 久久美女视频| 怡春院亚洲| 亚州在线中文字幕经典a| 黄色视频在线观看地址| 91AV久久| 欧美性爱天天| 欧美成人18| 日本A片在线观看| 丁香婷婷网| 狠狠狠久久久| 久操视频在线| 樱桃码一区二区三区| 五月婷婷六月激情| 日本高潮视频| 日本国产在线观看| 国产精品不卡一区二区三区| 性欧美欧美巨大69| 国产乱子伦真实精品!| 美女十八禁| 无码精品人妻一区二区| 久久日av| 国产嫩草久久久一二三久久免费观看| 亚洲成人一区二区| 亚洲成人av在线| 欧美日韩A| 亚洲一区二区三区在线| 天堂国产| 欧美又大又粗| 国产9熟妇视频网站| 成人午夜福利高清视频| 亚洲欧美日韩动漫| 婷婷五月中文| 成人综合在线观看| 精品无码AV一区二区三区| 在线观看中文字幕亚洲| 亚洲视频在线观看播放| 人妻少妇中文字幕久久牛牛| 国产免费看| 乱伦无码高清麻豆视频一区二区| 国产视频久久| 天天操B| 国产精品无码一区二区三区| 欧美午夜福利视频| 婷婷精品国产a久久综合| 亚洲成人福利| 91成人导航| 日韩无码www| 大香蕉精品在线视频| 熟妇人妻丰满久久久久久久无码 | 久久精品视频网站| 在线播放内射| 午夜麻豆| 亚洲第一大网站| 黄色免费一级片| 污视频网站在线观看| 欧美区亚洲区| 亚洲精品一区二区三区无码电影 | 国产剧情一区二区av在线观看| 日韩黄片| 国产高清AV| 亚洲日色| 午夜亚洲| 国产激情在线观看| 天堂无码| 大鸡巴午夜爽视频电影| 日日射人妻| 成人影视1-23| 日本操逼在线播放| 天堂亚洲AV无码精品成人| 日韩东京热中文字幕| 天美果冻麻豆国产一区| 人妻无码一二三区免费| 亚洲一区二区三区在线++中国| 乱码中文字幕日韩欧美在线| 天天搞天天曰在线观看| 成人夜间视频| 北条麻妃无码精品AV怎么看 | 69色色| 中文字幕无码A片| 91涩| 国产乱伦内射视频| 久热9| 国产高清中文字幕| 毛片资源| 国产无码黄片| 久操网址| 深夜福利18| 呦小BBBB小小BBBB| 狠狠婷婷| 小黄片在线| 无码免费婬AV片在线观看| 香蕉视频国产| 人人干人人草| 欧美色五月| 免费成人黄视频| 黑丝一区| 国产一级A片视频| 精品久久三级片| 国产一二三四| 精品日韩中文字幕| 欧美性爱18| 男女无套在线观看免费| 99久久婷婷| 操逼视频欧美| 久久停停| 亚洲第一色网| 亚洲免费三级片| 欧美成人网站在线观看| 97国产精品| 久久人妻免费视频| 亚洲欧美精品AAAAAA片| 免费A级| 国产亚洲网| 亚洲热视频在线观看| 日韩激情在线观看| 亚洲乱码中文字幕| 特级婬片A片AAA毛片AA做头| 色婷婷在线无码精品秘人口传媒 | 欧美成人三级在线播放| 好操吊| 91夜夜| 国精产品久拍自产在线网站| 水蜜桃91| 欧美色图在线播放| 一区二区视频免费| 日韩视频免费观看高清完整版在线观 | 国产精品一级| 韩国毛片基地久久| 久久日韩视频| A片黄色毛片| 北条麻妃AV观看| 精品9999| AV无码中文| 久久成人综合| 精品国产99| 日本黄色电影网站| 青青草人人| 思思精品在线| 国产在线拍揄自揄拍无码男男| aaa在线观看| 欧一美一婬一伦一区二区三区自慰, | av天天av无码av天天爽| 综合色五月| 四季AV之日韩人妻无码| www.97色| 亚洲无码在线免费视频| 久久99老妇伦国产熟女| 国产黄色在线视频| 欧美性生活| 3D动漫精选啪啪一期二期三期| 日韩视频在线观看一区| 国产亚洲精品久久久久久桃色| 91无码人妻精品一区二区蜜桃| 亚洲一区二区在线视频| 毛片在线观看网站| 日韩成人视频在线观看| 亚洲成人少妇老妇a视频在线| TokyoKot大交乱无码| 国产影视av| 国产亚洲成人综合| 一级操逼毛片| 久操视频在线免费观看| 人人爱人人插| 国产亚洲视频完整在线观看| 97精品人妻麻豆一区二区| 99久免费视频| 亚洲狼友视频| 午夜色婷婷| 欧美黄色免费看| 国产黄色电影| 色大香蕉伊人| 超碰九九热| 国产亚洲三级| 黄色视频网站国产| 中文字幕网站| 国产A片录制现场妹子都很多| 成人免费A片视频| 国产综合久久久777777色胡同| 亚洲精品视频免费观看| 臭小子晚上让你爽个够视频| 亚洲成人av在线| 日韩国产欧美精品一区| 东方AV免费在线观看| 黄片视频在线免费看| 国产三级小视频| 欧美va| 99久久九九| 亚洲黄色视频免费| 国产女人十八水真多| 亚洲伊人综合| 91成人| 青青操在线观看| 做爱视频网站18| 少妇性受XXXX黑人XYX性爽| 成人视频18+在线观看| 尤物在线| 国产久久久久久| 亚洲欧美在线综合| 水蜜桃视频在线播放| 在线观看黄视频| 极品AV| 欧美成人精品一区二区| 摸BBB槡BBBB搡BBB,,,,, | 成人亚洲视频| 欧洲精品在线观看| 夜夜嗨av无码一区二区三区| 91精品人妻一区二区三区四区 | 青青精品视频| 97一区| 日韩欧美精品一区二区| 青青草无码| 欧美爆操视频| 久久久久亚洲AV无码成人片| 久久足交| 国产高清自拍视频| 91视频导航| 日韩一级A| AAA成人| 日韩AV免费在线| 麻豆一区二区三区| 国产精品你懂的| 韩国精精品视频| 欧美va视频| 在线国产福利| 久久伊人大| 亚洲欧美成人在线| 精品无码在线观看视频| 一级黄色免费视频| 青草草在线| 久久大香| 99久久婷婷国产综合精品青牛牛| 婷婷无码成人精品俺来俺去| 999大香蕉| 搡BBBB搡BBB搡我瞎了| 日本三级网址| 伊大香蕉在线| 婷婷精品免费久久| 久久久国产91桃色一区二区三区 | 亚洲乱码精品久久久久..| 国产女人18毛片水真多18精品| 九九99电影| 樱桃Av| 午夜AV在线免费观看| 亚洲无码一级| 操逼日爱| 999在线视频| 中文在线免费看视频| 日韩欧美中文在线| www.日韩| 天堂综合网久久| 久久肏屄| 三级a片| 五月天激情爱爱| 亚洲中文字幕在线无码| 亚洲日韩欧美一区二区天天天 | 日韩性爱视屏| 日韩精品无码一区二区三区| 无码视频韩国| 成人操B视频| 国产精品无码久久久久成人app| 操人视频网站| 日韩免费一级| 中文字幕日韩精品人妻| 一级色色| 狠狠躁日日躁夜夜躁2022麻豆| 久久爆乳一区二区三区| 西西444大胆无码视频| 国产免费内射| 在线中文无码| 国产又爽又黄免费观看视频| 香蕉在线播放| 特级婬片A片AAA毛片AA做头| 日韩黄色电影网站| 免费69视频| 免费在线黄色视频| 天堂在线中文字幕| 国产精品96久久久久久| 熟妇操逼视频| 高清无码免费看| 四虎无码| A级视频网| 呦小性Free小U女HD| 亚洲免费成人网站| 一本到在线观看午夜剧场| 天堂视频在线观看亚洲美女| 婷婷成人综合| 亚洲婷婷五月| 影音先锋91视频| 激情视频免费在线观看| 国产综合第一页| 求毛片网址| 成人黄色电影在线| 日逼天堂| 丝瓜视频污APP| 啪啪视频在线观看| 久操福利| 4虎亚洲人成人网www| 天天日av| 国产资源在线观看| 脓肿是什么原因引起的,该怎么治疗| 996热re视频精品视频| 精品国产污污免费网站入口| 国产成人片| 欧美一级A片在免费看| 91人人看| 日韩精品| 中文字幕av网| 人人妻人人爱人人操| 国产熟女一区二区久久| 少妇搡BBBB搡BBB搡毛片少妇| 999免费视频| 男女操逼视频网站免费| 羽月希奶水饱胀在线播放| jjzz亚洲| 日韩一a| 国产肏屄| 亚洲精品在线视频| 黄色a在线|