999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Feed4JUnit架構的單元測試技術研究與應用

2014-09-24 12:09:35楊鵬
軟件工程 2014年7期
關鍵詞:方法

楊鵬

摘要:軟件測試技術在軟件質量控制過程中一直起著非常重要的作用。JUnit是被廣泛應用的Java單元測試框架,主要測試基于java語言編寫的程序代碼,用于編寫和運行可重復的測試。Feed4JUnit是開源的基于JUnit的擴展,通過使用Feed4JUnit提供的注釋,用戶可以很方便地把測試數據存放在文件或其他數據源。本文分析了應用Feed4JUnit進行單元測試的方法,并通過實際開發示例實現數據與代碼分離的測試。

關鍵詞:Feed4JUnit架構;單元測試;數據源

中圖分類號:TP311.52 文獻標識碼:A

Research on Unit Testing Technology Based on Feed4JUnit Architecture

YANG Peng

(School of Information Engineering Guangzhou Panyu Polytechnic,Guangzhou 511483,China)

Abstract:Software testing technology has been under the control of software processto use is very important.Unit is the Java unit test framework is widely used,mainly used for testing the class and method based on the Java language,Feed4JUnit is the extension of JUnit based on open source, using the Feed4JUnit annotation,the usercan be very convenient to test the data stored in a file or other data source.This paperanalyzes the application of Feed4JUnit unit test methods,and through the actualexample of developing,realize the separation of data and code test.

Keywords:Feed4JUnit;unit test;data source

1 引言(Introduction)

單元測試(Unit Testing),是指對軟件中的最小可測試單元進行檢查和驗證。對于單元測試中單元的含義,一般來說,要根據實際情況去判定其具體含義,如C語言中單元指一個函數[1],Java里單元指一個類,圖形化的軟件中可以指一個窗口或一個菜單等。總的來說,單元就是人為規定的最小的被測功能模塊[2]。單元測試是在軟件開發過程中要進行的最低級別的測試活動,軟件的獨立單元將在與程序的其他部分相隔離的情況下進行測試[3]。單元測試不僅僅保證代碼在方法級別的正確性,它還能改進設計,易于對代碼重構[4]。凡是容易編寫單元測試的代碼,往往是優秀的設計和松耦合的組件,凡是難于編寫單元測試的代碼,往往是設計不佳和耦合度高的系統[5]。因此,編寫單元測試不僅僅是掌握單元測試柜架的用法,更重要的是在編寫單元測試的過程中發現設計缺陷,改進系統結構,從而實現良好的可擴展性。

任何一個項目,單元測試應該在詳細設計之后開始進行,首先根據詳細設計文檔進行單元測試用例的編寫,編寫完成后進行代碼開發,代碼完成后運行單元測試,如果通過,則該方法可以發布運行,如果不通過需要進行代碼改造,再進行單元測試,直到單元測試運行通過為止。

2 Junit單元測試架構(Junit unit test framework)

JUnit是由Erich Gamma和Kent Beck編寫的一個回歸測試框架(Regression Testing Framework)。Junit測試是程序員測試,即所謂白盒測試,因為程序員知道被測試的軟件如何(How)完成功能和完成什么樣(What)的功能。Junit是一套框架,繼承TestCase類,就可以用Junit進行自動測試了。通常來說,在極限編程中,基本過程是這樣的:構思→編寫測試代碼→編寫代碼→測試,而且編寫測試和編寫代碼都是增量式的,寫一點測一點,在編寫以后的代碼中如果發現問題可以較快的追蹤到問題的原因,減小回歸錯誤的糾錯難度,如圖1所示的是Junit基本架構。

圖1 Junit基本架構

Fig.1 The basic architecture of Junit

在Junit類中,有很多定義類。Test:是TestCase、TestSuite的共同接口。run(TestResult)用來運行Test,并且將結果保存到TestResult。TestCase:Test的接口的抽象實現,是Abstract類,所以不能實例化,能被繼承。其中一個構造函數TestCase(String Name),根據輸入的參數,創建一個測試實例。參數為該類的以test開頭的方法名,把它添加到TestSuite中,指定僅僅運行TestCase中的一個方法。

TestSuite:實現Test接口。可以組裝一個或者多個TestCase。待測試類中可能包括了對被測類的多個TestCase,而TestSuit可以保存多個TestCase,負責收集這些測試,這樣就可以一個Suite就能運行對被測類的多個測試。TestResult:保存TestCase運行中的事件。TestResult有ListfFailures和ListfErrors。fFailures記錄Test運行中的AssertionFailedError,而fErrors則記錄Exception。Failure是當期望值和斷言不匹配的時候拋出的異常,而Error則是不曾預料到的異常,如:ArrayIndexOutOfBoundsException。TestListener:是個接口,對事件監聽,可供TestRunner類使用。

ResultPrinter:實現TestListener接口。在TestCase運行過程中,對所監聽的對象的事件以一定格式及時輸出,運行完后,對TestResult對象進行分析,輸出的統計結果。BaseTestRunner:所有TestRunner的超類。java Junit.swingui.TestRunner:實BaseTestRunner,提供圖形界面。java Junit.textui.TestRunner:實現BaseTestRunner,提供文本界面。下面將以它做為例子講解JUnit生命周期。

3 JUnit4測試實例(JUnit4 test examples)

在應用程序的業務邏輯中存在大量的這樣的接口:他們接受不同的輸入,然后進行或驗證、或處理,進而完成相同的流程。比如網站的登錄入口,用戶名和密碼都有長度的限制,同時也具有是否允許特殊字符的限制等,所以在我們進行其單元測試的過程中,根據不同長度的用戶名和密碼,以及不同的字符組合,只需要提供相同的測試代碼結構,就能完成測試,不同的僅僅測試數據與期望值,但是因為每一個測試方法中的輸入參數不同,我們必須為每一個輸入組編寫單獨的測試用例,從而產生大量冗余代碼,十分不便于維護。

將Java對象名稱(每個單詞的頭字母大寫)按照數據庫命名的習慣進行格式化,格式化后的數據為小寫字母,并且使用下劃線分割命名單詞,要求對輸入數據進行非法驗證。

首先新建一個TestJUnit。打開項目TestJUnit的屬性頁→選擇“Java Build Path”子選項→點選“Add Library…”按鈕→在彈出的“Add Library”對話框中選擇JUnit(圖2),并在下一頁中選擇版本4.1后點擊“Finish”按鈕。

圖2 JUnit 運行測試界面

Fig.2 JUnit run the test interface

在JUnit運行界面提示有兩個測試情況未通過,當首字母大寫時得到的處理結果與預期的有偏差,造成測試失敗;而當測試對 null的處理結果時,則直接拋出了異常,測試錯誤。

JUnit將測試失敗的情況分為兩種:failure和error。Failure一般由單元測試使用的斷言方法判斷失敗引起,它表示在測試點發現了問題;而error則是由代碼異常引起,這是測試目的之外的發現,它可能產生于測試代碼本身的錯誤(測試代碼也是代碼,同樣無法保證完全沒有缺陷),也可能是被測試代碼中的一個隱藏的bug。顯然,被測試代碼中并沒有對首字母大寫和null這兩種特殊情況進行處理,現在對源代碼進行修改,添加對這兩種情況的處理,代碼如下:

package sample.test;

import static org.junit.Assert.assertEquals;

import java.util.Arrays;

import java.util.Collection;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.junit.runners.Parameterized;

import org.junit.runners.Parameterized.Parameters;

import sample.code.UserAccess;

/*

* JUnit - Parameter test sample

*/

@RunWith(Parameterized.class)

public class JunitSample {

private String user;

private String pw;

private boolean expected;

@Parameters

public static Collection dataGenerater() {

return Arrays.asList(new Object[][] {

{ "user01", "123456", true },

{ "helloworld", "123456", false },

{ "david", "re*ads", false },

{ "goodone", "onegood", true } });

}

public JunitSample(String user, String pw, boolean expected) {

this.user = user;

this.pw = pw;

this.expected = expected;

}

@Test

public void testAccessCheck() {

assertEquals(expected, UserAccess.accessCheck(user, pw));

}

}

運行測試,顯示的測試結果如圖3所示。

圖3 測試結果

Fig.3 The test results

通過以上代碼可以看出,JUnit4通過使用一個標記@Parameters注釋的返回類型為Collection的靜態方法產生數據,測試數據通過變量傳遞給測試方法,從而完成多數據輸入的測試。但是隨著業務的需要,測試人員需要經常增加測試數據與修改現有測試數據,JUnit4提供的硬編碼方式已經愈顯笨重和不便,數據與代碼分離顯得尤為重要。

本文所述的Feed4Junit可以良好 地解決數據與代碼分離的問題,Feed4JUnit是JUnit測試框架的擴展,它通過操作來自于文件以及不同的數據源的測試數據,使單元測試變得更容易編寫與維護。本文通過實例展示Feed4JUnit的安裝以及測試代碼與數據分離的實現,本文的實例代碼全部基于針對如下一個簡單的用戶登錄檢驗的類。

package sample.code;

public class UserAccess {

// simple validation for user name and password

public static boolean accessCheck(String userName, String password) {

if (userName.length() <= 4 || userName.length() > 8)

return false;

if (password.length() <= 4 || password.length() > 8)

return false;

if (userName.contains("@"))

return false;

if (password.contains("*"))

return false;

return true;

}

}

在靜態方法excel中,本文采用二維數組的方式來構建測試所需要的參數列表,其中每個數組中的元素的放置順序并沒有什么要求,只要和構造函數中的順序保持一致就可以了。現在如果再增加一種測試情況,只需要在靜態方法excel中添加相應的數組即可,不再需要復制粘貼出一個新的方法出來了。

隨著項目的進展,項目的規模在不斷地膨脹,為了保證項目的質量,有計劃的執行全面的單元測試是非常有必要的。但單靠JUnit提供的測試套件很難勝任這項工作,因為項目中單元測試類的個數在不停的增加,測試套件卻無法動態的識別新加入的單元測試類,需要手動修改測試套件。

4 結論(Conclusion)

本文主要介紹了Junit相關單元測試技術,分析了應用Feed4JUnit進行單元測試的方法,用戶可以方便的把測試數據存放在文件或其它數據源。通過提供簡單的注釋,Feed4JUnit使用戶能夠極其方便的實施數據與代碼分離的測試,極大地增強了JUnit測試框架的易用性。本文所敘述的僅僅是Feed4JUnit提供的測試增強功能的一部分,Junit4同時還提供了大量數據的隨機測試和等價類測試等眾多功能。

參考文獻(References)

[1] 高共革,楊靜.基于.NET的單元測試自動化方法研究[J].微計算機信息,2008,24(19):280-281.

[2] 吳高峽,王芙蓉.單元測試的自動化實踐[J].計算機與數字工程,2007,35(1):174-176.

[3] 吳繼娟,孫媛媛,劉桂艷.基于BIST的FPGA邏輯單元測試方法[J].哈爾濱工業大學學報,2004,36(8):1074-1076.

[4] 嚴俊,等.JUTA:一個Java自動化單元測試工具[J].計算機研究與發展,2010(10):1840-1848.

[5] 張巍,尹海波,孫立財.軟件的單元測試方法[J].光電技術應用,2006,21(2):36-38.

作者簡介:

楊 鵬(1978-),女,碩士,講師.研究領域:數據挖掘,圖形圖像處理,軟件測試.

endprint

將Java對象名稱(每個單詞的頭字母大寫)按照數據庫命名的習慣進行格式化,格式化后的數據為小寫字母,并且使用下劃線分割命名單詞,要求對輸入數據進行非法驗證。

首先新建一個TestJUnit。打開項目TestJUnit的屬性頁→選擇“Java Build Path”子選項→點選“Add Library…”按鈕→在彈出的“Add Library”對話框中選擇JUnit(圖2),并在下一頁中選擇版本4.1后點擊“Finish”按鈕。

圖2 JUnit 運行測試界面

Fig.2 JUnit run the test interface

在JUnit運行界面提示有兩個測試情況未通過,當首字母大寫時得到的處理結果與預期的有偏差,造成測試失敗;而當測試對 null的處理結果時,則直接拋出了異常,測試錯誤。

JUnit將測試失敗的情況分為兩種:failure和error。Failure一般由單元測試使用的斷言方法判斷失敗引起,它表示在測試點發現了問題;而error則是由代碼異常引起,這是測試目的之外的發現,它可能產生于測試代碼本身的錯誤(測試代碼也是代碼,同樣無法保證完全沒有缺陷),也可能是被測試代碼中的一個隱藏的bug。顯然,被測試代碼中并沒有對首字母大寫和null這兩種特殊情況進行處理,現在對源代碼進行修改,添加對這兩種情況的處理,代碼如下:

package sample.test;

import static org.junit.Assert.assertEquals;

import java.util.Arrays;

import java.util.Collection;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.junit.runners.Parameterized;

import org.junit.runners.Parameterized.Parameters;

import sample.code.UserAccess;

/*

* JUnit - Parameter test sample

*/

@RunWith(Parameterized.class)

public class JunitSample {

private String user;

private String pw;

private boolean expected;

@Parameters

public static Collection dataGenerater() {

return Arrays.asList(new Object[][] {

{ "user01", "123456", true },

{ "helloworld", "123456", false },

{ "david", "re*ads", false },

{ "goodone", "onegood", true } });

}

public JunitSample(String user, String pw, boolean expected) {

this.user = user;

this.pw = pw;

this.expected = expected;

}

@Test

public void testAccessCheck() {

assertEquals(expected, UserAccess.accessCheck(user, pw));

}

}

運行測試,顯示的測試結果如圖3所示。

圖3 測試結果

Fig.3 The test results

通過以上代碼可以看出,JUnit4通過使用一個標記@Parameters注釋的返回類型為Collection的靜態方法產生數據,測試數據通過變量傳遞給測試方法,從而完成多數據輸入的測試。但是隨著業務的需要,測試人員需要經常增加測試數據與修改現有測試數據,JUnit4提供的硬編碼方式已經愈顯笨重和不便,數據與代碼分離顯得尤為重要。

本文所述的Feed4Junit可以良好 地解決數據與代碼分離的問題,Feed4JUnit是JUnit測試框架的擴展,它通過操作來自于文件以及不同的數據源的測試數據,使單元測試變得更容易編寫與維護。本文通過實例展示Feed4JUnit的安裝以及測試代碼與數據分離的實現,本文的實例代碼全部基于針對如下一個簡單的用戶登錄檢驗的類。

package sample.code;

public class UserAccess {

// simple validation for user name and password

public static boolean accessCheck(String userName, String password) {

if (userName.length() <= 4 || userName.length() > 8)

return false;

if (password.length() <= 4 || password.length() > 8)

return false;

if (userName.contains("@"))

return false;

if (password.contains("*"))

return false;

return true;

}

}

在靜態方法excel中,本文采用二維數組的方式來構建測試所需要的參數列表,其中每個數組中的元素的放置順序并沒有什么要求,只要和構造函數中的順序保持一致就可以了。現在如果再增加一種測試情況,只需要在靜態方法excel中添加相應的數組即可,不再需要復制粘貼出一個新的方法出來了。

隨著項目的進展,項目的規模在不斷地膨脹,為了保證項目的質量,有計劃的執行全面的單元測試是非常有必要的。但單靠JUnit提供的測試套件很難勝任這項工作,因為項目中單元測試類的個數在不停的增加,測試套件卻無法動態的識別新加入的單元測試類,需要手動修改測試套件。

4 結論(Conclusion)

本文主要介紹了Junit相關單元測試技術,分析了應用Feed4JUnit進行單元測試的方法,用戶可以方便的把測試數據存放在文件或其它數據源。通過提供簡單的注釋,Feed4JUnit使用戶能夠極其方便的實施數據與代碼分離的測試,極大地增強了JUnit測試框架的易用性。本文所敘述的僅僅是Feed4JUnit提供的測試增強功能的一部分,Junit4同時還提供了大量數據的隨機測試和等價類測試等眾多功能。

參考文獻(References)

[1] 高共革,楊靜.基于.NET的單元測試自動化方法研究[J].微計算機信息,2008,24(19):280-281.

[2] 吳高峽,王芙蓉.單元測試的自動化實踐[J].計算機與數字工程,2007,35(1):174-176.

[3] 吳繼娟,孫媛媛,劉桂艷.基于BIST的FPGA邏輯單元測試方法[J].哈爾濱工業大學學報,2004,36(8):1074-1076.

[4] 嚴俊,等.JUTA:一個Java自動化單元測試工具[J].計算機研究與發展,2010(10):1840-1848.

[5] 張巍,尹海波,孫立財.軟件的單元測試方法[J].光電技術應用,2006,21(2):36-38.

作者簡介:

楊 鵬(1978-),女,碩士,講師.研究領域:數據挖掘,圖形圖像處理,軟件測試.

endprint

將Java對象名稱(每個單詞的頭字母大寫)按照數據庫命名的習慣進行格式化,格式化后的數據為小寫字母,并且使用下劃線分割命名單詞,要求對輸入數據進行非法驗證。

首先新建一個TestJUnit。打開項目TestJUnit的屬性頁→選擇“Java Build Path”子選項→點選“Add Library…”按鈕→在彈出的“Add Library”對話框中選擇JUnit(圖2),并在下一頁中選擇版本4.1后點擊“Finish”按鈕。

圖2 JUnit 運行測試界面

Fig.2 JUnit run the test interface

在JUnit運行界面提示有兩個測試情況未通過,當首字母大寫時得到的處理結果與預期的有偏差,造成測試失敗;而當測試對 null的處理結果時,則直接拋出了異常,測試錯誤。

JUnit將測試失敗的情況分為兩種:failure和error。Failure一般由單元測試使用的斷言方法判斷失敗引起,它表示在測試點發現了問題;而error則是由代碼異常引起,這是測試目的之外的發現,它可能產生于測試代碼本身的錯誤(測試代碼也是代碼,同樣無法保證完全沒有缺陷),也可能是被測試代碼中的一個隱藏的bug。顯然,被測試代碼中并沒有對首字母大寫和null這兩種特殊情況進行處理,現在對源代碼進行修改,添加對這兩種情況的處理,代碼如下:

package sample.test;

import static org.junit.Assert.assertEquals;

import java.util.Arrays;

import java.util.Collection;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.junit.runners.Parameterized;

import org.junit.runners.Parameterized.Parameters;

import sample.code.UserAccess;

/*

* JUnit - Parameter test sample

*/

@RunWith(Parameterized.class)

public class JunitSample {

private String user;

private String pw;

private boolean expected;

@Parameters

public static Collection dataGenerater() {

return Arrays.asList(new Object[][] {

{ "user01", "123456", true },

{ "helloworld", "123456", false },

{ "david", "re*ads", false },

{ "goodone", "onegood", true } });

}

public JunitSample(String user, String pw, boolean expected) {

this.user = user;

this.pw = pw;

this.expected = expected;

}

@Test

public void testAccessCheck() {

assertEquals(expected, UserAccess.accessCheck(user, pw));

}

}

運行測試,顯示的測試結果如圖3所示。

圖3 測試結果

Fig.3 The test results

通過以上代碼可以看出,JUnit4通過使用一個標記@Parameters注釋的返回類型為Collection的靜態方法產生數據,測試數據通過變量傳遞給測試方法,從而完成多數據輸入的測試。但是隨著業務的需要,測試人員需要經常增加測試數據與修改現有測試數據,JUnit4提供的硬編碼方式已經愈顯笨重和不便,數據與代碼分離顯得尤為重要。

本文所述的Feed4Junit可以良好 地解決數據與代碼分離的問題,Feed4JUnit是JUnit測試框架的擴展,它通過操作來自于文件以及不同的數據源的測試數據,使單元測試變得更容易編寫與維護。本文通過實例展示Feed4JUnit的安裝以及測試代碼與數據分離的實現,本文的實例代碼全部基于針對如下一個簡單的用戶登錄檢驗的類。

package sample.code;

public class UserAccess {

// simple validation for user name and password

public static boolean accessCheck(String userName, String password) {

if (userName.length() <= 4 || userName.length() > 8)

return false;

if (password.length() <= 4 || password.length() > 8)

return false;

if (userName.contains("@"))

return false;

if (password.contains("*"))

return false;

return true;

}

}

在靜態方法excel中,本文采用二維數組的方式來構建測試所需要的參數列表,其中每個數組中的元素的放置順序并沒有什么要求,只要和構造函數中的順序保持一致就可以了。現在如果再增加一種測試情況,只需要在靜態方法excel中添加相應的數組即可,不再需要復制粘貼出一個新的方法出來了。

隨著項目的進展,項目的規模在不斷地膨脹,為了保證項目的質量,有計劃的執行全面的單元測試是非常有必要的。但單靠JUnit提供的測試套件很難勝任這項工作,因為項目中單元測試類的個數在不停的增加,測試套件卻無法動態的識別新加入的單元測試類,需要手動修改測試套件。

4 結論(Conclusion)

本文主要介紹了Junit相關單元測試技術,分析了應用Feed4JUnit進行單元測試的方法,用戶可以方便的把測試數據存放在文件或其它數據源。通過提供簡單的注釋,Feed4JUnit使用戶能夠極其方便的實施數據與代碼分離的測試,極大地增強了JUnit測試框架的易用性。本文所敘述的僅僅是Feed4JUnit提供的測試增強功能的一部分,Junit4同時還提供了大量數據的隨機測試和等價類測試等眾多功能。

參考文獻(References)

[1] 高共革,楊靜.基于.NET的單元測試自動化方法研究[J].微計算機信息,2008,24(19):280-281.

[2] 吳高峽,王芙蓉.單元測試的自動化實踐[J].計算機與數字工程,2007,35(1):174-176.

[3] 吳繼娟,孫媛媛,劉桂艷.基于BIST的FPGA邏輯單元測試方法[J].哈爾濱工業大學學報,2004,36(8):1074-1076.

[4] 嚴俊,等.JUTA:一個Java自動化單元測試工具[J].計算機研究與發展,2010(10):1840-1848.

[5] 張巍,尹海波,孫立財.軟件的單元測試方法[J].光電技術應用,2006,21(2):36-38.

作者簡介:

楊 鵬(1978-),女,碩士,講師.研究領域:數據挖掘,圖形圖像處理,軟件測試.

endprint

猜你喜歡
方法
中醫特有的急救方法
中老年保健(2021年9期)2021-08-24 03:52:04
高中數學教學改革的方法
河北畫報(2021年2期)2021-05-25 02:07:46
化學反應多變幻 “虛擬”方法幫大忙
變快的方法
兒童繪本(2020年5期)2020-04-07 17:46:30
學習方法
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
最有效的簡單方法
山東青年(2016年1期)2016-02-28 14:25:23
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
賺錢方法
捕魚
主站蜘蛛池模板: 国产精品视频999| 在线五月婷婷| 久久久91人妻无码精品蜜桃HD| 午夜无码一区二区三区| 久久精品中文字幕免费| 成人在线视频一区| 免费高清毛片| 亚洲美女久久| 2020精品极品国产色在线观看 | 欧美激情视频一区二区三区免费| 久草国产在线观看| 91精选国产大片| 四虎永久在线视频| 91色在线观看| 97综合久久| 九色在线观看视频| 亚洲床戏一区| 国产男女免费视频| 欧洲欧美人成免费全部视频| 日韩视频精品在线| 精品亚洲麻豆1区2区3区| 久久精品国产精品青草app| 九九久久99精品| 一本大道东京热无码av| 久久青草免费91观看| 91综合色区亚洲熟妇p| 在线观看91香蕉国产免费| 国产自在线拍| 伊人久久福利中文字幕| 亚洲av无码人妻| 国产亚洲精品在天天在线麻豆| 999精品视频在线| 欧美va亚洲va香蕉在线| 美女扒开下面流白浆在线试听| 巨熟乳波霸若妻中文观看免费| 人妖无码第一页| 一级在线毛片| 老司机久久99久久精品播放 | 成人午夜天| 国产成人做受免费视频| 中字无码精油按摩中出视频| 91国内外精品自在线播放| 日韩毛片基地| 欧美一区二区三区国产精品| 一级毛片在线直接观看| 孕妇高潮太爽了在线观看免费| 亚洲欧美天堂网| 国产精品乱偷免费视频| 小13箩利洗澡无码视频免费网站| 国产精品免费p区| 黄色三级网站免费| 一级毛片不卡片免费观看| 不卡的在线视频免费观看| 九色视频最新网址| 成人免费黄色小视频| 美女被操91视频| 国产欧美在线观看一区| 国产成人精品在线| 男女男精品视频| 国产免费怡红院视频| 丝袜无码一区二区三区| 欧美成人a∨视频免费观看| 无码aaa视频| 在线欧美a| 久久精品人人做人人爽电影蜜月 | 天天干天天色综合网| 日韩色图区| 国产精品吹潮在线观看中文| 国产精品亚洲五月天高清| 五月婷婷亚洲综合| 婷婷综合亚洲| 老色鬼欧美精品| 二级特黄绝大片免费视频大片| 欧美一区国产| 精品黑人一区二区三区| 国产色婷婷| 日本欧美成人免费| 国产精品开放后亚洲| 日本成人福利视频| 一级毛片基地| 国产在线观看一区精品| 国产成人精品在线1区|