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

簡化Java單元測試數據

開發
EasyModeling可以幫助 Java 單元測試的編寫者快速構造用于測試的數據模型實例,簡化 Java 項目在單元測試中準備測試數據的工作,在提高編寫效率的同時,使單元測試更加整潔易讀。

作者 | 張哲

EasyModeling 是我在2021年圣誕假期期間開發的一個 Java 注解處理器,采用 Apache-2.0 開源協議。它可以幫助 Java 單元測試的編寫者快速構造用于測試的數據模型實例,簡化 Java 項目在單元測試中準備測試數據的工作,在提高編寫效率的同時,使單元測試更加整潔易讀。經過一年的維護,EasyModeling 已經在幾個 Thoughtworks 內部的項目上得到了應用,并迭代發布了幾個版本。

單元測試中的數據準備的困難

在企業級應用軟件開發項目中編寫測試代碼時,針對特定的測試場景,我們需要準備相應的測試數據,以驗證被測組件在給定輸入下的行為。在使用 Java 語言的項目中,這些準備測試數據的代碼體現為創建各種“數據模型類”的實例。這里的數據模型類,可以包括聚合模型(Aggregation Model)、數據傳遞模型(DTO)、值對象(VO)以及存儲模型(Persist Model)等等。無論是對服務組件的測試,還是對數據模型本身的測試,我們都無可避免地需要構建這些數據模型類的實例。

在項目的起初階段,準備數據的工作是簡單的,我們只需要調用數據模型類的構造方法,傳入適當的參數來創建實例即可。單元測試代碼的規模不會太大,也尚且清晰易讀。

但是隨著產品開發工作的展開,一方面,項目中使用的這些數據模型會變得越來越復雜;另一方面,測試場景也會變得越來越多。經驗上,在經過幾個版本迭代的企業級應用 Java 代碼中,我們通常不難找出一些擁有十幾個、甚至幾十個成員變量的數據模型類,并且它們之間還存在著復雜的相互持有、嵌套、繼承的關系。這些數據模型類往往都是項目中的核心組件,故而也成為單元測試需要重點關注的組件。相應地,在涉及這些數據模型的單元測試中,為準備測試數據而編寫的初始化數據模型類的代碼量也會越來越大、越來越復雜。

這些冗雜繁復的數據初始化代碼會影響單元測試本身的代碼質量,造成單元測試編寫成本高、易讀性差、易維護性低等問題。而單元測試的質量又與生產代碼的質量息息相關。例如,單元測試的編寫成本過高,會使開發者越來越傾向于僅在已有測試基礎上做修改,而不是為每個場景創建單獨的測試,造成單個測試的職責過多;甚至使開發者放棄單元測試,降低了團隊對產品質量的信心。又比如,單元測試的易讀性差,導致單元測試無法承擔起“測試即文檔(tests as documentation)”的職責。而單元測試的易維護性低,則導致了代碼很難被重構,從而單元測試不僅沒有為重構提供信心,反而變成重構的桎梏。

具體來說,這些初始化數據的代碼會引起三個方面的問題:

  • 對測試場景的描述不清晰
  • 構建測試數據的代碼重復
  • 初始化數據模型代碼的膨脹

我們可以從下面的例子中略窺端倪。你是否在你的項目中見過這樣的單元測試?

圖片圖片

這是一段典型的使用JUnit測試框架的單元測試代碼。在這段單元測試代碼中,被測對象是 leaveCalculator 組件的 annualLeave 方法。我們首先創建一位員工,如(a)處;然后將創建好的員工對象傳入 annualLeave 方法,為其計算出應得的年假數額,如(2)處;最后斷言他應該享有20天年假,如(3)處。為了簡化討論,我們暫且假設此處 annualLeave 方法的業務規則是:員工應得的年假數額只與這位員工加入公司的時間(date of joining)相關,即在代碼中 (1) 處初始化的日期。

我們來詳細分析這段測試代碼中存在的壞味道、以及其潛在的問題。

對測試場景的描述不清晰

如前文所述,我們假設這段單元測試代碼的目的是驗證“入職超過5年的員工應該享有20天年假”這個業務規則。那么顯然,其中只有 (1), (2), (3) 這三處是與當前測試場景相關的,它們共同構成了對上述業務規則的描述。而在 (1) 處之前傳入 Employee 類構造方法的那些參數都是與當前測試場景無關的。遺憾的是,這些與測試場景無關的代碼卻占據了這個代碼片段中的絕大部分代碼行。

在實際項目中,我們會見到很多這樣的單元測試,它們往往需要用幾十行的代碼來準備復雜的測試數據,需要初始化數個數據模型類的對象,以支持對被測組件的調用,然而這些代碼中真正在描述測試場景的,卻只有其中區區幾行、甚至一兩行。這不僅增加了測試的篇幅,還會導致閱讀者無法快速聚焦在有意義的初始化條件上。就像我們在這個例子中看到的,描述測試場景的代碼行(1)處混雜在大量初始化測試數據的代碼行之中,造成了單元測試對測試場景的描述不聚焦。這使單元測試的閱讀者很難從這段測試代碼中一目了然地理解測試的意圖,更遑論以測試為文檔來理解業務規則。而在測試失敗時,也無法快速從測試場景的數據構造出發去定位問題。

一些有經驗的單元測試編寫者已經注意到了這個問題,他們會在關鍵的測試數據初始化行末添加一些注釋以示強調。然而注釋本身就預示著代碼壞味道,并且在重構中也是非常不安全的,甚至反而誤導讀者。

構建測試數據的代碼重復

如果將目光從單個測試放大到單元測試組(Test Suit),我們會發現在針對同一個被測組件的不同測試場景下,初始化數據模型的代碼會大量重復。例如在針對員工年假數額計算(leaveCalculator 組件的 annualLeave 方法)的測試組中,假設按照業務規則,我們需要考慮以下的測試場景:

  1. 入職不足2年的員工,應該享有10天年假;
  2. 當年入職的員工,享有按照入職時間折算的年假數額;
  3. 入職超過2年,而不足5年的員工,應該享有15天年假;
  4. 入職超過5年的員工,應該享有20天年假;
  5. 入職超過7年的員工,應該享有25天年假;
  6. 入職時間在未來(尚未入職)的員工,不應該計算年假數額(拋出異常);

不難想象,我們會分別在這6個測試場景對應的測試方法中重復地編寫幾乎完全相同的代碼來初始化Employee類的對象。

這樣的單元測試模式在企業級應用開發的場景中比比皆是。開發者經常很容易在測試第二個場景時,順手從第一個場景的單元測試中復制初始化數據模型的代碼,略作修改來描述第二個測試場景,后面的測試場景也如法炮制。這樣顯然會造成測試代碼中存在大量的模板代碼(Boilerplate code),進一步降低了代碼的易讀性。

通常在開發項目的實踐中會引入構建者模式(Builder Pattern)或者 Object Mother 組件來消除這些模板代碼。本文非常欣賞這些解決方案,下文會在此基礎上做進一步討論。

初始化數據模型代碼膨脹

另外需要注意的是,前文舉例的代碼中為節省篇幅已經做了很多簡化。我們不僅用省略號折疊了(1)處之后可能傳入構造方法的更多的初始化參數,還折疊了在(b)處初始化 List<Department> departments 參數時逐個構造 Department 類對象所需要的大量細節,甚至在初始化每個Department類對象時,又另外需要構造更多的相關實例。

當然在實踐中,經常使用的策略是將大量無關的屬性設置成 null 或者空集合,但是這有時候會在被測組件對數據類有效性檢查中被攔截。特別是在某些演進了一段時間的代碼庫中,我們經常會遇到的困難是,由于在測試中構造數據時采用了過多的 null 和空集合,一個新添加的數據有效性檢查步驟或者切面(AOP),會造成幾百個單元測試的失敗。逐一修復這些失敗的單元測試的工作量無疑是巨大的,同時是充滿風險的,因為此時對單元測試的修改完全是為了兼容一個新添加的切面,而脫離了單元測試本身的業務上下文。

在這種情況下,開發者會越來越多選擇將相似的數據有效性檢查步驟散布在具體的業務代碼中,而非在構造方法中統一檢查、或者通過切面集中實現。可見,單元測試的不良設計,會反過來增加生產代碼的維護難度,拖累了生產代碼的演進。

EasyModeling提供的能力

造成開發者寫出類似單元測試的原因是廣泛存在的。例如,Employee 類沒有提供更靈活的構造方法,也沒有 Builder 模式的構造器。從 Employee 類自身的職責的角度出發,它的確沒有理由提供一個僅包含 LocalDate dateOfJoining 作為參數的構造方法。在很多業務場景下,數據模型類也完全有可能就是不允許通過 Builder 模式來構造的。我們當然不能為了編寫測試代碼的便利,而去修改生產實現代碼。又例如,代碼中可能存在對 Employee 類的數據合法性校驗。這些校驗可能是類似切面的形式存在的,導致我們無法方便地在單元測試中忽略它。

在實際項目中,開發者很容易從“消除重復”的角度,抽象出相應的工廠類來提供測試所需要的數據模型實例。Martin Fowler 也在他的博客的短文 Object Mother 中簡要討論了相關的思路。但是在測試中使用工廠組件雖然消除了很多重復代碼,卻沒有提供針對不同的測試場景的靈活定制能力,因此一些項目又會同時采用 Builder 模式來提供定制能力。我自己在多個項目上引入 Object Mother 來提供測試數據實例后發現,這些工廠類本身又具有非常固定的代碼模板,于是我開始考慮開發一個工具來自動生成這種工廠類。

受到 Builder 模式和 Object Mother 思想的啟發,我開發了 EasyModeling 來嘗試簡化 Java 單元測試的編寫,并提高測試的可讀性和易維護性。EasyModeling 是一個 Java 注解處理器庫,它主要提供三個方面的功能:

  • EasyModeling在編譯期根據指定的數據模型類的結構,生成對應的數據模型工廠類,以方便單元測試快速生成數據模型類的實例。通過向 EasyModeling 注冊一個數據模型類,單元測試的編寫者只需要調用 EasyModeling 所提供工廠類的靜態方法,就可以立即得到這個數據模型類的實例。
  • EasyModeling 還可以在單元測試的運行時,自動初始化它所生成的數據模型實例。在生成數據模型實例時,EasyModeling 默認的行為是給數據模型實例的字段填充隨機值,讓開發者不需要再耗費精力去填充對測試場景無意義的屬性。同時,開發者仍然有機會向 EasyModeling 指定每個數據模型類的每個字段所需的初始化方式。
  • 另外,EasyModeling 還在其生成的工廠類中提供了一個 Builder 模式的構建器。利用這個構建器,開發者可以定制、并僅定制與當前測試場景相關的字段,使單元測試簡短、清晰、易讀。

在編碼層面,EasyModeling 的行為完全發生在測試包中,絲毫不會侵入項目的生產實現代碼。同時,EasyModeling 只會照顧開發者向它注冊的數據類型類,而不會在代碼庫中主動搜索。所以即使是維護已久的代碼庫,從任何時間點引入 EasyModeling 都不會造成額外的負擔。

EasyModeling簡化后的單元測試

在引入了 EasyModeling 后,本文中第一節中的單元測試例子可以得到顯著地簡化:

圖片圖片

除此之外,如前文提到,開發者需要在測試代碼中向 EasyModeling 注冊 Employee 類:

圖片圖片

首先我們看到,在引入 EasyModeling 后,單元測試的代碼在篇幅上得到了非常明顯地簡化。在單元測試中 (4) 處,EmployeeModeler 類就是由 EasyModeling 在編譯期生成的工廠類,通過引用 EmployeeModeler 類中的靜態方法 builder(),我們可以得到 Employee 類的Builder 的實例。請注意,此處使用的 Builder 類不是由 Employee 類自己編寫的,也不是通過如 Lombok 這樣的工具來提供的,而是由 EasyModeling 在其生成的工廠類 EmployeeModeler 來提供的。這樣的好處是,為了測試而準備的 Builder 完全沒有侵入生產代碼。

其次,在 (4) 處生成的 Builder 類的實例中,EasyModeling 已經為我們盡可能多地填充了所有的成員變量。因此,我們接下來只需要聚焦在當前測試場景所關心的成員變量上。例如在 (5) 處,我們將 dateOfJoining 字段的內容設置為指定的日期。在可讀性方面,由于避免了冗長的初始化參數,所以使開發者在閱讀單元測試時,能夠快速理解測試場景,進而也比較容易修改或維護單元測試。

第三,EasyModeling 在填充數據模型實例的屬性時,不僅能夠填充一些 Java 應用中常用的數據類型,包括基本類型、數組、集合、時間日期等等,還能夠進一步填充當前數據模型所引用的其他數據模型。例如 Employee 類中引用的 List<Department> departments 列表字段。

最后,為了讓 EasyModeling 幫我們生成 Employee 類的工廠類,如以上代碼中 (6) 處,開發者只需要在任意的一個類上通過 @Model 注解聲明即可。EasyModeling在編譯期為所有被 @Model 注解聲明的數據模型類生成對應的工廠(Modeler)類。

除此之外,EasyModeling 還提供了其他一些好用的特性,限于篇幅,具體的用法請參考文檔。

EasyModeling的不足和未來

但是由于我的業余精力和能力都非常有限,EasyModeling 目前還處于它成長的初期,存在幾點顯然的不足。

第一,沒有維護良好的使用文檔。目前我只維護了一份項目 Readme 文件,作為簡要的使用文檔,導致一些略高級的使用方法和一些從新版本開始支持的功能并沒有體現在文檔中。

第二,沒有維護文檔注釋。遵循代碼整潔的原則,在長期從事的企業應用開發中,我幾乎不會寫任何形式的注釋。所以我也沒有意識到,在維護一個更偏底層的開源工具庫時,充分的文檔注釋是非常必要的。一方面,文檔注釋便于開發者用戶查看閱讀,也便于有興趣的貢獻者參與開發。另一方面,由于這種較為基層的工具中無可避免地要使用一些魔法,如果沒有良好的注釋,隨著時間推移,可能連我自己也會忘記其中的細節。

由于 EasyModeling 是一個關注單元測試的工具,而不會入侵任何生產代碼,因此,在 Java 項目中引入 EasyModeling 幾乎不會對項目的可靠性、安全性造成任何風險。所以如果你對這個工具感興趣,認為它有可能幫助你提高編寫測試的效率,請不妨引入到你的項目中嘗試使用。

未來,由于我自己在項目上會持續使用 EasyModeling 來構建測試數據,所以我基本可以保證持續維護這個工具。在近期,我將聚焦在完善使用文檔,以及修復從用戶反饋的一些缺陷。在EasyModeling 的功能特性方面,雖然我手上目前依然積壓著一些我自己想要實現的功能,但是我更想從用戶的反饋中收集更多有趣的好主意,再來推進下一階段的功能演進。

責任編輯:趙寧寧 來源: Thoughtworks洞見
相關推薦

2017-01-14 23:42:49

單元測試框架軟件測試

2024-10-28 08:07:17

2017-01-16 12:12:29

單元測試JUnit

2017-01-14 23:26:17

單元測試JUnit測試

2020-08-18 08:10:02

單元測試Java

2017-04-07 13:45:02

PHP單元測試數據庫測試

2017-03-23 16:02:10

Mock技術單元測試

2021-05-05 11:38:40

TestNGPowerMock單元測試

2020-05-07 17:30:49

開發iOS技術

2011-07-04 18:16:42

單元測試

2023-07-26 08:58:45

Golang單元測試

2021-03-11 12:33:50

JavaPowerMock技巧

2011-05-16 16:52:09

單元測試徹底測試

2009-09-01 10:20:06

protected方法單元測試

2012-05-17 09:09:05

Titanium單元測試

2010-01-28 15:54:19

Android單元測試

2013-06-04 09:49:04

Spring單元測試軟件測試

2020-09-30 08:08:15

單元測試應用

2011-04-18 13:20:40

單元測試軟件測試

2024-07-29 12:12:59

點贊
收藏

51CTO技術棧公眾號

精品人妻一区二区三区麻豆91| 午夜天堂影视香蕉久久| 欧美一区二区三区啪啪| 欧美精品一区二区三区在线看午夜 | 性生交大片免费看l| 第一页在线观看| 亚洲日本激情| 欧美一区二区三区视频免费播放 | 欧美xxx在线观看| 欧美乱熟臀69xxxxxx| 日韩高清专区| 欧美人一级淫片a免费播放| 久久综合五月婷婷| 五月激情六月综合| 精品国产一区二区三区麻豆小说 | 小黄鸭精品aⅴ导航网站入口| 成人国产精品免费观看| 欧美丰满少妇xxxxx| 美女被艹视频网站| 中文字幕伦理免费在线视频| 国产一区久久久| 欧美尺度大的性做爰视频| 中文字幕第22页| 在线三级电影| 不卡的看片网站| 91a在线视频| 欧美中文字幕在线播放| 美国av在线播放| 国产精品日韩一区二区三区 | 天天爽夜夜爽一区二区三区| 在线观看国产原创自拍视频| 激情丁香综合五月| 欧美成人精品影院| 理论片大全免费理伦片| 日本不卡网站| 中文字幕欧美三区| 91pron在线| 国产精品999在线观看| 亚洲人和日本人hd| 欧美日韩精品欧美日韩精品一| 一本—道久久a久久精品蜜桃| a毛片在线免费观看| 亚洲人妖在线| 日韩在线视频国产| 中文字幕18页| 性欧美videohd高精| 18涩涩午夜精品.www| 国产精品jizz视频| 亚洲第一网站在线观看| 91精品天堂福利在线观看| 精品对白一区国产伦| 国产a视频免费观看| 日韩三级影院| 97se亚洲国产综合自在线| 国产精品久久久久久久美男| 国产成人av免费在线观看| 国产精品久久久久久久久久白浆| 日本韩国视频一区二区| 91麻豆天美传媒在线| 五月婷婷伊人网| 精品一区二区av| 91国产在线精品| 亚洲伦理一区二区三区| 日韩一级电影| 日韩免费高清视频| 中文久久久久久| 91精品国产黑色瑜伽裤| 亚洲图片你懂的| 欧美精品在线一区| 蜜桃在线一区二区| 久久99精品久久久| 国产成+人+综合+亚洲欧洲| 久热这里有精品| 国产欧美一区| 亚洲电影天堂av| 涩多多在线观看| 97久久网站| 日韩欧美高清视频| 国产人妻777人伦精品hd| 欧洲不卡av| 中文字幕av资源一区| 久久久精品动漫| 国产综合在线播放| 国产一区免费电影| 91精品免费看| 久久久久精彩视频| 国产精品毛片在线| 久久久久久午夜| 欧美三级日本三级| 五月开心六月丁香综合色啪 | 色偷偷久久人人79超碰人人澡| 欧洲精品视频在线| 久久77777| 国产精品美女www爽爽爽| 欧美日韩精品免费观看| 亚洲 国产 欧美 日韩| 成人午夜av影视| 国产精品xxxx| 风流少妇一区二区三区91| 国产一级精品在线| 91欧美精品成人综合在线观看| 中文字幕人妻一区二区在线视频| 久久精品一区| 国产成人精品久久二区二区| 天堂网中文字幕| 久久一区欧美| 国产精品极品美女粉嫩高清在线| 日本视频免费观看| 日韩在线a电影| 国产精品v日韩精品| 看黄色一级大片| 久久国内精品视频| 91人成网站www| 99在线精品视频免费观看软件 | 丁香五六月婷婷久久激情| www精品久久| 女海盗2成人h版中文字幕| 狠狠色噜噜狠狠狠狠97| 天天摸天天碰天天添| 韩国女主播一区二区| 欧美日韩久久一区| 成年人性生活视频| 国产96在线亚洲| 国产午夜精品久久久 | 精品一区毛片| 一区二区三区久久精品| 三级黄色免费观看| 红桃视频国产精品| 欧美洲成人男女午夜视频| 波多野结衣电车痴汉| 美女网站在线免费欧美精品| 成人免费在线视频网站| 老熟妇高潮一区二区高清视频| caoporn国产一区二区| 欧美在线一二三区| www.在线视频| 欧美日韩免费看| gogogo高清免费观看在线视频| 精品视频在线观看网站| 亚洲精品国产综合久久| 国产毛片欧美毛片久久久| 99久久婷婷国产综合精品电影√| 欧美老少配视频| 久久中文字幕免费| 精品一区二区影视| 蜜桃传媒视频麻豆一区| 久久日韩视频| 91成人免费在线| 亚洲911精品成人18网站| 免费看成人哺乳视频网站| 福利一区二区免费视频| 亚洲最大成人综合| 国产精品亚洲二区在线观看| a一区二区三区亚洲| 日韩精品日韩在线观看| 久久精品一区二区三区四区五区| 雨宫琴音一区二区在线| 国产精品视频最多的网站| 亚洲精品久久久狠狠狠爱 | 国内精品二区| 在线观看国产原创自拍视频| 天天做天天摸天天爽国产一区 | 男同互操gay射视频在线看| 日韩深夜视频| 日韩一区二区在线观看视频 | 国产精品理论片| 免费在线观看亚洲视频| 91麻豆精品一二三区在线| 精品一区二区三区电影| 中文字幕第二区| 国产女优一区| 草莓视频一区| 国产原创精品视频| 欧美专区亚洲专区| 欲求不满的岳中文字幕| 欧美91大片| 成人两性免费视频| 福利视频在线播放| 欧美性黄网官网| 国产精品久久久久久久无码| 综合在线一区| 国产在线精品一区免费香蕉| 国产在线高清| 日本高清成人免费播放| 免费成人深夜夜行p站| 中文字幕一区二区精品区| 国产精品旅馆在线| 理论视频在线| 色www精品视频在线观看| 日本少妇xxxx| 影院欧美亚洲| 激情久久av| 国产精品xx| 亚洲精品国产拍免费91在线| 久久久全国免费视频| 久久午夜精品| 色999日韩自偷自拍美女| 国产网站在线| 午夜欧美视频| 2020久久国产精品| 少妇高潮一区二区三区69| 亚洲精品视频在线看| 人人爽人人爽av| 91一区在线| 成人精品网站在线观看| 欧美69xxx| 欧美一区二区三区影视| 91aaa在线观看| 丁香网亚洲国际| 国产 日韩 欧美在线| 久久动漫网址| 国产电影精品久久禁18| 久久精品国产免费| 久久精品久久99精品久久| 久久婷婷激情| 欧美黄免费看| 暖暖在线中文免费日本| 瑟瑟视频在线免费观看| 91麻豆成人精品国产| 亚洲国产精品久久久久爰性色| 深夜福利视频在线观看| 国产99在线观看| 波多野结衣中文在线| 久久一级大片| 日韩女优av电影| 免费一级全黄少妇性色生活片| 国产suv精品一区二区6| 国产二区视频在线| 亚洲精品白浆高清| 国产精品91在线| 在线观看麻豆| 日韩精品一区二区在线观看| 国产一国产二国产三| 久久一留热品黄| 少妇一级淫免费播放| 欧美一区在线看| 国内成+人亚洲| 欧美成人毛片| 欧美国产日韩xxxxx| 日本1级在线| 欧美人狂配大交3d怪物一区| 91成人福利视频| www久久精品| 肉色超薄丝袜脚交| 中文字幕 自拍| 久久99青青| 91手机视频在线观看| 不卡专区在线| 色噜噜久久综合伊人一本| 日本黄视频在线观看| 欧美视频一区二区在线观看| 国产女人被狂躁到高潮小说| 91小视频免费看| 色男人天堂av| 久久精品国语| 国产乱子伦精品视频| 国产91一区| av一区二区三区免费| 日韩中文视频| 国内精品一区二区三区| 日本中文字幕在线2020| 亚洲国产三级网| 国产精品无码AV| 福利视频一区二区| 538任你躁在线精品视频网站| 久久精品水蜜桃av综合天堂| 亚洲欧美日韩中文字幕在线观看| 视频一区二区中文字幕| 2019日韩中文字幕mv| 国产精品精品| 日本高清久久一区二区三区 | 国产精品视频色| av电影在线地址| 久久99精品久久久久久噜噜| 国产二区在线播放| 亚洲精品一二区| 色婷婷av一区二区三| 欧美一级爆毛片| 国产精品九九九九| 欧美日韩免费在线视频| 久久国产视频一区| 欧美日韩中文字幕在线视频| 精品无码人妻一区二区三区| 国产精品久久久久久久久免费相片 | 国产成人精品亚洲午夜麻豆| 男女视频在线看| 日韩一区精品字幕| 国产精品免费观看久久| 91久久在线| av无码久久久久久不卡网站| 亚洲综合激情在线| 日韩国产精品毛片| 91精品啪在线观看国产81旧版| 一区二区三区四区视频在线观看| 波多野结衣的一区二区三区| 欧美视频在线不卡| 亚洲第一综合网| 国产女人水真多18毛片18精品视频| 免费看黄色aaaaaa 片| av中文字幕一区| 伦理片一区二区| 不卡在线视频中文字幕| 国产人成视频在线观看| 99热精品国产| 免费看黄色aaaaaa 片| 91小视频在线免费看| 亚洲熟妇无码av| 久久久精品人体av艺术| 娇妻被老王脔到高潮失禁视频| 国产午夜精品福利| 变态另类ts人妖一区二区| 中文字幕精品在线不卡| 黑人狂躁日本娇小| 亚洲欧美日韩国产综合在线| 卡通动漫亚洲综合| 一区二区三区中文字幕精品精品| 男女免费视频网站| 天天色 色综合| 亚洲 日本 欧美 中文幕| 欧美视频一区二区三区在线观看| 国产精品久久婷婷| 精品蜜桃在线看| 五月婷婷六月色| 在线视频精品一| 成人区精品一区二区不卡| 欧美激情小视频| 天堂电影一区| 成人观看高清在线观看免费| 涩爱av色老久久精品偷偷鲁| 国产一区免费观看| 第四色成人网| 欧美国产视频一区| 天堂资源在线中文精品| 欧美日韩理论片| 91免费看`日韩一区二区| 91麻豆精品国产91久久综合| 亚洲色图在线视频| 精品免费囯产一区二区三区| 欧美日韩国产高清一区二区三区| 老司机午夜福利视频| 在线电影中文日韩| 伦理av在线| 国产精品丝袜高跟| 国内精品国产成人国产三级粉色| 日韩jizzz| 亚洲视频免费| 成人亚洲精品777777大片| 成人一区二区视频| 亚洲图片第一页| 婷婷久久综合九色综合伊人色| 一区二区小视频| 亚洲精品www久久久| 日本在线视频网| 欧美在线视频一区| 欧美一区一区| 亚洲mv在线看| 亚洲国产导航| 亚洲精品在线网址| 久久精品网站免费观看| 日本天堂网在线观看| 欧美日韩国产三级| 黄色av网站在线| 久久久久一本一区二区青青蜜月| 青青草国产一区二区三区| 久久婷婷人人澡人人喊人人爽| 亚洲男女av一区二区| 韩国日本美国免费毛片| www.视频一区| 不卡视频一区| 国产主播福利在线| 久久久久久久影院| 国产人与zoxxxx另类91| 日本在线播放一区| 国产美女一区| 污污免费在线观看| 亚洲六月丁香色婷婷综合久久| 无码人妻精品一区二区三区9厂| 欧美精品一区二区三区四区 | 国产丝袜欧美中文另类| 日韩精品一区二区av| 日韩欧美资源站| 国产日产一区二区| 国产日本欧美在线观看 | 91在线精品一区二区三区| 久久久精品国产sm调教网站| 91精品国产色综合久久| 91女主播在线观看| 国产精品日韩精品| blacked蜜桃精品一区| 国产一区亚洲二区三区| 91色婷婷久久久久合中文| 日韩视频免费观看高清| 精品国产一区二区精华| 色呦呦在线免费观看| 97久久精品午夜一区二区| 欧美激情第10页| 少妇极品熟妇人妻无码| 亚洲综合色视频| 欧美天堂在线视频| 久久久爽爽爽美女图片|