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

通過構建自己的JavaScript測試框架來了解JS測試

新聞 前端
在當今的軟件開發中,單元/功能測試已成為軟件開發的組成部分。隨著Nodejs的出現,我們已經看到了許多超級JS測試框架的發布:Jasmine,Jest等。

測試(單元或集成)是編程中非常重要的一部分。在當今的軟件開發中,單元/功能測試已成為軟件開發的組成部分。隨著Nodejs的出現,我們已經看到了許多超級JS測試框架的發布:Jasmine,Jest等。

單元測試框架

這有時也稱為隔離測試,它是測試獨立的小段代碼的實踐。如果你的測試使用某些外部資源(例如網絡或數據庫),則不是單元測試。

單元測試框架試圖以人類可讀的格式描述測試,以便非技術人員可以理解所測試的內容。然而,即使你是技術人員,BDD格式的閱讀測試也會使你更容易理解所發生的事情。

例如,如果我們要測試此功能:

  1. function helloWorld() { 
  2.   return 'Hello world!'

我們會像這樣寫一個jasmine測試規范:

  1. describe('Hello world', () => { ① 
  2.   it('says hello', () => { ② 
  3.       expect(helloWorld())③.toEqual('Hello world!'); ④ 
  4.   }); 
  5. }); 

說明:

  1. describe(string, function) 
  2. it(string, function) 

安裝和拆卸

有時候為了測試一個功能,我們需要進行一些設置,也許是創建一些測試對象。另外,完成測試后,我們可能需要執行一些清理活動,也許我們需要從硬盤驅動器中刪除一些文件。

這些活動稱為“設置和拆卸”(用于清理),Jasmine有一些功能可用來簡化此工作:

  • beforeAll 這個函數在describe測試套件中的所有規范運行之前被調用一次。
  • afterAll 在測試套件中的所有規范完成后,該函數將被調用一次。
  • beforeEach 這個函數在每個測試規范之前被調用, it 函數已經運行。
  • afterEach 在運行每個測試規范之后調用此函數。

在Node中的使用

在Node項目中,我們在與 src 文件夾相同目錄的 test 文件夾中定義單元測試文件:

  1. node_prj 
  2.     src/ 
  3.         one.js 
  4.         two.js 
  5.     test/ 
  6.         one.spec.js 
  7.         two.spec.js 
  8.     package.json 

該測試包含規格文件,這些規格文件是src文件夾中文件的單元測試, package.json 在 script 部分進行了 test 。

  1.   ..., 
  2.   "script": { 
  3.       "test""jest" // or "jasmine" 
  4.     } 

如果 npm run test 在命令行上運行,則jest測試框架將運行 test 文件夾中的所有規范文件,并在命令行上顯示結果。

現在,我們知道了期望和構建的內容,我們繼續創建自己的測試框架。我們的這個框架將基于Node,也就是說,它將在Node上運行測試,稍后將添加對瀏覽器的支持。

我們的測試框架將包含一個CLI部分,該部分將從命令行運行。第二部分將是測試框架的源代碼,它將位于lib文件夾中,這是框架的核心。

首先,我們首先創建一個Node項目。

  1. mkdir kwuo 
  2. cd kwuo 
  3. npm init -y 

安裝chalk依賴項,我們將需要它來為測試結果上色: npm i chalk 。

創建一個lib文件夾,其中將存放我們的文件。

  1. mkdir lib 

我們創建一個bin文件夾是因為我們的框架將用作Node CLI工具。

  1. mkdir bin 

首先創建CLI文件。

在bin文件夾中創建kwuo文件,并添加以下內容:

  1. #!/usr/bin/env node 
  2.  
  3. process.title = 'kwuo' 
  4. require('../lib/cli/cli'

我們將hashbang設置為指向 /usr/bin/env node,這樣就可以在不使用node命令的情況下運行該文件。

我們將process的標題設置為“kwuo”,并要求文件“lib/cli/cli”,這樣就會調用文件cli.js,從而啟動整個測試過程。

現在,我們創建“lib/cli/cli.js”并填充它。

  1. mkdir lib/cli 
  2. touch lib/cli/cli.js 

該文件將搜索測試文件夾,在“test”文件夾中獲取所有測試文件,然后運行測試文件。

在實現“lib/cli/cli.js”之前,我們需要設置全局變量。

測試文件中使用了describe,beforeEach,beforeEach,afterAll,beforeAll函數:

  1. describe('Hello world', () => {  
  2.   it('says hello', () => {  
  3.     expect(helloWorld()).toEqual('Hello world!'); 
  4.   }); 
  5. }); 

但是在測試文件中都沒有定義。沒有ReferenceError的情況下文件和函數如何運行?因為測試框架在運行測試文件之前,會先實現這些函數,并將其設置為globals,所以測試文件調用測試框架已經設置好的函數不會出錯。而且,這使測試框架能夠收集測試結果并顯示失敗或通過的結果。

讓我們在lib文件夾中創建一個 index.js 文件:

  1. touch lib/index.js 

在這里,我們將設置全局變量并實現 describe , it , expectEach , beforeEach , afterAll , beforeAll 函數。

  1. // lib/index.js 
  2.  
  3. const chalk = require('chalk'
  4. const log = console.log 
  5. var beforeEachs = [] 
  6. var afterEachs = [] 
  7. var afterAlls = [] 
  8. var beforeAlls = [] 
  9. var Totaltests = 0 
  10. var passedTests = 0 
  11. var failedTests = 0 
  12. var stats = [] 
  13. var currDesc = { 
  14.   it: [] 
  15.  
  16. var currIt = {} 
  17.  
  18. function beforeEach(fn) { 
  19.   beforeEachs.push(fn) 
  20.  
  21. function afterEach(fn) { 
  22.   afterEachs.push(fn) 
  23.  
  24. function beforeAll(fn) { 
  25.   beforeAlls.push(fn) 
  26.  
  27. function afterAll(fn) { 
  28.   afterAlls.push(fn) 
  29.  
  30. function expect(value) { 
  31.   return { 
  32.  
  33.     // Match or Asserts that expected and actual objects are same. 
  34.     toBe: function(expected) { 
  35.       if (value === expected) { 
  36.         currIt.expects.push({ name: `expect ${value} toBe ${expected}`, status: true }) 
  37.         passedTests++ 
  38.       } else { 
  39.         currIt.expects.push({ name: `expect ${value} toBe ${expected}`, status: false }) 
  40.         failedTests++ 
  41.       } 
  42.     }, 
  43.  
  44.     // Match the expected and actual result of the test. 
  45.     toEqual: function(expected) { 
  46.       if (value == expected) { 
  47.         currIt.expects.push({ name: `expect ${value} toEqual ${expected}`, status: true }) 
  48.         passedTests++ 
  49.       } else { 
  50.         currIt.expects.push({ name: `expect ${value} toEqual ${expected}`, status: false }) 
  51.         failedTests++ 
  52.       } 
  53.     } 
  54.   } 
  55.  
  56. function it(desc, fn) { 
  57.   Totaltests++ 
  58.   if (beforeEachs) { 
  59.     for (var index = 0; index < beforeEachs.length; index++) { 
  60.       beforeEachs[index].apply(this
  61.     } 
  62.   } 
  63.   //var f = stats[stats.length - 1] 
  64.   currIt = { 
  65.     name: desc, 
  66.     expects: [] 
  67.   } 
  68.   //f.push(desc) 
  69.   fn.apply(this
  70.   for (var index = 0; index < afterEachs.length; index++) { 
  71.     afterEachs[index].apply(this
  72.   } 
  73.   currDesc.it.push(currIt) 
  74.  
  75. function describe(desc, fn) { 
  76.   currDesc = { 
  77.     it: [] 
  78.   } 
  79.   for (var index = 0; index < beforeAlls.length; index++) { 
  80.     beforeAlls[index].apply(this
  81.   } 
  82.   currDesc.name = desc 
  83.   fn.apply(this
  84.   for (var index = 0; index < afterAlls.length; index++) { 
  85.     afterAlls[index].apply(this
  86.   } 
  87.   stats.push(currDesc) 
  88.  
  89. exports.showTestsResults = function showTestsResults() { 
  90.     console.log(`Total Test: ${Totaltests}     
  91. Test Suites: passed, total 
  92. Tests: ${passedTests} passed, ${Totaltests} total 
  93. `) 
  94.   const logTitle = failedTests > 0 ? chalk.bgRed : chalk.bgGreen 
  95.   log(logTitle('Test Suites')) 
  96.   for (var index = 0; index < stats.length; index++) { 
  97.     var e = stats[index]; 
  98.     const descName = e.name 
  99.     const its = e.it 
  100.     log(descName) 
  101.     for (var i = 0; i < its.length; i++) { 
  102.       var _e = its[i]; 
  103.       log(`   ${_e.name}`) 
  104.       for (var ii = 0; ii < _e.expects.length; ii++) { 
  105.         const expect = _e.expects[ii] 
  106.         log(`      ${expect.status === true ? chalk.green('√') : chalk.red('X') } ${expect.name}`) 
  107.       } 
  108.     } 
  109.     log() 
  110.   } 
  111.  
  112. global.describe = describe 
  113. global.it = it 
  114. global.expect = expect 
  115. global.afterEach = afterEach 
  116. global.beforeEach = beforeEach 
  117. global.beforeAll = beforeAll 
  118. global.afterAll = afterAll 

在開始的時候,我們需要使用chalk庫,因為我們要用它來把失敗的測試寫成紅色,把通過的測試寫成綠色。我們將 console.log 縮短為 log。

接下來,我們設置beforeEachs,afterEachs,afterAlls,beforeAlls的數組。beforeEachs將保存在它所附加的 it 函數開始時調用的函數;afterEachs將在它所附加的 it 函數的末尾調用;beforeEachs和afterEachs分別在 describe 函數的開始和結尾處調用。

我們設置了 Totaltests 來保存運行的測試數量, passTests 保存已通過的測試數, failedTests 保存失敗的測試數。

stats 收集每個describe函數的stats, curDesc 指定當前運行的describe函數來幫助收集測試數據, currIt 保留當前正在執行的 it 函數,以幫助收集測試數據。

我們設置了beforeEach、afterEach、beforeAll和afterAll函數,它們將函數參數推入相應的數組,afterAll推入afterAlls數組,beforeEach推入beforeEachs數組,等等。

接下來是expect函數,此函數進行測試:

  1. expect(56).toBe(56// 經過測試56預期會是56 
  2. expect(func()).toEqual("nnamdi"// 該函數將返回一個等于“nnamdi”的字符串 

expect 函數接受一個要測試的參數,并返回一個包含匹配器函數的對象。在這里,它返回一個具有 toBe 和 toEqual 函數的對象,它們具有期望參數,用于與expect函數提供的value參數匹配。 toBe 使用 === 將value參數與期望參數匹配, toEqual 使用 == 測試期望值。如果測試通過或失敗,則這些函數將遞增 passedTests 和 failedTests 變量,并且還將統計信息記錄在currIt變量中。

我們目前只有兩個matcher函數,還有很多:

  • toThrow
  • toBeNull
  • toBeFalsy
  • etc

你可以搜索它們并實現它們。

接下來,我們有 it 函數, desc 參數保存測試的描述名稱,而 fn 保存函數。它先對beforeEachs進行fun,設置統計,調用 fn 函數,再調用afterEachs。

describe 函數的作用和 it 一樣,但在開始和結束時調用 beforeAlls 和 afterAlls 。

showTestsResults 函數通過 stats 數組進行解析,并在終端上打印通過和失敗的測試。

我們實現了這里的所有函數,并將它們都設置為全局對象,這樣才使得測試文件調用它們時不會出錯。

回到“lib/cli/cli.js”:

  1. // lib/cli/cli.js 
  2. const path = require('path'
  3. const fs = require('fs'
  4. const { showTestsResults } = require('./../'

首先,它從“lib/index”導入函數 showTestsResult ,該函數將在終端顯示運行測試文件的結果。另外,導入此文件將設置全局變量。

讓我們繼續:

run 函數是這里的主要函數,這里調用它,可以引導整個過程。它搜索 test 文件夾 searchTestFolder ,然后在數組 getTestFiles 中獲取測試文件,它循環遍歷測試文件數組并運行它們 runTestFiles 。

  • searchTestFolder :使用 fs#existSync 方法檢查項目中是否存在“test/”文件夾。
  • getTestFiles :此函數使用 fs#readdirSync 方法讀取“test”文件夾的內容并返回它們。
  • runTestFiles :它接受數組中的文件,使用 forEach 方法循環遍歷它們,并使用 require方法運行每個文件。

kwuo文件夾結構如下所示:

測試我們的框架

我們已經完成了我們的測試框架,讓我們通過一個真實的Node項目對其進行測試。

我們創建一個Node項目:

  1. mkdir examples 
  2. mkdir examples/math 
  3. cd examples/math 
  4. npm init -y 

創建一個src文件夾并添加add.js和sub.js

  1. mkdir src 
  2. touch src/add.js src/sub.js 

add.js和sub.js將包含以下內容:

  1. // src/add.js 
  2. function add(a, b) { 
  3.     return a+b 
  4.  
  5. module.exports = add 
  6.  
  7. // src/sub.js 
  8. function sub(a, b) { 
  9.     return a-b 
  10.  
  11. module.exports = sub 

我們創建一個測試文件夾和測試文件:

  1. mkdir test 
  2. touch test/add.spec.js test/sub.spec.js 

規范文件將分別測試add.js和sub.js中的add和sub函數

  1. // test/sub.spec.js 
  2. const sub = require('../src/sub'
  3. describe("Subtract numbers", () => { 
  4.   it("should subtract 1 from 2", () => { 
  5.     expect(sub(21)).toEqual(1
  6.   }) 
  7.    
  8.   it("should subtract 2 from 3", () => { 
  9.     expect(sub(32)).toEqual(1
  10.   }) 
  11. }) 
  12.  
  13. // test/add.spec.js 
  14. const add = require('../src/add'
  15. describe("Add numbers", () => { 
  16.   it("should add 1 to 2", () => { 
  17.     expect(add(12)).toEqual(3
  18.   }) 
  19.    
  20.   it("should add 2 to 3", () => { 
  21.     expect(add(23)).toEqual(5
  22.   }) 
  23. }) 
  24. describe('Concat Strings', () => { 
  25.   let expected; 
  26.   beforeEach(() => { 
  27.     expected = "Hello"
  28.   }); 
  29.    
  30.   afterEach(() => { 
  31.     expected = ""
  32.   }); 
  33.    
  34.   it('add Hello + World', () => { 
  35.     expect(add("Hello""World")) 
  36.       .toEqual(expected); 
  37.   }); 
  38. }); 

現在,我們將在package.json的“script”部分中運行“test”以運行我們的測試框架:

  1.   "name""math"
  2.   "version""1.0.0"
  3.   "description"""
  4.   "main""index.js"
  5.   "scripts": { 
  6.     "test""kwuo" 
  7.   }, 
  8.   "keywords": [], 
  9.   "author""Chidume Nnamdi <kurtwanger40@gmail.com>"
  10.   "license""ISC" 

我們在命令行上運行 npm run test ,結果將是這樣的:

看,它給我們展示了統計數據,通過測試的總數,以及帶有“失敗”或“通過”標記的測試套件列表。看到通過的測試期望“add Hello + World”,它將返回“HelloWorld”,但我們期望返回“Hello”。如果我們糾正它并重新運行測試,所有測試都將通過。

  1. // test/add.spec.js 
  2. ... 
  3. describe('Concat Strings', () => { 
  4.   let expected; 
  5.   beforeEach(() => { 
  6.     expected = "Hello"
  7.   }); 
  8.    
  9.   afterEach(() => { 
  10.     expected = ""
  11.   }); 
  12.    
  13.   it('add Hello + World', () => { 
  14.     expect(add("Hello""")) 
  15.       .toEqual(expected); 
  16.   }); 
  17. }); 

 

看,我們的測試框架像Jest和Jasmine一樣工作。它僅在Node上運行,在下一篇文章中,我們將使其在瀏覽器上運行。

代碼在Github上

Github倉庫地址: philipszdavido/kwuoKwuo

你可以使用來自NPM的框架:

  1. cd IN_YOUR_NODE_PROJECT 
  2. npm install kwuo -D 

將package.json中的“test”更改為此:

  1.   ... 
  2.   "scripts": { 
  3.     "test""kwuo" 
  4.     ... 
  5.   } 

總結

我們建立了我們的測試框架,在這個過程中,我們學會了如何使用全局來設置函數和屬性在運行時任何地方可見。

我們看到了如何在項目中使用 describe 、 it 、 expect 和各種匹配函數來運行測試。下一次,你使用Jest或Jasmine,你會更有信心,因為現在你知道它們是如何工作的。

 

 

責任編輯:張燕妮 來源: segmentfault
相關推薦

2022-01-06 22:04:03

JavaScript語言開發

2023-01-31 16:35:34

JavaScript測試框架

2012-12-18 13:32:45

IBMdW

2023-09-13 11:40:12

2022-05-24 07:51:05

測試模型測試單元測試

2009-07-22 14:49:18

ibmdwPython測試

2011-06-03 17:06:09

自動化測試

2023-11-08 13:18:00

JestJavaScript框架

2017-08-10 14:04:25

前端JavaScript函數性能

2020-06-24 07:44:45

JavaScript開發代碼

2011-10-08 13:45:12

JavaScript

2015-09-06 10:58:36

PHP框架搭建結構

2020-01-10 15:57:03

JavaScript開發 技巧

2020-01-10 10:48:27

JavaScript框架StateOfJS

2017-05-16 16:28:21

互聯網

2009-06-22 15:52:15

JSF測試框架

2011-03-30 16:54:13

JUnit

2022-05-12 09:37:03

測試JUnit開發

2021-08-17 09:00:00

架構PythonWeb

2022-11-08 15:19:30

neovim插件lua
點贊
收藏

51CTO技術棧公眾號

99久久综合狠狠综合久久止| 日日摸夜夜添一区| www国产黄色| 在线a人片免费观看视频| 国产综合色产在线精品| 久久久久久美女| www.99热| 国产精品zjzjzj在线观看| 色综合久久久久综合体| 在线免费观看成人网| 欧美一区二区黄片| 久久爱www久久做| 2019中文字幕在线观看| 亚洲人与黑人屁股眼交| 婷婷综合福利| 欧美一卡在线观看| 久久久久免费精品| a级影片在线| 国产目拍亚洲精品99久久精品| 51国偷自产一区二区三区| 日韩一级在线视频 | 茄子视频成人在线观看| 精品人妻一区二区三区蜜桃| 日韩高清不卡一区二区三区| 久久久久久久久久av| a一级免费视频| 国模吧精品视频| 亚洲国产精品嫩草影院久久| 五月天婷婷影视| 成人久久网站| 日本丶国产丶欧美色综合| 99久久免费观看| 国产三区视频在线观看| 国产精品热久久久久夜色精品三区| 国产精品一码二码三码在线| 国产又粗又猛又黄| 日日摸夜夜添夜夜添精品视频 | 九七电影院97理论片久久tvb| 亚洲成人激情av| 国产精品videossex国产高清| 二区在线播放| 综合av第一页| 中文字幕在线亚洲精品| 欧美一级二级三级区| 欧美激情一区二区三区蜜桃视频| 裸模一区二区三区免费| 亚洲三级中文字幕| 91在线看国产| 久久综合狠狠综合久久综青草| 国产综合无码一区二区色蜜蜜| 国内精品国产三级国产a久久| 国产在线视频欧美| 国产精品嫩草影院精东| 精品亚洲porn| 91欧美精品成人综合在线观看| 一二三四区在线| 九色porny丨国产精品| 成人免费午夜电影| 国产精品呻吟久久| 国产美女久久久久| 99高清视频有精品视频| 精品人妻一区二区三区麻豆91| 国产成人无遮挡在线视频| www.成人av| 男人天堂一区二区| 91蜜桃免费观看视频| 免费一区二区三区在在线视频| 日本aaa在线观看| 国产无一区二区| 亚洲自拍三区| 在线中文免费视频| 亚洲成人av一区二区三区| 国产白丝袜美女久久久久| 欧美电影免费观看| 欧美三级乱人伦电影| 欧美男男青年gay1069videost| 美国av在线播放| 在线看三级电影| 五月婷婷欧美视频| 黄色高清无遮挡| 色综合视频一区二区三区日韩| 91精品国产综合久久久蜜臀图片| 欧美高清精品一区二区| 久久久久久毛片免费看 | 欧美日韩亚洲综合| 香蕉视频色在线观看| 超碰成人在线免费| 亚洲女人初尝黑人巨大| 老司机精品免费视频| 欧美福利在线| 91成品人片a无限观看| 亚洲综合成人av| 国产一区二区三区综合| 久久精品中文字幕一区二区三区| 阿v免费在线观看| 一区二区三区日韩欧美精品| 美女av免费在线观看| 日韩福利影视| 日韩av在线网址| 萌白酱视频在线| 日韩视频免费| 国产一区二区在线免费| 天堂av在线免费| 国产精品久久福利| 欧美变态另类刺激| 国产精品久久免费视频| 亚洲欧美在线免费| 久久综合久久鬼| 麻豆精品在线播放| 鲁鲁视频www一区二区| 久久综合网导航| 色94色欧美sute亚洲线路二| japan高清日本乱xxxxx| 日韩在线观看| 日韩美女视频免费在线观看| 国产成人久久精品77777综合| 久久久夜色精品亚洲| 国产欧美久久久久| 欧美91在线|欧美| 精品在线观看国产| 国产一级二级三级| 久久国产免费看| 欧美中文娱乐网| www.51av欧美视频| 日韩欧美视频在线| 青青操在线视频观看| 日韩黄色在线观看| 欧美成熟毛茸茸复古| 黑人玩欧美人三根一起进| 欧美日本一区二区| 亚洲无人区码一码二码三码的含义| 亚洲九九精品| 爱情岛论坛亚洲入口| 黄色一级大片在线免费看产| 欧美日韩一区二区三区免费看| 国产三级视频网站| 韩国自拍一区| 成人欧美一区二区三区视频 | 香蕉成人啪国产精品视频综合网 | 91香蕉视频在线| 日韩精品在线中文字幕| 亚洲国产精品免费视频| 久久久国产在线视频| 一级片免费观看视频| 中文欧美字幕免费| 国产一区二区在线免费播放| 成人情趣视频| 国产精品亚发布| 日本视频在线播放| 制服.丝袜.亚洲.另类.中文| 亚洲综合图片一区| 久久99久久99| 成人短视频在线看| 欧美片网站免费| 免费成人高清视频| 亚洲国产日韩在线观看| 亚洲一区二区三区四区中文字幕| 伊人影院在线观看视频| 亚洲黄色影院| 玛丽玛丽电影原版免费观看1977| 高清不卡亚洲| 伊人男人综合视频网| 欧美激情一区二区三区免费观看| 国产精品不卡视频| 中文字幕人妻无码系列第三区| 国产精品mm| 国产在线一区二区三区四区| 91av亚洲| 神马久久久久久| 精品国产无码一区二区三区| 亚洲va欧美va人人爽午夜| 黄色a一级视频| 日韩不卡免费视频| 欧美 亚洲 视频| 老司机精品视频在线播放| 日韩美女免费视频| 国产在线69| 亚洲成人亚洲激情| 亚洲av无码精品一区二区| 国产精品三级久久久久三级| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 欧美成人综合色| www.成人网.com| 亚洲精品一二三四五区| 91精品国产自产在线观看永久∴ | 日韩av手机在线看| 黄色片免费在线观看| 亚洲精品国产精品乱码不99按摩| 嫩草影院一区二区三区| 亚洲精选视频免费看| 日韩成人av一区二区| 日本aⅴ亚洲精品中文乱码| 特色特色大片在线| 中国av一区| 成人日韩av在线| 欧美三级网站| 久久视频国产精品免费视频在线| 手机看片福利在线| 欧美日韩高清影院| 久草国产精品视频| 亚洲视频免费在线观看| 一本加勒比北条麻妃| 国产一区二区久久| 日韩精品一区中文字幕| 狠狠综合久久| 一区二区三区不卡在线| 婷婷激情久久| 国产精品污www一区二区三区| 国产精品videossex撒尿| 97久久精品国产| 黄色网页在线看| 中文国产亚洲喷潮| 天堂在线资源网| 日韩午夜中文字幕| 在线观看一二三区| 色婷婷久久一区二区三区麻豆| 国产午夜手机精彩视频| 国产精品私房写真福利视频| 精品无码国产一区二区三区51安| 国产揄拍国内精品对白| 91小视频网站| 日韩中文字幕一区二区三区| 六月婷婷在线视频| 欧美视频一区| www.国产亚洲| 亚洲有吗中文字幕| 亚洲欧洲一区二区| 狠狠做六月爱婷婷综合aⅴ| 好吊色欧美一区二区三区视频| 日韩激情综合| 91在线观看免费观看| 丁香久久综合| 国产精品福利久久久| 香蕉伊大人中文在线观看| 久久久久久久999精品视频| 免费av网站在线看| 日韩网站在线观看| 91官网在线| 中文字幕久久久av一区| av大片在线观看| 在线观看视频亚洲| av网站无病毒在线| 在线观看成人黄色| 91官网在线| 久久久99免费视频| 日韩av毛片| 色综合老司机第九色激情| 在线视频观看国产| 欧美激情欧美狂野欧美精品| 不卡一本毛片| 98精品在线视频| 亚洲天堂av在线| 国产成人精品久久亚洲高清不卡| 天堂中文在线播放| 国产精品av电影| av成人在线播放| 成人网中文字幕| 日韩精品一区二区三区中文 | 视频二区在线| 亚洲欧美日韩中文视频| 东凛在线观看| 久久久精品视频成人| 91高清在线观看视频| 久久久久久久国产精品视频| 密臀av在线播放| 国产成人av网址| 91精品国产一区二区在线观看| 成人有码在线视频| 一本色道69色精品综合久久| 精品视频一区在线| 欧美日韩国产高清电影| 在线观看免费91| 欧美日韩综合| 日韩久久一级片| 免费观看成人av| 国产chinesehd精品露脸| 91在线视频网址| 国产成人精品视频免费| 一区二区三区资源| 亚洲欧美一区二区三区在线观看| 欧美日韩一区三区四区| 午夜久久久久久噜噜噜噜| 日韩经典第一页| 欧美激情午夜| 97激碰免费视频| 久久av日韩| 狠狠色综合色区| 久久一区二区三区喷水| 无码 制服 丝袜 国产 另类| 日韩av高清在线观看| 91精品人妻一区二区三区蜜桃2| av一区二区不卡| 小嫩苞一区二区三区| 午夜精品视频一区| 中文字幕第31页| 亚洲国产高潮在线观看| 尤物网在线观看| 欧美有码在线观看视频| 国产电影一区二区| 日本一区网站| 精品白丝av| 亚洲日本黄色片| 91免费视频网| 久久这里只有精品国产| 精品视频全国免费看| 日本人妻丰满熟妇久久久久久| 中文字幕亚洲在线| 三妻四妾完整版在线观看电视剧| 亚洲精品免费网站| 日韩精品影视| av免费播放网址| 国产91精品精华液一区二区三区 | 国产精品美女网站| 日韩aaa久久蜜桃av| 大陆极品少妇内射aaaaaa| 老司机免费视频一区二区三区| 亚洲欧美日本一区| 亚洲一区二区视频在线观看| 一级黄色大毛片| 亚洲午夜av久久乱码| 91桃色在线| www.久久爱.cn| 亚洲深深色噜噜狠狠爱网站| 污污动漫在线观看| 国产亚洲视频系列| 亚洲成人第一网站| 日韩精品免费在线视频| av今日在线| 国产精品一区二区av| 欧美1区2区3区| 亚洲综合伊人久久| 国产精品福利在线播放| 中文字幕视频一区二区| 国产一区二区三区欧美| 日本不卡一二三| 欧美日韩国产综合在线| 亚洲欧美日韩综合国产aⅴ| www.啪啪.com| 亚洲v日本v欧美v久久精品| 黄色一级大片在线免费看国产一 | 成人免费高清在线| 免费一级片视频| 精品国产青草久久久久福利| 人妖欧美1区| 国产精品久久久久免费| 在线看片欧美| 成人免费无码大片a毛片| 黄色精品在线看| 青青青草原在线| 国产激情久久久| 久久在线视频| 天天久久综合网| 一区二区三区波多野结衣在线观看| 国产av精国产传媒| 欧美激情二区三区| 蜜臀av一区| 妓院一钑片免看黄大片| 国产精品午夜春色av| 97超视频在线观看| 久久av在线看| 国产精品对白| 国产亚洲天堂网| 国产精品网站一区| 国产欧美第一页| 久久久久久久久综合| 无码日韩精品一区二区免费| 久久久久久三级| 亚洲视频网在线直播| 色呦呦中文字幕| 青青草原成人在线视频| 久久一区二区中文字幕| 亚洲v在线观看| 欧美性猛交xxxx久久久| 午夜免费视频在线国产| 亚洲精品欧美日韩专区| 99国产精品久久久久久久| 久久久视频6r| 欧美一级生活片| 国产传媒在线观看| 亚洲国产精品www| 国产不卡在线一区| 无码人妻一区二区三区线| 久久久精品一区二区三区| 精品成人自拍视频| 日日躁夜夜躁aaaabbbb| 午夜精品久久久久久久蜜桃app| 国产尤物视频在线| 99爱精品视频| 日本欧洲一区二区| 激情综合网五月天| 中文字幕av一区中文字幕天堂 | 欧美电影免费观看| 成人在线免费观看视频网站| 久久久影院官网| www.桃色av嫩草.com| 国产成人久久久| 尤物网精品视频| 亚洲欧美卡通动漫| 亚洲欧美在线磁力| 99re8这里有精品热视频8在线|