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

JUnit 5系列之基礎入門介紹

開發 后端
本系列文章都基于 Junit 5發布的先行版 Milestone 2。它可能會有變化。如果有新的里程碑(milestone)版本發布,或者試用版正式發行時,我會再來更新這篇文章。這里要介紹的多數知識你都可以在 JUnit 5 用戶指南 中找到(這個鏈接指向的是先行版 Milestone 2,想看的最新版本文檔的話請戳這里),并且指南還有更多的內容等待你發掘。

上周我們剛剛搭建好了 JUnit 5 的環境,現在我們可以寫測試了。這節就讓我們來寫它幾個吧!

概述

本文章是這個 JUnit 5 系列的一部分:

(如果不喜歡看文章,你可以戳這里看我的演講,或者看一下最近的 vJUG 講座,或者我在 DevoxxPL 上的 PPT。

本系列文章都基于 Junit 5發布的先行版 Milestone 2。它可能會有變化。如果有新的里程碑(milestone)版本發布,或者試用版正式發行時,我會再來更新這篇文章。

這里要介紹的多數知識你都可以在 JUnit 5 用戶指南 中找到(這個鏈接指向的是先行版 Milestone 2,想看的***版本文檔的話請戳這里),并且指南還有更多的內容等待你發掘。下面的所有代碼都可以在 我的 Github 上找到。

目錄

  • 設計哲學
  • JUnit 5預備:

。包可見性

。測試的生命周期

# @Test

# Before 和 After

# 禁用測試

# 測試類的生命周期

。斷言

# 常規斷言

# 擴展斷言

。假言/判定(Assumptions)

。測試嵌套

。測試命名

  • 回顧
  • 分享&關注

設計哲學

新的架構設計(這個我們日后聊),其關注點在高擴展性。如果后面出現了什么神之測試技術(至少對我們廣大 Java?來說很神的),它們也可能在 JUnit 5 的架構下被實現。

不過當前來說,涉及的基礎知識與 JUnit 4 是非常相似的。JUnit 5 的改動并不激進,相反它的優化歷程是小心翼翼,小步迭代的。因此,開發者應該會對新的 API 感到非常熟悉。至少我是這樣的,我相信你也不會感覺陌生: 

  1. class Lifecycle { 
  2.   
  3.     @BeforeAll 
  4.     static void initializeExternalResources() { 
  5.         System.out.println("Initializing external resources..."); 
  6.     } 
  7.   
  8.     @BeforeEach 
  9.     void initializeMockObjects() { 
  10.         System.out.println("Initializing mock objects..."); 
  11.     } 
  12.   
  13.     @Test 
  14.     void someTest() { 
  15.         System.out.println("Running some test..."); 
  16.         assertTrue(true); 
  17.     } 
  18.   
  19.     @Test 
  20.     void otherTest() { 
  21.         assumeTrue(true); 
  22.   
  23.         System.out.println("Running another test..."); 
  24.         assertNotEquals(1, 42, "Why wouldn't these be the same?"); 
  25.     } 
  26.   
  27.     @Test 
  28.     @Disabled 
  29.     void disabledTest() { 
  30.         System.exit(1); 
  31.     } 
  32.   
  33.     @AfterEach 
  34.     void tearDown() { 
  35.         System.out.println("Tearing down..."); 
  36.     } 
  37.   
  38.     @AfterAll 
  39.     static void freeExternalResources() { 
  40.         System.out.println("Freeing external resources..."); 
  41.     } 
  42.   
  43.  

是吧?這里并沒有很大的改動。

JUnit 5 預備

包可見性

JUnit 5 最明顯的變化應該是,不再需要手動將測試類與測試方法為 public 了。包可見的訪問級別就足夠了。當然,私有(private)訪問還是不行的。我認為這個變化是合理的,也符合我們對可見性的一般直覺。

這很好!至少可以少打幾個字母了。不過,我相信你也不是每次都手打這幾個字母的,是吧?盡管如此還是很好,少一些關鍵字,你在看測試的時候也少些切換。

測試的生命周期

@Test

JUnit 中最基本的注解非 @Test 莫屬了。它會標記方法為測試方法,以便構建工具和 IDE 能夠識別并執行它們。

它的 API 和作用并沒有變化,不過它不再接受任何參數了。若要測試是否拋出異常,你可以通過新的斷言 API 來做到;不過就我所知,目前還沒有超時選項timeout的替代品。

與 JUnit 4一樣,JUnit 5 會為每個測試方法創建一個新的實例。

Before 和 After

你可能需要執行一些代碼來在測試執行前后完成一些初始化或銷毀的操作。在 JUnit 5 中,有4個注解你可能會用于如此工作:

@BeforeAll

只執行一次,執行時機是在所有測試和 @BeforeEach 注解方法之前。

@BeforeEach

在每個測試執行之前執行。

@AfterEach

在每個測試執行之后執行。

@AfterAll

只執行一次,執行時機是在所有測試和 @AfterEach 注解方法之后。

因為框架會為每個測試創建一個單獨的實例,在 @BeforeAll/@AfterAll 方法執行時尚無任何測試實例誕生。因此,這兩個方法必須定義為靜態方法。

注解了同樣一個注解的不同方法,其執行次序是不可預知的,包括對繼承來的方法也適用。這是開發團隊經過審慎思考后的決定,即把單元測試與集成測試的關注點分開。集成測試可能需要方法間更緊密的協作,但一個單元測試不應該對其他的單元測試有所依賴。而對于集成測試——也叫場景測試——的支持,也已在團隊的計劃中。

除了名字有所不同,這幾個注解與 JUnit 4 中的注解工作方式完全一樣。無獨有偶,跟主流意見一致,我也覺得這個新的命名不能說服我其必要性。這個 issue 下有更多的討論。

禁用測試

今兒星期五,抬頭一看已經4點半,無心工作的你想回家了?完全理解,在測試上怒拍一個 @Disabled 注解即可。有良心的話寫個忽略測試的理由是極好的,不過也可以不帶此參數。 

  1. @Test  
  2. @Disabled("你丫就是存心跑不過的是不?!"
  3. void failingTest() { 
  4.     assertTrue(false); 
  5.  

測試類的生命周期

JUnit 團隊發布的***版原型中,包含了一個對 測試類的生命周期 的描述,有意思的是,這個特性在 alpha 版本的發布中未被加入。這個生命周期模型建議,在被測類的多個測試方法中使用一個同樣的實例,因為這樣我們就可以通過改變對象的狀態,進而實現在多個測試方法中的交互。(我也再說一遍,這更像是 場景測試 要管的事。)

正如我在***版公測時所說,這樣的特性99%的場景下是有害的,只有另外1%的場合下才有真正的用處。我只能說,還好這個特性被摒棄了。想想你的單元測試,如果它們必須靠在方法間維護狀態來工作,這畫面簡直太美我不敢看?。

斷言

如果說 @Test、@Before...、@After... 等注解是一個測試套件的骨架,那么斷言就是它的心臟。準備好測試實例、執行了被測類的方法以后,斷言能確保你得到了想要的結果。否則,就說明當前測試失敗了。

常規斷言

一般的斷言,無非是檢查一個實例的屬性(比如,判空與判非空等),或者對兩個實例進行比較(比如,檢查兩個實例對象是否相等)等。無論哪種檢查,斷言方法都可以接受一個字符串作為***一個可選參數,它會在斷言失敗時提供必要的描述信息。如果提供出錯信息的過程比較復雜,它也可以被包裝在一個 lambda 表達式中,這樣,只有到真正失敗的時候,消息才會真正被構造出來。 

  1. @Test 
  2. void assertWithBoolean() { 
  3.     assertTrue(true); 
  4.     assertTrue(this::truism); 
  5.   
  6.     assertFalse(false, () -> "Really " + "expensive " + "message" + "."); 
  7.   
  8. boolean truism() { 
  9.     return true
  10.   
  11. @Test 
  12. void assertWithComparison() { 
  13.     List<String> expected = asList("element"); 
  14.     List<String> actual = new LinkedList<>(expected); 
  15.   
  16.     assertEquals(expected, actual); 
  17.     assertEquals(expected, actual, "Should be equal."); 
  18.     assertEquals(expected, actual, () -> "Should " + "be " + "equal."); 
  19.      
  20.     assertNotSame(expected, actual, "Obviously not the same instance."); 
  21.  

如你所見,JUnit 5 的 API 并無太多變化。斷言方法的命名是一樣的,方法同樣接受兩個參數,分別是一個期望值與一個實際值。

期望值與實際值的傳入順序非常重要,無論是對于理解測試的內容,還是理解失敗時的錯誤信息,但有時還是很容易弄錯,這點很坑。不過仔細想想,也沒什么更好的辦法,除非你自己創建一個新的斷言框架。既然市面上已有對應的產品如 Hamcrest (ugh!) 和AssertJ (yeah!譯者表示:不太清楚這歡呼的梗在哪里)等,再浪費有限的時間去造輪子明顯不值得。畢竟最重要的是保證你的斷言庫專注于一件事,借鑒已有實現可以節省成本。

哦對了,失敗信息現在是作為***傳入的參數了。我很喜歡這個細節,因為,它讓你專注于真正重要之事——那兩個需被斷言的值。由于擁抱了 Java 8 的緣故,真值斷言方法現在也接受 supplier 參數了,又是一個暖心的小細節。

擴展斷言

除了那種一般的檢查特定實例或屬性的斷言外,還有一些其他類型的斷言。

這里要講的***個甚至都不是個真正的斷言,它做的事就是強行讓測試失敗,并提供一個失敗信息。 

  1. @Test 
  2. void failTheTest() { 
  3.     fail("epicly"); 
  4.  

還有 assertAll 方法,它接受可變數量的斷言作為參數,并保證它們全部得到執行,然后再把錯誤信息(如果有)一并匯報出來。 

  1. @Test 
  2. void assertAllProperties() { 
  3.     Address address = new Address("New City""Some Street""No"); 
  4.   
  5.     assertAll("address"
  6.             () -> assertEquals("Neustadt", address.city), 
  7.             () -> assertEquals("Irgendeinestraße", address.street), 
  8.             () -> assertEquals("Nr", address.number) 
  9.     ); 
  10.   
  1. org.opentest4j.MultipleFailuresError: address (3 failures) 
  2.     expected: <Neustadt> but was: <New City> 
  3.     expected: <Irgendeinestraße> but was: <Some Street> 
  4.     expected: <Nr> but was: <No 

這個特性在檢查對象的多個屬性值時非常有用。按照一般的做法,測試在***個斷言失敗時就會掛掉了,此時只有***個出錯的地方得到提示,而你無法得知其他值的斷言是否成功,只好再跑一遍測試。

***,我們終于有了 assertThrows 和 expectThrows 方法。兩者均會在被測方法未拋出預期異常時失敗。而后者還會返回拋出的異常實例,以用于后續的驗證,比如,斷言異常信息包含正確的信息等。 

  1. @Test 
  2. void assertExceptions() { 
  3.     assertThrows(Exception.class, this::throwing); 
  4.   
  5.     Exception exception = expectThrows(Exception.class, this::throwing); 
  6.     assertEquals("Because I can!", exception.getMessage()); 

 假言/判定(Assumptions)


假言/判定允許你僅在特定條件滿足時才運行測試。這個特性能夠減少測試組件的運行時間和代碼重復,特別是在假言都不滿足的情況下。 

  1. @Test 
  2. void exitIfFalseIsTrue() { 
  3.     assumeTrue(false); 
  4.     System.exit(1); 
  5.   
  6. @Test 
  7. void exitIfTrueIsFalse() { 
  8.     assumeFalse(this::truism); 
  9.     System.exit(1); 
  10.   
  11. private boolean truism() { 
  12.     return true
  13.   
  14. @Test 
  15. void exitIfNullEqualsString() { 
  16.     assumingThat( 
  17.             "null".equals(null), 
  18.             () -> System.exit(1) 
  19.     ); 
  20.  

假言/判定適用于兩種情形,要么是你希望在某些條件不滿足時中止測試,要么是你希望僅當某個條件滿足時才執行(部分)測試。主要的區別是,被中止的測試是以被禁用(disabled)的形式被報告,此時沒有測試任何內容,因為條件得不到滿足。

測試嵌套

在 JUnit 5 中,嵌套測試幾乎不費吹灰之力。你只需要在嵌套的類上添加 @Nested 注解,類中的所有方法即會被引擎執行: 

  1. package org.codefx.demo.junit5; 
  2.   
  3. import org.junit.jupiter.api.BeforeEach; 
  4. import org.junit.jupiter.api.Nested; 
  5. import org.junit.jupiter.api.Test; 
  6.   
  7. import static org.junit.jupiter.api.Assertions.assertEquals; 
  8. import static org.junit.jupiter.api.Assertions.assertTrue; 
  9.   
  10. class Nest { 
  11.      
  12.     int count = Integer.MIN_VALUE; 
  13.      
  14.     @BeforeEach 
  15.     void setCountToZero() { 
  16.         count = 0; 
  17.     } 
  18.      
  19.     @Test 
  20.     void countIsZero() { 
  21.         assertEquals(0, count); 
  22.     } 
  23.      
  24.     @Nested 
  25.     class CountGreaterZero { 
  26.   
  27.         @BeforeEach 
  28.         void increaseCount() { 
  29.             count++; 
  30.         } 
  31.   
  32.         @Test 
  33.         void countIsGreaterZero() { 
  34.             assertTrue(count > 0); 
  35.         } 
  36.   
  37.         @Nested 
  38.         class CountMuchGreaterZero { 
  39.   
  40.             @BeforeEach 
  41.             void increaseCount() { 
  42.                 count += Integer.MAX_VALUE / 2; 
  43.             } 
  44.   
  45.             @Test 
  46.             void countIsLarge() { 
  47.                 assertTrue(count > Integer.MAX_VALUE / 2); 
  48.             } 
  49.   
  50.         } 
  51.   
  52.     } 
  53.      

 如你所見,嵌套類中的 @BeforeEach(及 @AfterEach )注解也工作良好。不過,構造順序似乎還未被寫入文檔,它們的初始化次序是從外向內的。這也讓你能疊加式地為內部類準備測試數據。

如果嵌套的內部測試想要存取外部測試類的字段,那么嵌套類本身不應該是靜態的。但這樣一來也就禁止了靜態方法的使用,因而這種場景下@BeforeAll 和 @AfterAll 方法也就無法使用了(還是說終有他法實現?)

你可能有疑惑,嵌套的內部測試類有什么用。個人而言,我用內部類來漸進測試接口,其他人則多用于保持測試類短小專注。后者同時也有一個經典的例子來說明,例子由 JUnit 團隊提供,它測試了一個棧: 

  1. class TestingAStack { 
  2.   
  3.     Stack<Object> stack; 
  4.     boolean isRun = false
  5.   
  6.     @Test 
  7.     void isInstantiatedWithNew() { 
  8.         new Stack<Object>(); 
  9.     } 
  10.   
  11.     @Nested 
  12.     class WhenNew { 
  13.   
  14.         @BeforeEach 
  15.         void init() { 
  16.             stack = new Stack<Object>(); 
  17.         } 
  18.   
  19.         // some tests on 'stack', which is empty 
  20.   
  21.         @Nested 
  22.         class AfterPushing { 
  23.   
  24.             String anElement = "an element"
  25.   
  26.             @BeforeEach 
  27.             void init() { 
  28.                 stack.push(anElement); 
  29.             } 
  30.   
  31.             // some tests on 'stack', which has one element... 
  32.   
  33.         } 
  34.     } 
  35.  

在上面的例子中,棧的狀態改變會反映到內層的測試類中,其中內部類又基于自身的場景執行了一些測試。

測試命名

JUnit 5 提供了一個注解 @DisplayName,它用以為開發者提供更可讀的測試類和測試方法信息。

上面的 stack 測試例子加上該注解以后就變成這樣: 

  1. @DisplayName("A stack"
  2. class TestingAStack { 
  3.   
  4.     @Test 
  5.     @DisplayName("is instantiated with new Stack()"
  6.     void isInstantiatedWithNew() { /*...*/ } 
  7.   
  8.     @Nested 
  9.     @DisplayName("when new"
  10.     class WhenNew { 
  11.   
  12.         @Test 
  13.         @DisplayName("is empty"
  14.         void isEmpty() { /*...*/ } 
  15.   
  16.         @Test 
  17.         @DisplayName("throws EmptyStackException when popped"
  18.         void throwsExceptionWhenPopped() { /*...*/ } 
  19.   
  20.         @Test 
  21.         @DisplayName("throws EmptyStackException when peeked"
  22.         void throwsExceptionWhenPeeked() { /*...*/ } 
  23.   
  24.         @Nested 
  25.         @DisplayName("after pushing an element"
  26.         class AfterPushing { 
  27.   
  28.             @Test 
  29.             @DisplayName("it is no longer empty"
  30.             void isEmpty() { /*...*/ } 
  31.   
  32.             @Test 
  33.             @DisplayName("returns the element when popped and is empty"
  34.             void returnElementWhenPopped() { /*...*/ } 
  35.   
  36.             @Test 
  37.             @DisplayName( 
  38.                     "returns the element when peeked but remains not empty"
  39.             void returnElementWhenPeeked(){ /*...*/ } 
  40.         } 
  41.     } 
  42.  

這是一份TDDer 看了會感動,BDDer 看了會流淚的測試結果輸出。

 

回顧

差不多就這些了,恭喜你終于讀完了。我們匆匆過完了 JUnit 5 的基本特性,現在,你應該了解了所有寫測試的必備知識了:包括如何為方法添加生命周期注解(@[Before|After][All|Each]、如何注解測試方法本身(@Test)、如何嵌套測試(@Nested)、如何給測試一個好信息(@DisplayName),你也應該能了解斷言和假言判定是如何工作的了(基本上與前版無異)。

不過這可還沒完!我們還沒聊到 測試方法的條件執行,沒聊到非常酷的 參數注入 ,以及 JUnit 5 的擴展機制 和 架構體系 呢。放心,這真的是***了,這些話題我們會一個月后再聊,現在你可以先休息一下啦。 

敬請期待下集!

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2016-09-21 14:17:11

JUnit架構API

2016-09-23 10:20:22

JUnit擴展模型Extension

2011-04-18 11:13:45

2011-08-10 17:04:43

JavaScript

2021-09-16 10:05:09

鴻蒙HarmonyOS應用

2022-02-19 07:41:36

Bean注解項目

2022-02-20 07:28:13

Spring注解用法

2010-05-27 17:41:09

2012-03-30 15:40:34

2021-03-02 12:36:49

MQKafkaRocketMQ

2023-09-21 07:06:17

PSDriveProvider

2024-01-03 07:57:11

高級參數PowerShellVerbose 參數

2018-07-11 13:33:43

大數據人工智能Hadoop

2022-03-28 09:31:58

for循環語句

2014-10-11 09:16:59

互聯網協議

2011-11-29 16:38:58

Knockout

2009-07-07 14:33:44

JSP入門

2021-05-18 07:15:37

Python

2019-10-12 15:06:02

MySQL數據庫命令

2023-05-29 16:25:59

Rust函數
點贊
收藏

51CTO技術棧公眾號

国产精品一区二区视频| 四虎成人精品一区二区免费网站| 国产精品自拍网站| 九九视频这里只有精品| 日本精品一二三区| 在线天堂资源| 国产精品美女一区二区三区| 成人亲热视频网站| 日韩精品久久久久久久| 国产亚洲电影| 日韩一区二区免费电影| www..com日韩| 免费动漫网站在线观看| 久久99精品久久久久久国产越南 | 7777精品伊人久久久大香线蕉经典版下载 | 日韩成人一区二区| 九九精品视频在线观看| 中文字幕在线免费看线人| 国产69精品久久| 一区二区欧美国产| 日韩啊v在线| 国产成人免费看一级大黄| 亚洲在线网站| 欧美成人午夜剧场免费观看| wwwwww日本| 一区二区三区自拍视频| 欧美日韩一区二区三区免费看| 国产女教师bbwbbwbbw| 久久精品蜜桃| 国产成人av电影在线| 国产精品777| 国产亚洲第一页| 日本不卡二三区| 亚洲黄在线观看| 中文字幕色网站| 欧美男女交配| 亚洲成a人在线观看| 亚洲欧美久久久久一区二区三区| 色wwwwww| 国产精品888| 国产欧美日韩91| wwwwww国产| 韩国一区二区三区在线观看| 日日狠狠久久偷偷四色综合免费| aa一级黄色片| 国产精品久久久网站| 8x8x8国产精品| 成人性做爰aaa片免费看不忠| av中文字幕在线观看第一页| 亚洲伦理在线精品| 亚洲一区综合| av在线电影观看| 久久精品人人做人人综合 | 亚洲人成无码网站久久99热国产| 免费观看在线黄色网| 国产农村妇女毛片精品久久麻豆 | 精品少妇爆乳无码av无码专区| 久久中文字幕av| 伊人久久男人天堂| 精品人妻无码一区| 欧美精品色图| 国产一区二区三区丝袜| 韩国女同性做爰三级| 伊甸园亚洲一区| 亚洲精品按摩视频| 一本色道综合久久欧美日韩精品| 国产乱论精品| 亚洲国产精品久久久久秋霞蜜臀| 黄色性视频网站| 哺乳一区二区三区中文视频 | 国产亚洲观看| 91精品国产一区二区人妖| 黄色一级片免费的| 北岛玲精品视频在线观看| 91精品国模一区二区三区| 高潮一区二区三区| 久久av偷拍| 精品久久国产97色综合| 在线观看国产免费视频| 亚洲第一二三区| 亚洲视频在线观看视频| 国产一区在线观看免费| 88国产精品视频一区二区三区| 欧美成人亚洲成人| 日本熟女一区二区| 午夜亚洲影视| 国产精品一区二区久久久| 91一区二区视频| 国产精品69久久久久水密桃| 国产日韩欧美亚洲一区| 国产小视频在线| 国产精品欧美久久久久无广告| 在线视频欧美一区| 欧美人与性动交α欧美精品济南到 | 色欧美乱欧美15图片| 色婷婷成人在线| 亚洲不卡在线| 日韩麻豆第一页| 中文字幕在线观看二区| 欧美a级在线| 奇米四色中文综合久久| 国产熟女一区二区丰满| av一本久道久久综合久久鬼色| 欧美一区二区视频17c| 搞黄网站在线观看| 精品日韩视频在线观看| 日本人69视频| 日韩在线影视| 久久久999精品免费| 四虎永久在线精品| 麻豆一区二区99久久久久| 国产精品推荐精品| av网站在线播放| 亚洲成人av中文| 黄色在线视频网| 91精品导航| 一区二区三区www| 国产精品99精品无码视| 奇米影视在线99精品| 国产精品香蕉视屏| 免费看美女视频在线网站| 午夜电影一区二区三区| 天天综合天天添夜夜添狠狠添| 青青一区二区| 欧美精品一二区| 免费看av在线| caoporn国产精品| 午夜探花在线观看| 精品裸体bbb| 精品亚洲永久免费精品| 青青草免费av| 麻豆成人91精品二区三区| 久久av一区二区三区亚洲| 午夜成年人在线免费视频| 欧美视频在线观看一区二区| 一级特黄a大片免费| 欧美在线看片| 国产在线观看一区二区三区| 久草视频在线看| 欧美日韩在线免费| 偷偷色噜狠狠狠狠的777米奇| 亚洲精品网址| 成人国产精品久久久久久亚洲| 免费av在线电影| 欧美午夜丰满在线18影院| 中文字幕人妻一区| 欧美特黄一级| 99在线影院| av在线free| 欧美精品丝袜中出| 国产大屁股喷水视频在线观看| 日韩在线一区二区三区| 免费99视频| 亚洲v.com| 日韩激情av在线播放| 亚洲精品午夜久久久久久久| 国产成人精品网址| 国产一区二区片| 亚洲综合色婷婷在线观看| 久久电影一区二区| 亚洲第一视频在线| 亚洲一级二级三级| 你懂的在线观看网站| 亚洲国产欧美国产综合一区| 国产美女精品久久久| 99久久精品免费看国产小宝寻花| 精品国产乱码久久久久久久 | 亚洲va国产va欧美va观看| 中文字幕在线观看91| 亚洲一级网站| 精品国产91亚洲一区二区三区www| 2020国产在线| 精品伊人久久97| 久操视频在线免费观看| 国产人成一区二区三区影院| 男女视频在线看| 性欧美69xoxoxoxo| 俄罗斯精品一区二区| 超碰在线视屏| 亚洲人在线视频| 一区不卡在线观看| 亚洲综合激情另类小说区| aaaa黄色片| 日韩黄色小视频| 中文字幕中文字幕一区三区| 欧美第一在线视频| 97国产精品人人爽人人做| 欧美xxx.com| 欧美蜜桃一区二区三区 | 亚洲午夜久久久久久久久电影网 | 99久久婷婷| 丁香五月网久久综合| 日韩激情电影免费看| 夜夜嗨av色综合久久久综合网| 亚洲综合一区中| 亚洲一区二区在线观看视频| 精品人妻一区二区三区香蕉 | 中文字幕欧美日本乱码一线二线| www.成人黄色| 在线亚洲精品| 一本一道久久a久久综合精品| 日韩视频一二区| 韩日欧美一区二区| 麻豆视频在线播放| 日韩精品视频在线观看免费| 亚洲午夜激情视频| 狠狠久久五月精品中文字幕| 欧美风情第一页| 91蜜桃在线免费视频| 黄色aaaaaa| 国产免费成人| 妞干网这里只有精品| 九九热精品视频在线观看| 91视频8mav| 亚洲日本天堂| 欧美人与性动交a欧美精品| 国产资源在线看| 精品精品国产高清a毛片牛牛| 高潮毛片又色又爽免费| 亚洲图片自拍偷拍| 开心激情五月网| 久久久影视传媒| 亚洲美女高潮久久久| 蜜臀av一区二区三区| 大陆极品少妇内射aaaaa| 在线一区电影| 夜夜爽99久久国产综合精品女不卡| 男人的天堂久久| 亚洲综合成人婷婷小说| 久久久免费人体| 日本欧美一级片| 不卡视频观看| 久久久久久久久久久免费| 超碰在线观看免费版| 亚洲欧洲免费视频| 性xxxxbbbb| 亚洲精品一区二区三区99| 国产女18毛片多18精品| 欧美视频一区在线观看| 一级一片免费看| 精品女同一区二区三区在线播放| 久久精品视频9| 夜夜揉揉日日人人青青一国产精品| 精品成人无码一区二区三区| 久久这里都是精品| 欧美bbbbb性bbbbb视频| 91香蕉视频在线| 国产ts丝袜人妖系列视频| 99免费精品在线| 亚洲av无码专区在线播放中文| 国产精品原创巨作av| 又色又爽又黄视频| 久久电影国产免费久久电影| 一区二区三区视频网| 男人的j进女人的j一区| 99热这里只有精品在线播放| 久久久久在线| 成年人黄色片视频| 性感少妇一区| 成年人免费在线播放| 西西裸体人体做爰大胆久久久| 日韩激情免费视频| 亚洲欧美视频一区二区三区| 国产97色在线 | 日韩| 日韩在线一区二区三区| 亚洲欧美自拍另类日韩| 久久国产精品一区二区| 99久久99精品| 国产成人激情av| 亚洲av成人精品一区二区三区| av亚洲精华国产精华精| 亚洲一区视频在线播放| 国产精品久久久久久妇女6080| 精品人妻伦九区久久aaa片| 一区二区三区四区激情| 日韩av在线播放观看| 色哟哟精品一区| 中文字幕免费在线看| 91精品一区二区三区在线观看| 国产黄色片网站| 亚洲第一区在线观看| 蜜桃免费在线| 久久久97精品| 18aaaa精品欧美大片h| 日韩av观看网址| 亚洲精品三区| 99精彩视频在线观看免费| 台湾佬综合网| 性欧美精品一区二区三区在线播放 | 国产女人18毛片水真多18| 2020日本不卡一区二区视频| 亚洲一区视频在线播放| 一级女性全黄久久生活片免费| 日韩 欧美 中文| 欧美天天综合网| 亚洲伦理在线观看| 亚洲人成网站免费播放| 国产在线激情视频| 性欧美办公室18xxxxhd| 另类一区二区三区| 国新精品乱码一区二区三区18| 国产探花在线精品一区二区| 欧美做受777cos| 午夜在线视频观看日韩17c| 一级 黄 色 片一| 不卡视频在线看| www.黄色com| 亚洲国产精品一区二区久久恐怖片 | 亚洲第一精品网站| 中文字幕av日韩| 欧美黄色视屏| 国产精品丝袜视频| 久久久伦理片| 最近看过的日韩成人| 亚洲欧美清纯在线制服| av在线网站免费观看| 久久免费视频色| 欧美成人精品一区二区免费看片 | 国产精品sss| 日韩电影免费在线观看| 蜜桃传媒一区二区三区| 国产麻豆9l精品三级站| 日韩一区二区a片免费观看| 亚洲已满18点击进入久久| 精品国产青草久久久久96| 亚洲国产精品系列| av大全在线| 国产精品一区二区久久久| 精品在线99| 你真棒插曲来救救我在线观看| 国产一区亚洲一区| 夜夜春很很躁夜夜躁| 精品久久香蕉国产线看观看gif| 国产日韩一级片| 中文日韩在线观看| 网友自拍亚洲| 精品在线不卡| 欧美网站在线| 久久久久亚洲av无码麻豆| 中文一区二区在线观看| 欧美激情黑白配| 亚洲国产小视频| av丝袜在线| 鬼打鬼之黄金道士1992林正英| 亚洲综合自拍| 天堂中文av在线| 国产精品久久久爽爽爽麻豆色哟哟| 中文字幕在线欧美| 亚洲精品中文字| 久草在线资源站手机版| 国产一区二区不卡视频在线观看| 欧美日韩一区二区三区四区在线观看| www.夜夜爽| 国产精品欧美一区喷水| 亚洲自拍偷拍另类| 日韩最新中文字幕电影免费看| 欧美少妇激情| 伊人久久av导航| 精品影视av免费| 韩国一级黄色录像| 欧美一区二区三区在线电影| 黄色网址在线免费| 亚洲最大福利网| 国产精品www.| 五月天激情小说| 婷婷成人激情在线网| 欧美成人综合在线| 国产精品免费观看在线| 91综合在线| 波多野结衣电影免费观看| 亚洲国产综合91精品麻豆| 农村少妇久久久久久久| 4438全国成人免费| 精品国产一区二区三区四区| 日本在线观看免费视频| 国产精品成人在线观看| 99精品免费观看| 久久久久久久久爱| 亚洲成人一品| 奇米影视四色在线| 一区二区在线观看不卡| 五月激情婷婷综合| 国产精品成人va在线观看| 99免费精品| 美女伦理水蜜桃4| 欧美性少妇18aaaa视频| 8888四色奇米在线观看| 91原创国产| 免费永久网站黄欧美| 日韩免费av一区| 亚洲成色999久久网站| 日韩一区二区三区在线免费观看| 一本久久a久久精品vr综合 | 国产极品jizzhd欧美| 婷婷激情图片久久| 一级黄色片毛片| 欧美午夜精品久久久久久孕妇| 中国av在线播放| 久久亚洲免费| 韩国av一区二区|