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

JUnit 5系列之擴展模型(Extension Model)介紹

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

概述

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

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

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

目錄

  • JUnit 4 的擴展模型

* Runners(運行器)

* Rules(規則)

* 現狀

  • JUnit 5 的擴展模型

* 擴展點

* 無狀態

* 應用擴展

* 自定義注解

  • 例子
  • 回顧總結
  • 分享&關注

「譯者注:本篇的 Runner,統一譯為“運行器”;Rule,統一譯為“規則”。雖不一定完全達義,但語義未損失太多。在每小節***次出現處會以中英標注,其后全部使用中文?!?/p>

JUnit 4 的擴展模型

我們先來看看 JUnit 4 中是如何實現擴展的。在 JUnit 4 中實現擴展主要是通過兩個,有時也互有重疊的擴展機制:運行器(Runners)和規則(Rules)。

運行器(Runners)

測試運行器負責管理諸多測試的生命周期,包括它們的實例化、setup/teardown 方法的調用、測試運行、異常處理、發送消息等。在 JUnit 4 提供的運行器實現中,它負責了這所有的事情。

在 JUnit 4 中,擴展 JUnit 的唯一方法是:創建一個新的運行器,然后使用它標記你新的測試類:@Runwith(MyRunner.class)。這樣 JUnit 就會識別并使用它來運行測試,而不會使用其默認的實現。

這個方式很重,對于小定制小擴展來說很不方便。同時它有個很苛刻的限制:一個測試類只能用一個運行器來跑,這意味著你不能組合不同的運行器。也即是說,你不能同時享受到兩個以上運行器提供的特性,比如說不能同時使用 Mockito 和 Spring 的運行器,等。

規則(Rules)

為了克服這個限制,JUnit 4.7 中引入了規則的概念,它是指測試類中特別的注解字段。 JUnit 4 會把測試方法(與一些其他的行為)包裝一層傳給規則。規則因此可以在測試代碼執行前后插入,執行一些代碼。很多時候在測試方法中也會直接調規則類上的方法。

這里有一個例子,展示的是 temporary folder (臨時文件夾)規則: 

  1. public static class HasTempFolder { 
  2.     @Rule 
  3.     public TemporaryFolder foldernew TemporaryFolder(); 
  4.   
  5.     @Test 
  6.     public void testUsingTempFolder() throws IOException { 
  7.         File createdFilefolder.newFile("myfile.txt"); 
  8.         File createdFolderfolder.newFolder("subfolder"); 
  9.         // ... 
  10.     } 

因為 @Rule 注解的存在,JUnit 會先把測試方法 testUsingTempFolder 包裝成一個可執行代碼塊,傳給 folder 規則。這個規則的作用是執行時, 由 folder 創建一個臨時目錄,執行測試,測試完成后刪除臨時目錄。因此,在測試內部可以放心地在臨時目錄下創建文件和文件夾。

當然還有其他的規則,比如允許你在 Swing 的事件分發線程中執行測試 的規則,負責連接和斷開數據庫的規則,以及讓運行過久的測試直接超時的規則等。

規則特性其實已經是個很大的改進了,不過仍有局限,它只能在測試運行之前或之后定制操作。如果你想在此之外的時間點進行擴展,這個特性也無能為力了。

現狀

總而言之,在 JUnit 4 中存在兩種不同的擴展機制,兩者均各有局限,并且功能還有重疊的部分。在 JUnit 4 下編寫干凈的擴展是很難的事。此外,即使你嘗試組合兩種不同的擴展方式,通常也不會一帆風順,有時它可能根本不按照開發者期望的方式工作。

[[172039]]

 

JUnit 5 的擴展模型

Junit Lambda 項目成立伊始便有幾點核心準則,其中一條便是“擴展點優于新特性”。這個準則其實也就是新版本 JUnit 中最重要的擴展機制了——并非唯一,但無疑是最重要之一。

擴展點

JUnit 5 擴展可以聲明其主要關注的是測試生命周期的哪部分。JUnit 5 引擎在處理測試時,它會依次檢查這些擴展點,并調用每個已注冊的擴展。大體來說,這些擴展點出現次序如下:

  • 測試類實例 后處理
  • BeforeAll 回調
  • 測試及容器執行條件檢查
  • BeforeEach 回調
  • 參數解析
  • 測試執行前
  • 測試執行后
  • 異常處理
  • AfterEach 回調
  • AfterAll 回調

(如果上面有你覺得不甚清晰或理解的點,請不用擔心,我們接下來會挑其中的一些來講解。)

每個擴展點都對應一個接口。接口方法會接受一些參數,一些擴展點所處生命周期的上下文信息。比如,被測實例與方法、測試的名稱、參數、注解等信息。

一個擴展可以實現任意個以上的接口方法,引擎會在調用它們時傳入相應的上下文信息作為參數。有了這些信息,擴展就可以放心地實現所需的功能了。

無狀態

這里我們需要考慮一個重要的細節:引擎對擴展實例的初始化時間、實例的生存時間未作出任何規約和保證,因此,擴展必須是無狀態的。如果一個擴展需要維持任何狀態信息,那么它必須使用 JUnit 提供的一個倉庫(store)來進行信息讀取和寫入。

這樣做的原因有幾個:

  • 擴展的初始化時機和方式對引擎是未知的(每個測試實例化一次?每個類實例化一次?還是每次運行實例化一次?)。
  • JUnit 不想額外維護和管理每個擴展創建的實例。
  • 如果擴展之間想要進行通信,那么無論如何 JUnit 都必須提供一個數據交互的機制。

應用擴展

創建完擴展后,接下來需要做的就僅僅是告訴 JUnit 它的存在。這可以通過在需要使用該擴展的測試類或測試方法上添加一個@ExtendWith(MyExtension.class) 簡單實現。

其實,還有另一種更簡明的方式。不過要理解那種方式,我們必須先看一下 JUnit 的擴展模型中還有哪些內容。

自定義注解

JUnit 5 的 API 大部分是基于注解的,而且引擎在檢查注解時還做了些額外的工作:它不僅會查找字段、類、參數上應用的注解,還會注解上的注解。引擎會把找到的所有注解都應用到被注解元素上。注解另一個注解可以通過所謂的元注解做到,酷的是 Junit 提供的所有注解都說得上是元注解了。

它的意義在于,JUnit 5 中我們就能夠創建并組合不同的注解了,并且它們具備組合多個注解特性的能力: 

  1. /** 
  2.  * We define a custom annotation that: 
  3.  * - stands in for '@Test' so that the method gets executed 
  4.  * - has the tag "integration" so we can filter by that, 
  5.  *   e.g. when running tests from the command line 
  6.  */ 
  7. @Target({ElementType.TYPE, ElementType.METHOD}) 
  8. @Retention(RetentionPolicy.RUNTIME) 
  9. @Test 
  10. @Tag("integration"
  11. public @interface IntegrationTest { }  

這個自定義的“集成測試”注解 @IntegrationTest 可以這樣使用: 

  1. @IntegrationTest 
  2. void runsWithCustomAnnotation() { 
  3.     // this gets executed 
  4.     // even though `@IntegrationTest` is not defined by JUnit 
  5.  

進一步我們可以為擴展使用更簡明的注解: 

  1. @Target({ ElementType.TYPE, ElementType.METHOD, ElementType.ANNOTATION_TYPE }) 
  2. @Retention(RetentionPolicy.RUNTIME) 
  3. @ExtendWith(ExternalDatabaseExtension.class) 
  4. public @interface Database { }  

現在我們可以直接使用 @Database 注解了,而不需要再聲明測試應用了特定的擴展@ExtendWith(ExternalDatabaseExtension.class)。并且由于我們把注解類型 ElementType.ANNOTATION_TYPE 也添加到擴展支持的目標類型中去了,因此該注解也可以被我們或他人進一步的使用、組合。

例子

假設現在有個場景,我想量化一下測試運行花費的時間。首先,可以先創建一個我們想要的注解: 

  1. @Target({ TYPE, METHOD, ANNOTATION_TYPE }) 
  2. @Retention(RetentionPolicy.RUNTIME) 
  3. @ExtendWith(BenchmarkExtension.class) 
  4. public @interface Benchmark { }  

注解聲明其應用了 BenchmarkExtension 擴展,這是我們接下來要實現的。TODOLIST 如下:

  • 計算所有測試類的運行時間,在所有測試執行前保存其起始時間
  • 計算每個測試方法的運行時間,在每個測試方法執行前保存其起始時間
  • 在每個測試方法執行完畢后,獲取其結束時間,計算并輸出該測試方法的運行時間
  • 在所有測試類執行完畢后,獲取其結束時間,計算并輸出所有測試的運行時間
  • 以上操作,僅對所有注解了 @BenchMark 的測試類或測試方法生效

***一點需求可能不是一眼便能發現。如果一個方法并未注解 @Benchmark 注解,它有什么可能被我們的擴展處理? 一個語法上的原因是,如果一個擴展被應用到了一個類上,那么它默認也會應用到類中的所有方法上。因此,如果我們的需求是計算整個測試類的運行時間,但不需具體到類中每個單獨方法的運行時間時,類中的測試方法就必須被手動排除。這點我們可以通過單獨檢查每個方法是否應用了注解來做到。

有趣的是,需求的前四點與擴展點中的其中四個是一一對應的:BeforeAll、BeforeTestExecution、AfterTestExecution 與 AfterAll。因此我們要做的任務便是實現這四個對應的接口。具體實現很簡單,把上面說的翻譯成代碼即是: 

  1. public class BenchmarkExtension implements 
  2.         BeforeAllExtensionPoint, BeforeTestExecutionCallback, 
  3.         AfterTestExecutionCallback, AfterAllExtensionPoint { 
  4.   
  5.     private static final Namespace NAMESPACE = 
  6.             Namespace.of("BenchmarkExtension"); 
  7.   
  8.     @Override 
  9.     public void beforeAll(ContainerExtensionContext context) { 
  10.         if (!shouldBeBenchmarked(context)) 
  11.             return
  12.   
  13.         writeCurrentTime(context, LaunchTimeKey.CLASS); 
  14.     } 
  15.   
  16.     @Override 
  17.     public void beforeTestExecution(TestExtensionContext context) { 
  18.         if (!shouldBeBenchmarked(context)) 
  19.             return
  20.   
  21.         writeCurrentTime(context, LaunchTimeKey.TEST); 
  22.     } 
  23.   
  24.     @Override 
  25.     public void afterTestExecution(TestExtensionContext context) { 
  26.         if (!shouldBeBenchmarked(context)) 
  27.             return
  28.   
  29.         long launchTime = loadLaunchTime(context, LaunchTimeKey.TEST); 
  30.         long runtime = currentTimeMillis() - launchTime; 
  31.         print("Test", context.getDisplayName(), runtime); 
  32.     } 
  33.   
  34.     @Override 
  35.     public void afterAll(ContainerExtensionContext context) { 
  36.         if (!shouldBeBenchmarked(context)) 
  37.             return
  38.   
  39.         long launchTime = loadLaunchTime(context, LaunchTimeKey.CLASS); 
  40.         long runtime = currentTimeMillis() - launchTime; 
  41.         print("Test container", context.getDisplayName(), runtime); 
  42.     } 
  43.   
  44.     private static boolean shouldBeBenchmarked(ExtensionContext context) { 
  45.         return context.getElement() 
  46.                 .map(el -> el.isAnnotationPresent(Benchmark.class)) 
  47.                 .orElse(false); 
  48.     } 
  49.   
  50.     private static void writeCurrentTime( 
  51.             ExtensionContext context, LaunchTimeKey key) { 
  52.         context.getStore(NAMESPACE).put(key, currentTimeMillis()); 
  53.     } 
  54.   
  55.     private static long loadLaunchTime( 
  56.             ExtensionContext context, LaunchTimeKey key) { 
  57.         return (Long) context.getStore(NAMESPACE).remove(key); 
  58.     } 
  59.   
  60.     private static void print( 
  61.             String unit, String displayName, long runtime) { 
  62.         System.out.printf("%s '%s' took %d ms.%n", unit, displayName, runtime); 
  63.     } 
  64.   
  65.     private enum LaunchTimeKey { 
  66.         CLASS, TEST 
  67.     } 
  68.  
  69. 「譯者:啊這代碼讓人心曠神怡。」  

上面代碼有幾個地方值得留意。首先是 shouldBeBenchmarked 方法,它使用了 JUnit 的 API 來獲取當前元素是否(被元)注解了@Benchmark 注解;其次, writeCurrentTime / loadLaunchTime 方法中使用了 Junit 提供的 store 以寫入和讀取運行時間。

源代碼在 Github 上可以找到。

下篇博文我會探討條件執行的測試以及參數注入部分的內容,同時為你展示如何使用其對應的擴展點。如果你已經迫不及待了,那么請先參考這篇博客,它展示了將應用了兩個規則(條件性禁用測試 及 臨時目錄)的 Junit 4 測試改裝成 JUnit 5 測試的方法。

總結回顧

通過本文我們了解到,在創建整潔、強大及可組合的擴展上,JUnit 4 提供的運行器和規則特性不夠理想。為了超越這些限制,JUnit 5 引入了一個更通用的概念:擴展點。它允許自定義的擴展主動聲明,它需要在一個測試的什么節點上去介入。同時,我們還看到如何使用元注解來輕松地自定義注解。

我希望聽到你的想法和反饋。

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

2016-09-21 14:17:11

JUnit架構API

2016-09-23 10:34:32

JUnitGradleAgile

2011-12-26 10:49:27

JavaJUnitRunner

2011-12-01 14:40:18

JUnitJava

2023-03-03 08:18:41

2011-12-26 10:38:28

JavaJUnitRule

2024-05-06 07:58:23

MoE模型系統

2022-02-19 07:41:36

Bean注解項目

2022-02-20 07:28:13

Spring注解用法

2024-03-20 08:31:40

KotlinExtension計算

2012-02-07 09:08:50

Feed4JUnitJava

2025-03-06 07:28:31

DeepSeek大模型人工智能

2025-02-17 08:00:00

DeepSeek模型AI

2025-02-13 11:00:30

2023-09-21 07:06:17

PSDriveProvider

2024-01-03 07:57:11

高級參數PowerShellVerbose 參數

2010-10-28 13:38:06

IBMeX5MAX5內存擴展

2017-04-24 12:07:44

Spark大數據并行計算

2009-12-30 10:32:04

擴展ADO.NET

2009-03-26 19:38:05

四核英特爾服務器
點贊
收藏

51CTO技術棧公眾號

九九九在线观看| www.亚洲天堂网| 天码人妻一区二区三区在线看| 国产精品麻豆| 亚洲国产精品二十页| 97视频在线观看免费| 色婷婷综合在线观看| 欧美猛烈性xbxbxbxb| 久久国产高清| 日韩精品亚洲元码| 91视频最新入口| 免费看黄色一级视频| 欧美在线黄色| 宅男噜噜噜66一区二区66| 国产99午夜精品一区二区三区 | 亚洲国产毛片完整版| 色哟哟免费网站| 国产精品久久久久久免费免熟| 欧美肉体xxxx裸体137大胆| 色婷婷亚洲综合| 欧美日韩电影一区二区| 国产成人在线视频观看| 亚州国产精品| 91电影在线观看| 亚洲福利av| 国产又爽又黄免费软件| 中文精品久久| 精品国产污网站| 阿v天堂2018| 视频在线观看你懂的| 久久国产精品99国产| 国产一区二区av| 国产精品久久久久9999小说| 午夜精品一区| 国产经典欧美精品| 亚州av一区二区| 五级黄高潮片90分钟视频| 欧美粗大gay| 国产色产综合色产在线视频| 国产精品久久久av| 亚洲欧美卡通动漫| 永久免费精品视频| 欧美日韩中文字幕综合视频| 色之综合天天综合色天天棕色| 亚洲视频在线观看免费视频| 欧美日韩第一区| 亚洲欧美日韩国产成人| 久热在线视频观看| 成人观看网址| 国产精品久久久久一区二区三区 | 久久久蜜桃精品| 国产精品网红直播| 久久精品波多野结衣| 丝袜美腿一区二区三区动态图 | 一级黄色片视频| 欧美激情第8页| 日韩精品极品毛片系列视频| www日韩在线观看| 人妖欧美1区| 国产欧美一区二区精品性色超碰| 亚洲伊人一本大道中文字幕| 欧美一二三区视频| 久久中文字幕av| 精品国产电影一区二区| 99热手机在线| 蜜臀av在线| 久久久久久久久久久电影| 亚洲综合日韩在线| 人妻 日韩精品 中文字幕| 国产精品毛片久久| 亚洲欧美中文字幕在线一区| 男男受被啪到高潮自述| 国产韩日精品| 亚洲va欧美va人人爽| 亚洲图片在线观看| 欧美中文在线| eeuss鲁片一区二区三区在线观看| 国产在线视频2019最新视频| 国产区一区二区三| 亚洲东热激情| 欧美精品免费在线观看| 91禁男男在线观看| 精品一区毛片| 亚洲精品美女免费| 最新版天堂资源在线| 国产一区二区三区黄网站| 在线观看日韩电影| 黄色一级片播放| 黄网在线免费看| 一区二区三区在线影院| 宅男一区二区三区| 91在线网址| 国产日本欧美一区二区| 美日韩精品免费| 手机看片国产1024| 成人av片在线观看| 国产精品视频免费一区| 国内毛片毛片毛片毛片| 国模无码大尺度一区二区三区| 国产精品一区二区三| 亚洲天堂视频在线播放| 日韩影院精彩在线| 日韩av高清不卡| 人妻丰满熟妇av无码区| 校园激情久久| 日本精品视频在线| 亚洲 欧美 日韩 在线| 久久精选视频| 日韩69视频在线观看| 亚洲大片免费观看| 日韩国产精品久久| 国产精品视频一区二区高潮| 中文字幕人妻色偷偷久久| 蜜桃视频免费观看一区| 国产精品一区二区三区久久| 中文字幕第315页| 美洲天堂一区二卡三卡四卡视频| 国产精品人成电影在线观看| 亚洲一区二区人妻| 国内精品免费在线观看| 国产精品嫩草在线观看| 日本波多野结衣在线| 91视频一区二区三区| 欧美男人的天堂| 成人精品一区二区三区校园激情| 国产精品久久久久久福利一牛影视 | 成人美女视频在线观看| 国模一区二区三区私拍视频| 先锋av资源站| 欧美激情一区二区三区在线| 最新精品视频| 爱福利在线视频| 欧美日韩一区二区在线| 久久国产这里只有精品| 日本超碰一区二区| 亚洲精品美女在线观看| 最新中文字幕av| 亚洲精品成人影院| 91av在线国产| 一区二区三区精彩视频| 成人免费视频app| 欧美影视一区二区| 国产日产一区二区三区| 好吊成人免视频| 亚洲精品自拍网| 国产精品调教视频| 伊人久久综合97精品| 亚洲熟女www一区二区三区| 欧美韩国一区| 国产精品扒开腿爽爽爽视频| 国产裸体无遮挡| 久久综合久久久久88| 国产精品av免费| 日本不卡1234视频| 91精品国产综合久久久蜜臀图片| aaaaa一级片| 欧美69视频| 国产成人在线亚洲欧美| 国产黄色免费大片| 国产精品无码永久免费888| 亚洲激情免费视频| 自拍偷自拍亚洲精品被多人伦好爽| 欧美精品久久天天躁| 免费的av网站| 最新国产精品| 国产精品久久久久久久久久久久久| 丰满人妻一区二区三区免费视频| 中文字幕av在线一区二区三区| 国产青草视频在线观看| 涩涩涩久久久成人精品| 亚洲天堂成人在线| 国产亚洲精品久久久久久打不开| 美女在线一区二区| 美女黄毛**国产精品啪啪| 欧美草逼视频| 制服视频三区第一页精品| 国产人妻大战黑人20p| 亚洲黄色av| 亚洲伊人久久综合| 久操视频在线播放| 欧美视频中文字幕| 国产美女精品久久| 99伊人成综合| 国产精品乱码一区二区三区| av片在线观看免费| 717成人午夜免费福利电影| 国产无遮挡在线观看| 久久中文字幕一区二区三区| 久久婷婷开心| 黄色在线网站噜噜噜| 亚洲国产私拍精品国模在线观看| 亚洲欧美一区二区三区四区五区| 精品制服美女丁香| 亚洲精品在线视频观看| 99re久久| 日韩亚洲在线观看| 91亚洲国产成人精品一区| 中文字幕日韩一区| 中文字幕 欧美日韩| 日韩在线第七页| 国产精品视频一区二区三区四| av在线播放网| 欧美无乱码久久久免费午夜一区 | 日本一区二区在线不卡| 粗暴91大变态调教| 在线一级成人| 国产精品久久久久77777| 97电影在线看视频| 欧美精品aⅴ在线视频| 免费国产羞羞网站美图| 国产麻豆欧美日韩一区| 日本香蕉视频在线观看| 国内毛片久久| 欧美最猛性xxxxx免费| 九色在线视频蝌蚪| 欧美日韩一区二区三区不卡| 午夜三级在线观看| 国产黄色91视频| 久久久久免费看黄a片app| 欧美深夜视频| 国产成人精品av在线| 91社区在线| 欧美一级高清大全免费观看| 日本中文字幕在线免费观看| 久久你懂得1024| 亚洲综合婷婷久久| 国产精品v一区二区三区| 精品国产一二| 欧美va视频| 久久精品国产欧美亚洲人人爽| 亚洲av综合色区无码一二三区| 性感美女极品91精品| 少妇久久久久久久久久| 久久99精品久久久久久| 国产精品久久久久7777| 美女毛片一区二区三区四区最新中文字幕亚洲| 国产成人精品在线播放| 成人在线直播| 国产丝袜一区视频在线观看| 国产一区二区三区三州| 偷拍一区二区三区四区| 女教师淫辱の教室蜜臀av软件| 国产福利视频一区二区三区| 久激情内射婷内射蜜桃| 欧美日韩老妇| 国产精品久久波多野结衣| 日韩免费小视频| 欧美成人三级视频网站| 青青草娱乐在线| 日韩一级视频免费观看在线| 无码人妻精品一区二区三区不卡 | 日本在线精品| 欧美美女操人视频| 国产免费av高清在线| 精品国产免费一区二区三区香蕉| 一级黄色录像在线观看| 97精品视频| 久久riav二区三区| 国产精品3区| 51ⅴ精品国产91久久久久久| 秋霞午夜在线观看| 精品偷拍一区二区三区在线看| 一级全黄少妇性色生活片| 精品久久久精品| 美女福利视频在线观看| 国产精品久久久久久久浪潮网站| 中文字幕乱码一区| 国产在线麻豆精品观看| 久久精品视频91| 亚洲激情自拍| 在线观看污视频| 色777狠狠狠综合伊人| 久久综合九九| 国产精品高潮呻吟久久久久| 91网站免费看| 成人激情久久| 国产伦精品免费视频| 国产不卡网站| 亚州国产精品久久久| 黄色美女视频在线观看| 久久影视电视剧免费网站清宫辞电视| 国产毛片在线| 亚洲日本aⅴ片在线观看香蕉| 欧洲成人一区二区三区| 日韩三级视频在线看| 97在线视频人妻无码| 欧美性受xxxx黑人xyx性爽| 成年人视频在线免费看| 香蕉影视欧美成人| 国产无遮挡裸体免费视频| 亚洲黄色性网站| 久久免费看少妇高潮v片特黄| 国产精品麻豆久久久| 国产又粗又硬视频| 日本一区二区三区在线不卡| 国产传媒国产传媒| 国产色91在线| 美国黄色特级片| 中国色在线观看另类| 懂色av蜜臀av粉嫩av永久| 中文字幕乱码亚洲精品一区| 手机看片福利视频| 国产精品无码永久免费888| 日本综合在线观看| 国产精品美女久久久久aⅴ | 国产一区毛片| 欧美性bbwbbwbbwhd| 国产成人短视频在线观看| 蜜桃av色综合| 少妇一区二区视频| 亚洲成人蜜桃| 国产精品久久久久久久免费观看| 国产高清免费在线| 欧美久久影院| 欧美精品久久久久久久免费| 国产精品综合| 亚洲国产精品三区| 韩国女主播成人在线观看| 免费不卡av网站| 成人毛片在线观看| 久久精品国产亚洲av麻豆| 国产欧美精品国产国产专区 | 日韩国产一区| 天堂v在线视频| 黑丝一区二区| 日韩av资源在线| 另类小说视频一区二区| 91香蕉视频免费看| 菠萝蜜视频在线观看一区| 男人天堂av电影| 国产精品久久久久天堂| 久久久精品视频免费| 色婷婷综合久久| 国产又大又长又粗| 亚洲级视频在线观看免费1级| 国产尤物视频在线| 九九精品在线观看| 欧美大胆性生话| 91成人理论电影| 任你弄精品视频免费观看| 亚洲韩国在线| 伊人久久成人| 日本中文字幕高清| 粉嫩av一区二区三区| 亚洲第一综合网| 亚洲午夜日本在线观看| 国产精品第6页| 欧美成人精品高清在线播放 | 97se亚洲国产综合自在线观| 国产黄色大片免费看| 亚洲国产日产av| 一本色道久久综合熟妇| 亚洲国产精久久久久久| 日韩在线资源| 91高潮在线观看| 99国内精品久久久久| 久久riav| 欧美日韩亚洲一区| 蜜桃免费在线视频| 成人97人人超碰人人99| 开心激情五月网| 一本色道久久综合精品竹菊| www.热久久| 色噜噜久久综合伊人一本| 超级碰碰久久| 国产一区二区三区高清视频| 国产精品88久久久久久| 国产熟人av一二三区| eeuss国产一区二区三区| 动漫性做爰视频| 欧美午夜精品免费| 视频在线不卡| 韩国国内大量揄拍精品视频| 高清精品久久| 亚洲欧洲精品在线| 葵司免费一区二区三区四区五区| 一级少妇精品久久久久久久| 亚洲免费资源在线播放| 中文字幕日本人妻久久久免费 | 亚洲自拍偷拍精品| 亚洲天天做日日做天天谢日日欢| 无码人妻熟妇av又粗又大| 亚洲国产精品中文| 国产精品—色呦呦| 亚洲最大的免费| 国产精品99视频| 成 人 黄 色 小说网站 s色| 日本一区二区免费在线观看视频| 国产区一区二区三| 亚洲精品美女在线观看| 草草视频在线| 国产精品区一区二区三在线播放| 欧美国产综合| 欧美老女人bb| 亚洲黄色尤物视频| 精品人妻一区二区三区蜜桃| 欧美成人精品一区| 欧美中文高清| 久久久国内精品| 国产a视频精品免费观看|