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

對JavaScript進行單元測試的工具

開發 測試
有些開發人員抱怨 JavaScript 很難測試。隨著現在對 Web 應用程序客戶端的關注,對 JavaScript 進行單元測試就顯得尤為必要。現在,您可以使用工具來保證代碼的穩定性。在本文中,您將了解一些對 JavaScript 進行單元測試的最常用的工具:QUnit、YUI Test 和 JSTestDriver。本文將會通過代碼示例讓您了解這些樣測試用例樣例。

簡介

單元測試關注的是驗證一個模塊或一段代碼的執行效果是否和設計或預期一樣。有些開發人員認為,編寫測試用例浪費時間而寧愿去編寫新的模塊。然而,在處理大型應用程序時,單元測試實際上會節省時間;它能幫助您跟蹤問題并安全地更新代碼。

常用縮略語

DOM:文檔對象模型

HTML:超文本標記語言

JSTD:JSTestDriver

YUI:Yahoo! User Interface

在過去,只對服務器端語言進行單元測試。但前端組件越來越復雜,使得編寫 JavaScript 代碼測試用例的需求日益提高。如果您不經常編寫客戶端腳本的測試,學習進度可能非常難。測試用戶界面可能需要在思路上做一些調整。(有些程序開發人員一時半會還不能相信 JavaScript 是合適的編程語言。)

在本文中,您將學習如何使用 QUnit、YUI Test 和 JSTestDriver 對 JavaScript 進行單元測試。

下載 本文的源代碼。

JavaScript 單元測試

為了演示 JavaScript 測試,這一節將分析 JavaScript 中一個基本函數測試用例。清單 1 顯示了要測試的函數:將 3(作為一個數)添加到傳遞的變量中。

清單 1. 源代碼 (example1/script.js)

  1. function addThreeToNumber(el){  
  2.     return el + 3;  

清單 2 在自執行的函數中包含了測試用例。

清單 2.測試用例 (example1/test.js)

  1. (function testAddThreeToNumber (){  
  2.     var a = 5,  
  3.         valueExpected= 8;  
  4.    
  5.     if (addThreeToNumber (a) === valueExpected) {  
  6.         console.log("Passed!");  
  7.     } else {  
  8.         console.log("Failed!");  
  9.     }  
  10. }()); 

將 5 傳遞給測試的函數之后,測試檢查返回值是 8。如果測試成功,就會在一個現有瀏覽器的控制臺中打印出 Passed!;否則就會出現 Failed!。如果要運行測試,需要按照以下步驟進行操作:

1. 將兩個腳本文件導入作為測試運行程序的 HTML 頁面中,如清單 3 所示。

2. 在瀏覽器中打開頁面。

清單 3. HTML 頁面 (example1/runner.html)

  1. <!DOCTYPE html> 
  2. <html> 
  3.      <head> 
  4.          <meta http-equiv="Content-type" content="text/html; charset=utf-8"> 
  5.          <title>Example 1</title> 
  6.          <script type="text/javascript" src="js/script.js"></script> 
  7.           <script type="text/javascript" src="js/test.js"></script> 
  8.      </head> 
  9.      <body></body> 
  10. </html> 

您可以不使用瀏覽器控制臺,而是將結果打印在頁面或由 alert() 方法生成的彈出窗口中。

斷言是測試用例中的核心元素,用來驗證某一條件是否滿足。例如,在 清單 2 中,addThreeToNumber (a) === valueExpected 就是一個斷言。

如果您擁有很多用例并帶有很多斷言,那么使用框架就會方便很多。下面的內容將會重點介紹一些最流行的 JavaScript 單元測試框架:QUnitYUI Test 和 JSTestDriver

#p#

QUnit 入門

QUnit 是與 JUnit(Java 編程)類似的單元測試框架,jQuery 團隊用它來對 jQuery 庫進行單元測試。要使用 QUnit,需要按照以下方法:

1. 下載 qunit.css 文件和 qunit.js 文件(參閱 參考資料)。

2. 創建一個 HTML 頁面,其中包含導入剛下載的 CSS 和 JavaScript 文件的特定標簽。

清單 4 顯示了適用于 QUnit 的標準的 HTML 運行程序。

清單 4. HTML 運行程序 (qunit/runner.html) 

  1. <!DOCTYPE html> 
  2. <html> 
  3.     <head> 
  4.         <meta charset="UTF-8" /> 
  5.         <title>QUnit Test Suite</title> 
  6.         <link rel="stylesheet" href="css/qunit.css" type="text/css" media="screen"> 
  7.         <script type="text/javascript" src="js/lib/qunit.js"></script> 
  8.     </head> 
  9.     <body> 
  10.         <h1 id="qunit-header">QUnit Test Suite</h1> 
  11.         <h2 id="qunit-banner"></h2> 
  12.         <div id="qunit-testrunner-toolbar"></div> 
  13.         <h2 id="qunit-userAgent"></h2> 
  14.         <ol id="qunit-tests"></ol> 
  15.         <div id="qunit-fixture">test markup</div> 
  16.     </body> 
  17. </html> 

假設您擁有兩個函數分別負責將溫度從攝氏轉換為華氏,并轉換回來。清單 5 顯示了執行此轉換的腳本。

清單 5. 轉換 (qunit/js/script.js)

  1. function convertFromCelsiusToFahrenheit(c){  
  2.     var f = c * (9/5) + 32;  
  3.     return f;  
  4. }  
  5.    
  6. function convertFromFahrenheitToCelsius(f){  
  7.     var c = (f - 32) * (5/9);  
  8.     return c;  

清單 6 顯示了各自的測試用例。

清單 6. 測試用例 (qunit/js/test.js)

  1. module ("Temperature conversion")  
  2.    
  3. test("conversion to F"function(){  
  4.     var actual1 = convertFromCelsiusToFahrenheit(20);  
  5.     equal(actual1, 68, ?Value not correct?);  
  6.    
  7.     var actual2 = convertFromCelsiusToFahrenheit(30);  
  8.     equal(actual2, 86, ?Value not correct?);  
  9. })  
  10.    
  11. test("conversion to C"function(){  
  12.     var actual1 = convertFromFahrenheitToCelsius(68);  
  13.     equal(actual1, 20, ?Value not correct?);  
  14.    
  15.     var actual2 = convertFromFahrenheitToCelsius(86);  
  16.     equal(actual2, 30, ?Value not correct?);  
  17. }) 

QUnit 中的測試用例由 test() 方法定義。邏輯是包含在傳入函數的第二個參數中。在清單 6 中,兩個測試分別名為 conversion to F和 conversion to C。每個測試包含兩個斷言。該測試中的斷言使用了 equal() 方法。equal() 函數可以將預期值與測試函數的實際值相比較。 equal() 方法中的第三個參數是錯誤情況下顯示的消息。

還可以通過 module() 函數將測試組織到模塊中。在清單 6 中,Temperature conversion 模塊含有這兩個測試。

如果要運行測試:

1. 在 HTML 運行程序中包含源代碼和測試文件,如清單 7 所示。

2. 在瀏覽器中打開頁面。

清單 7. 在運行程序中包含 script.js 和 test.js

  1. ...<script type="text/javascript" src="js/script.js"></script>  
  2. <script type="text/javascript" src="js/test.js"></script>  
  3. ... 

圖 1 顯示了 QUnit 如何在瀏覽器 (Firefox) 中顯示結果。

圖 1. QUnit 結果

屏幕截圖顯示 4 個測試都成功了。 

清單 6 中的斷言使用了 equal() 方法,但它不是 QUnit 提供的惟一斷言。QUnit 提供的其他斷言包括 ok() 或 strictEqual()。清單 8 顯示了正在執行的方法。

#p#

清單 8. 更多的斷言

  1. module ("Other assertion");  
  2. test("assertions"function(){  
  3.     ok(true);  
  4.     ok(3);  
  5.     strictEqual("c""c");  
  6.     equal (3, "3");  
  7. }); 

ok() 函數檢查第一個參數為 true;strictEqual() 驗證第一個參數嚴格等于第二個參數。在這些代碼背后,strictEqual() 使用了=== 運算符,equal() 使用了 == 運算符。

如果測試失敗,QUnit 還提供了有用的信息。將清單 8 中的代碼改成清單 9 中的代碼,讓上一次斷言執行失敗。

清單 9. 上一次斷言出現的錯誤

  1. module ("Other assertion");  
  2. test("assertions"function(){  
  3.     ok(true);  
  4.     ok(3);  
  5.     strictEqual("c""c");  
  6.     strictEqual (3, "3");  
  7. }); 

圖 2 顯示了 QUnit 執行清單 9 代碼所返回的結果。

圖 2. QUnit 結果:上次測試失敗

對 JavaScript 進行單元測試的工具

結果非常詳細,而且很容易查到上次斷言的預期值與實際值有什么不同。

QUnit 另一項特性能讓您在模塊中的所有測試執行之前或之后執行命令。module() 函數接受 setup() 和 teardown() 回調作為第二個參數。使用 setup() 函數更新 清單 6 ,如清單 10 所示。

清單 10. setup() (qunit/js/test-setup.js)

  1. module ("Temperature conversion", {  
  2.     setup : function() {  
  3.         this.celsius1 = 20;  
  4.         this.celsius2 = 30;  
  5.    
  6.         this.fahrenheit1 = 68;  
  7.         this.fahrenheit2 = 86;  
  8.     }  
  9. });  
  10. test("conversion to F"function(){  
  11.     var actual1 = convertFromCelsiusToFahrenheit(this.celsius1);  
  12.     equal(actual1, this.fahrenheit1);  
  13.    
  14.     var actual2 = convertFromCelsiusToFahrenheit(this.celsius2);  
  15.     equal(actual2, this.fahrenheit2);  
  16. });  
  17. test("conversion to C"function(){  
  18.     var actual1 = convertFromFahrenheitToCelsius(this.fahrenheit1);  
  19.     equal(actual1, this.celsius1);  
  20.    
  21.     var actual2 = convertFromFahrenheitToCelsius(this.fahrenheit2);  
  22.     equal(actual2, this.celsius2);  
  23. }); 

該示例移動了設置部分的斷言所使用的值,以避免在測試的邏輯中使用這些值。

QUnit 還通過 asyncTest() 函數提供對異步測試的支持,如果您使用 Asynchronous JavaScript and XML (Ajax),這是非常有用的特性。在這樣的環境中,expect() 函數可以讓你輕松地驗證測試中運行的斷言數量。

YUI Test:獨立的單元測試模塊

YUI Test 是 YUI 庫(Yahoo!)的一個組件,是一個可擴展而完整的單元測試框架。如果要使用 YUI Test,需要:

1. 將 YUI 導入 HTML 運行程序,如下所示。

  1. <script src="http://yui.yahooapis.com/3.4.1/build/yui/yui-min.js"></script> 

如以上代碼所示,此樣例使用了 YUI Test 第 3 版本。

2. 在測試腳本文件中,實例化 YUI 函數。加載所需的模塊,test 和 console,如清單 11 所示。

#p#

清單 11.下載 test 和 console YUI 模塊

  1. YUI().use("test""console"function (Y) {  
  2.      // Test cases go here  
  3. }); 

test 模塊顯然是用于測試的。console 模塊并不是強制性的,但本示例將用它來打印結果。測試用例將會進入回調中,并以全局的 Y實例作為參數。

YUI Test 使用 Y.Test.Case() 構造函數實例化新測試用例,使用 Y.Test.Suite() 構造函數來實例化測試套件。測試套件與 JUnit 類似,包含若干個測試用例。可以使用 add() 方法將測試用例添加到測試套件中。

我們使用 YUI test 重新測試 清單 5 中的源代碼。清單 12 顯示了如何創建測試用的套件和測試用例。

清單 12. 測試套件和用例

  1. YUI().use("test""console"function (Y) {  
  2.    
  3.      var suite = new Y.Test.Suite("Temperature conversion suite");  
  4.    
  5.      //add a test case  
  6.      suite.add(new Y.Test.Case({  
  7.          name:"Temperature conversion?  
  8.      ));  
  9. }); 

清單 12 生成了一個名為 Temperature conversion suite 的套件和一個名為 Temperature conversion 的測試用例。現在,可以將測試方法寫入對象文本中,作為參數傳遞給 Y.Test.Case 構造函數,如清單 13 所示。

清單 13. 測試用例與測試方法

  1. suite.add(new Y.Test.Case({  
  2.     name:"Temperature conversion",  
  3.    
  4.     setUp : function () {  
  5.         this.celsius1 = 20;  
  6.         this.celsius2 = 30;  
  7.    
  8.         this.fahrenheit1 = 68;  
  9.         this.fahrenheit2 = 86;  
  10.     },  
  11.    
  12.     testConversionCtoF: function () {  
  13.         Y.Assert.areEqual(this.fahrenheit1,          
  14. convertFromCelsiusToFahrenheit(this.celsius1));  
  15.    
  16.         Y.Assert.areEqual(this.fahrenheit2,  
  17. convertFromCelsiusToFahrenheit(this.celsius2));  
  18.     },  
  19.    
  20.     testConversionFtoC: function () {  
  21.         Y.Assert.areEqual(this.celsius1,  
  22. convertFromFahrenheitToCelsius(this.fahrenheit1));  
  23.    
  24.         Y.Assert.areEqual(this.celsius2,  
  25. convertFromFahrenheitToCelsius(this.fahrenheit2));  
  26.     }  
  27. })); 

您可能注意到,在清單 13 中:

1. 可使用 setUp() 方法。YUI Test 在測試用例和測試套件層提供了 setUp() 和 tearDown() 方法。

2. 測試方法名以 test 單詞開頭,它們包含斷言。

3. 本示例使用 Y.Assert.areEqual() 斷言類型,它與 QUnit 中的 equal() 函數類似。YUI Test 為斷言提供了多種方法,如:

1). Y.Assert.areSame(),它類似于 QUnit 中的 strictEqual()。

2). 數據類型斷言(Y.Assert.isArray()、Y.Assert.isBoolean()、Y.Assert.isNumber() 等等)。

3). 特殊值斷言(Y.Assert.isFalse()、Y.Assert.isNaN()、Y.Assert.isNull() 等等)。

要啟動 YUI 中的測試,需要使用 Y.Test.Runner 對象。還需要將套件或測試用例添加到對象中,然后調用 run() 方法來運行測試。清單 14 顯示了如何運行 清單 13 中創建的測試。

清單 14. 運行 YUI test

  1. Y.Test.Runner.add(suite);  
  2. Y.Test.Runner.run(); 

在默認情況下,結果會打印在瀏覽器的控制臺中(如果瀏覽器支持控制臺的話)。更好的方法是使用 Yahoo! Console 組件來打印結果。如果要使用 Yahoo! Console 組件,需要采用 Y.Console 構造函數將控制臺綁定到 HTML 運行程序的 DOM 元素中,如清單 15 所示。

#p#

清單 15. Yahoo! Console

  1. var console = new Y.Console({  
  2.     verbose: true,  
  3.     newestOnTop: false,  
  4.     width:"600px" 
  5. });  
  6.    
  7. console.render('#testLogger'); 

清單 15 顯示了如何使用幾個參數配置控制臺。該控制臺會在 DOM 元素內部呈現,其 id 為 testLogger。

需要更新 HTML 運行程序。添加該控制臺所引用的 DOM 元素,如清單 16 所示。

  1. <body> 
  2.      <div id="testLogger"></div> 
  3. </body> 

本例為 <body> 設置了一個類,名為 yui3-skin-sam。該類負責定義控制臺的皮膚。

圖 3 顯示了運行測試之后的控制臺。

圖 3. YUI Test 結果

對 JavaScript 進行單元測試的工具

使用 JSTestDriver 輕松測試

通過使用功能強大的 JSTestDriver (JSTD) 工具,您能夠在多個瀏覽器中從命令行運行 JavaScript。JSTD 帶有一個 JAR 文件,它可以讓您啟動服務器、捕獲一或多個瀏覽器并在這些瀏覽器中運行測試。因為擁有上述的兩個框架,您不需要 HTML 運行程序,但您需要一個配置文件。圖 17 顯示了配置文件。

清單 17. 配置文件 (jsTestDriver.conf)

  1. server: http://localhost:4224  
  2. load:  
  3.   - js/src/*.js  
  4. test:  
  5.   - js/test/*.js 

該配置文件是用 YAML 編寫的,這是一種很好的配置文件格式。它包含了要啟動的服務器以及源代碼和測試文件的位置信息。

要使用 JSTD 來執行測試:

1. 啟動測試服務器。從命令行中,進入到保存 jsTestDriver.jar 的文件夾,并執行以下命令:

  1. java -jar JsTestDriver-1.3.3d.jar -port 4224 

清單 17 中指定的端口應該與配置文件中指定的一樣。在默認情況下,JSTD 會在 JAR 文件所在的同一個目錄下查找 jsTestDriver.conf 文件。

2. 在測試中,通過將 URL http://localhost:4224/capture 復制粘貼到測試中的瀏覽器,在服務器上注冊一個或多個瀏覽器。

測試之前示例中所使用的相同代碼(清單 5),但這次使用 JSTD 語法。清單 18 顯示了如何轉換 清單 10 的 QUnit 和 清單14 的 YUI Test 中的代碼。

清單 18. JSTD 測試

  1. TestCase("Temperature conversion", {  
  2.     setUp : function () {  
  3.         this.celsius1 = 20;  
  4.         this.celsius2 = 30;  
  5.    
  6.         this.fahrenheit1 = 68;  
  7.         this.fahrenheit2 = 86;  
  8.     },  
  9.    
  10.     testConversionCtoF: function () {  
  11.         assertSame(this.fahrenheit1, convertFromCelsiusToFahrenheit(this.celsius1));  
  12.         assertSame(this.fahrenheit2, convertFromCelsiusToFahrenheit(this.celsius2));  
  13.     },  
  14.    
  15.     testConversionFtoC: function () {  
  16.         assertSame(this.celsius1, convertFromFahrenheitToCelsius(this.fahrenheit1));  
  17.         assertSame(this.celsius2, convertFromFahrenheitToCelsius(this.fahrenheit2));  
  18.     }  
  19. }); 

清單 18 中的代碼與 YUI 版本差別不大。JSTD 使用 TestCase() 函數來定義測試用例。您可以使用內聯聲明來定義測試方法,如清單 18 所示,或者可以擴展 TestCase 實例的原型。每個測試用例還可以使用 SetUp() 和 tearDown() 方法。

如果要運行測試,運行以下命令:

  1. java -jar JsTestDriver-1.3.3d.jar --tests all 

圖 4 顯示了終端上的輸出結果。

圖 4. JSTD 測試的結果

[[101769]]

測試會傳入之前捕獲到的所有瀏覽器(Chrome 15、Safari 5 和 Firefox 7)。

JSTD 還能與您偏好的連續集成系統很好地集成,成為連續版本的一部分。它還能與 IDE 集成,如 Eclipse(插件)或 TextMate(包)。

結束語

隨著現在對 Web 應用程序客戶端的關注,對 JavaScript 進行單元測試就顯得尤為必要。有很多框架可以幫助您完成此任務,本文介紹了三個最流行的框架:QUnit、YUI Test 和 JSTestDriver。

QUnit 非常簡單,很適合初學者的框架。

YUI Test 是個全面的工具,適合熟悉 YUI 庫的用戶。

JSTestDriver 可在多個瀏覽器中運行測試。

來源:IBM DeveloperWorks

責任編輯:林師授 來源: IBMDW
相關推薦

2012-11-01 11:32:23

IBMdw

2017-12-12 13:17:36

機器學習代碼單元測試

2017-01-16 12:12:29

單元測試JUnit

2017-01-14 23:26:17

單元測試JUnit測試

2013-06-04 09:49:04

Spring單元測試軟件測試

2017-03-23 16:02:10

Mock技術單元測試

2021-03-28 23:03:50

Python程序員編碼

2017-01-14 23:42:49

單元測試框架軟件測試

2011-11-30 22:03:49

ibmdwJava

2011-10-20 10:09:14

JavaScript

2009-08-19 09:00:48

單元測試框架自動化測試

2013-12-18 09:56:20

AngularJS測試

2011-06-20 16:41:59

單元測試

2023-08-02 13:59:00

GoogleTestCTest單元測試

2021-03-24 09:30:02

Jupyter not單元測試代碼

2019-12-18 10:25:12

機器學習單元測試神經網絡

2009-06-26 17:48:38

JSF項目單元測試JSFUnit

2023-07-26 08:58:45

Golang單元測試

2011-05-16 16:52:09

單元測試徹底測試

2023-12-11 08:25:15

Java框架Android
點贊
收藏

51CTO技術棧公眾號

超碰97人人射妻| 爱情电影社保片一区| 奇米精品一区二区三区在线观看| 欧美一性一乱一交一视频| 97色婷婷成人综合在线观看| 揄拍成人国产精品视频| 在线观看爽视频| 亚洲精品一区二区三区婷婷月| 欧美bbbxxxxx| 亚洲加勒比久久88色综合| 变态调教一区二区三区| 亚洲成人精品久久| 9i看片成人免费高清| 国产亚洲一级高清| 国产aa精品| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 高h视频在线观看| 91.麻豆视频| 日韩成人影视| 精品国产亚洲一区二区三区在线观看| 在线中文字幕-区二区三区四区| 在线成人av网站| 女厕盗摄一区二区三区| 日韩一二三在线视频播| 国产精品香蕉| 91久热免费在线视频| 在线欧美视频| 色综合视频二区偷拍在线| 狠狠色丁香婷婷综合| 六月丁香激情网| 一区二区三区四区在线| porn亚洲| 亚洲一区第一页| 日韩有码av| 国内一区在线| 久久99蜜桃精品| 少妇高清精品毛片在线视频| 亚洲成a人片在线观看中文| 可以在线观看的黄色| 日韩精品影音先锋| 精品国产亚洲一区二区在线观看| 欧美亚洲视频在线看网址| 91精品秘密在线观看| 日韩色妇久久av| 国产亚洲精品精华液| 在线观看视频污| 亚洲精品一区二区在线观看| 亚洲欧洲二区| 成人欧美一区二区三区黑人| 久久国产精品99精品国产| 久久久精品麻豆| 色偷偷成人一区二区三区91| 涩涩视频在线| 国产精品自在线| 蜜臀久久99精品久久久久久9 | 欧美激情网站在线观看| 在线电影一区二区| 日本xxxxx18| 精品成人久久av| 精品成人免费一区二区在线播放| 青青青国产精品一区二区| 日韩电影在线观看电影| 美女av电影| 精品少妇一区二区三区免费观看| 欧美大奶一区二区| 亚洲无玛一区| 亚洲小说欧美激情另类| 日本电影欧美片| 国产精品v欧美精品∨日韩| 91麻豆6部合集magnet| 乱人伦中文视频在线| 97在线免费观看视频| 秋霞午夜鲁丝一区二区老狼| 国产无遮挡又黄又爽免费网站| 亚洲第一福利网| 亚洲影视一区二区三区| 天美星空大象mv在线观看视频| 精品久久国产字幕高潮| 91精品国产自产在线观看永久∴ | 欧美理论电影在线观看| 性久久久久久| 91精品久久久久久9s密挑 | 色婷婷在线播放| 国产精品91在线| 99久久国产综合精品女不卡| 3p视频在线观看| 欧美在线视频在线播放完整版免费观看| 免费成人av资源网| 日韩精品系列| 卡一卡二国产精品 | 欧美日韩一区二区三区在线视频| 国产精品福利av| 欧美成人h版| 国产精品国模大尺度私拍| 亚洲欧洲日韩在线| 先锋欧美三级| 亚洲不卡1区| 欧美亚洲动漫制服丝袜| 成人午夜国产| 99草草国产熟女视频在线| 日韩精品中文字幕有码专区| 国产麻豆综合| 精品无吗乱吗av国产爱色| 国产成人+综合亚洲+天堂| 2021国产精品久久精品| 成人自拍视频网| 天天干天天操天天干天天操| 欧美一级免费大片| 国产精品久久久久久久免费软件| 久草在现在线| 99热在线播放| 在线观看亚洲a| 最新欧美人z0oozo0| 日本24小时在线高清视频| 日韩av色综合| 亚洲精品中文字幕在线观看| 红杏aⅴ成人免费视频| 色免费在线视频| 97福利一区二区| 日韩美女啊v在线免费观看| 999久久久精品一区二区| 国产精品wwwww| 久久精品国产成人| 99久久精品免费观看| 亚洲国产天堂| 色综合av综合无码综合网站| 日韩一区二区欧美| 国产色产综合色产在线视频| 97一区二区国产好的精华液| 天天干天天玩天天操| 日本国产精品视频| 亚洲va欧美va天堂v国产综合| 国产电影一区二区在线观看| 亚洲欧美日本免费| 国产亚洲二区| 日韩电影大片中文字幕| 成人激情动漫在线观看| 欧美视频二区欧美影视| 五月综合网站| 亚洲va欧美va国产综合剧情| 欧美午夜免费电影| 成人羞羞网站入口| yw193.com尤物在线| 91精品影视| 成人影音在线| 日本在线啊啊| 一道在线中文一区二区三区| 黄色aa久久| 国产精品一线| 972aa.com艺术欧美| 亚洲国产精品av| 美日韩一区二区三区| 毛片av一区二区| 国产精品中文欧美| 国产成人精品一区二| 精品一区二区三区的国产在线播放| 亚洲裸体俱乐部裸体舞表演av| 91蝌蚪国产九色| 欧美三级在线看| 97人洗澡人人免费公开视频碰碰碰| 国产精品一区二区在线观看| 国产精品久久国产| 又黄又www| 最新av网站在线观看 | 欧美日韩激情电影| 久久sese| 婷婷综合亚洲| 久久人人爽人人爽| 欧美大片日本大片免费观看| 97av在线播放| 99久久久无码国产精品性色戒| 国产福利片在线| 香蕉视频一区| 久久精品无码一区二区三区| 日韩视频不卡中文| 日韩免费精品视频| www.av91| 成人福利一区| 国精产品一区一区三区mba视频 | 欧美日韩国产综合新一区 | 激情小视频在线观看| 国产精品迅雷| 国产农村妇女精品一区二区| 欧美天堂在线观看| 成人日韩在线电影| 色综合888| 黑人巨大精品欧美一区免费视频| 日韩制服丝袜av| 91精品入口| 国产原厂视频在线观看| 日日碰狠狠躁久久躁婷婷| 国产成人免费观看| 欧美超级乱淫片喷水| 91久久国产最好的精华液| 99久久99久久免费精品蜜臀| 激情视频一区| 欧美成人午夜77777| 麻豆免费在线| 免费在线稳定资源站| 九色91popny|