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

單元測試,只是測試嗎?

開發 開發工具
推廣單元測試,僅僅達到單測覆蓋率是遠遠不夠的,我們還要學習寫"易于測試"的代碼,以及"好"的測試,這樣才能讓單測真正發揮作用。本文將分享作者關于單元測試的思考與實踐。

[[338223]]

 推廣單元測試,僅僅達到單測覆蓋率是遠遠不夠的,我們還要學習寫"易于測試"的代碼,以及"好"的測試,這樣才能讓單測真正發揮作用。本文將分享作者關于單元測試的思考與實踐。

首先我就來回答一下標題提出的問題:單元測試除了是一種測試手段外,更是一種改善代碼設計的工具,容易寫單測的代碼往往也具有更加良好的設計。

因而是任何自動化測試工具都無法取代的。

當然,這里也不是把自動化測試工具給一棍子打死,自動化測試工具也有自己的使用場景,比如測試遺留代碼,做長鏈路測試等等。

這里需要強調一下 "工具" 屬性,工具能放大人的智力或者體力,讓干活的時候不會這么累,比如你去種樹帶把鏟子,你肯定不會把鏟子當成負擔的,因為他是你種樹的工具,你寫 Java,肯定不會因為 IDEA 啟動時間長,就把它當成一種負擔,因為 IDEA 也是你寫 Java 的一個工具,很多人把寫單測當成一種負擔,往往就是沒有意識到"單測"是一種工具,單純把他當成一種測試。

一 品味篇

在品味篇,一起看看什么樣的代碼才是易于單測的。

Mock 工具的使用——毒藥還是解藥

 

你可能立刻就會產生和程序員小 A 類似的疑惑:"無論代碼寫成什么樣,通過 Mockito 和 PowerMock 肯定都是能寫出單測來?所以通過單測真的改善代碼結構嗎?"。

實際上,大量使用 Mock 工具的單測相當于買櫝還珠,只具備測試的能力而無法幫助代碼設計。

 

商店系統案例

以一段非常簡單的程序為例,假設這是一個商店系統,里面有一個買面包的方法,里面會調用銀行提供的信用卡服務 creditCardService 來扣除傳入的信用卡的錢。這段程序如果使用 Mockito 的話,估計你很快就能寫出測試了,只需要把 creditCardService 給 Mock 掉,然后驗證它傳入的參數就可以了。

如果總是像上面這樣思考的話,單測對于你改善代碼設計就沒什么幫助了。我們在給代碼寫單測的時候不應該上來就思考用什么樣的工具來測試代碼,而是應該思考如何重構代碼,才能讓代碼變得更加容易測試。

還是上面這段代碼,我們換個角度,思考下如何重構代碼,才能讓這段邏輯不需要 mock 就能測試?

 

返回一個執行計劃,而不是立即執行外部調用

 

上層拿到一個 Payment 實體后,可以選擇立即執行,或者稍后統一執行

其實非常簡單的一個辦法是,返回一個計劃,而不是立即就執行外部調用,比如這里我們可以抽象出一個 Payment 實體,表示從銀行卡里劃了多少錢,外部拿到 Payment 實體后再決定是立即把錢劃掉,還是稍后把錢統一劃掉。此時這一段邏輯不需要 Mock 就可以測試了,只要校驗方法返回的 Payment 對象里面的屬性是否正確即可。

到這里,你可能又有疑問了,“費了這么大事重構代碼僅僅是為了好寫單測,值得嗎?”,如果你有這個疑惑的話,那你可能還是把單測僅僅當成測試了,我之所以要把代碼重構的好寫單測,是因為好寫單測的代碼還有其他諸多好處。

易于單測的代碼僅僅是易于單測嗎?

更多的性能優化機會

就上面重構的代碼為例吧,因為業務層返回的都是 Payment 對象,我可以這些 Payment 聚合起來,最后統一執行,比如下圖的這段代碼,我就可以把 Payment 按照銀行卡分組統一扣錢,這樣就可以減少 rpc 調用的次數,以后如果有需要的話,甚至可以直接將 Payment 作為消息發出去,到另一個系統執行,業務層根本無需關心 Payment 最后是怎么執行,只需要在付款的時候生成一個 Payment 就可以了。

 

更加健壯的核心代碼

 

更加健壯的系統

另一個更大的好處是,好寫單測的系統往往比不好寫單測的系統更加健壯,如果一個系統大部分代碼都可以寫無 Mock 單測,那么它看起來就像左圖一樣,外部調用只是薄薄的一層,可以隨意更換。

如果你的系統大部分代碼都一定要 Mock 才能測試的話,或者根本無法測試的話,就像右圖一樣,說明你的業務根本就沒有自己的核心邏輯,而是和各種外部調用纏繞在一起。

另外需要說明的是,圖中紅色的部分才是單測真正能夠起作用的場景,因為它是比較穩定的業務邏輯,而且紅色部分的單測也比較好些,只需要傳幾個參數進去,然后校驗一下返回值就行了。灰色的外部調用部分理論上不寫單測也無所謂,因為外部調用是不穩定的,即使你跟對方約定好了出入參數,他依舊有可能返回不符合約定的參數,或者直接就發生了網絡錯誤,這一部分是集成測試發揮的場景。為什么在我們的系統里,大家都覺得單測沒用,其實我也覺得單測對我們現在的系統沒什么用,因為我們現在系統的主體代碼就像右圖一樣,大部分都是灰色的外部調用,單測能夠發揮作用的領域少之又少,即使寫了覆蓋率 80% 的測試用例,又能測出來啥?

這里要再補充一下,我上面所說的 “穩定” 的含義,我說紅色部分的“業務核心代碼”穩定并不是說業務一成不變,業務肯定是一直在變的,而是說它的邏輯不會收到外部系統錯誤的影響,不像灰色部分,外部系統一抖動可能就會出問題,因為灰色部分不適合單測。

Mock 工具的定位

剛剛噴了這么久 Mock 工具,那 Mock 工具真正的定位究竟是什么呢?

  • Mockito 是用來測試少量的不得不進行外部調用的代碼。
  • PowerMock 是用來測試設計得不好的遺留代碼的。

在 PowerMock 的文檔中已經給出了警告,濫用它帶來的壞處或許比好處更多,所以當我們寫單測的時候不應該上來就想著用這些 Mock 工具,而是應該想想如何重構代碼才能避開這些工具的使用。

PowerMock 官方文檔的警告:

Putting it(PowerMock) in the hands of junior developers may cause more harm than good.

另外,我們再聊聊單測自動化生成工具,我們剛好也有澄沨在做,無論是哪種單測生成工具,你會發現工具生成的單測到處都是 Mockito 和 PowerMock,顯然不符合單測的定位,但是這種工具也是有意義的,當系統里到處都是不好寫單測的遺留代碼時,用這個工具生成一下也能幫助我們覆蓋一小部分測試,對于我們系統目前的情況還是很有必要的。

再來一個重構的例子

寫有外部調用的靜態方法:

 

最后的結果:

 

為了加深大家印象,這里再舉個一個例子。比如下面這個方法,我在靜態方法中調用先通過對 Business 的對象的各種處理,拿到了 rpc 調用的地址和版本號,然后使用這個地址和版本號加載一個初始化好的 hsf(阿里內部使用的 rpc 框架)泛化調用對象返回,這個方法的單測顯然十分難寫,因為 init 會發生網絡調用,導致測試失敗。這個時候我們要反思一下單測不好寫的原因,是因為我們違背了一條編碼的基本原則——“不能在靜態方法中寫外部調用”,如果你就是想在靜態方法中進行外部調用,那應該怎么辦呢?還是像之前的例子一樣,返回一個計劃,讓外部調用,首先保持代碼無副作用的部分不動,這一部分本來就沒有外部調用,放在靜態方法里執行也什么事情,然后把外部調用部分封到一個 Operator 里面(比如這里就是 RpcLoader)返回給上一層,上一層自己選擇立即調用還是稍后調用。

這么做除了好寫單測,還有什么好處呢?最顯而易見的一點就是代碼變得可復用了,更重要的一點是防腐,你會發現 hsf 影響范圍被局限在 RpcLoader 里面,以前哪怕它的 API 出現什么變化,或者要換別的框架,都是件非常容易的事情。

為什么單測能夠驗證代碼結構的合理性

 

前面我提到的這些關于代碼結構的概念聽起來是不是非常耳熟,在別的領域也經常聽到,比如面向對象中的“高內聚,低耦合”,DDD 中所提到的“核心域”,“防腐層”,函數式編程所倡導的“隔離副作用”,你會發現,好的編程范式倡導的東西都是類似的。

上面這三種評價代碼的方式其實都是比較“主觀”的,什么樣的代碼才能叫“高內聚”,在每個人看來可能都不一樣。但是對于是否易于寫單測,大家的標準基本是一樣的,難寫單測的系統給誰都很難寫。而好寫單測的代碼一般都滿足編程范式所倡導的原則,所以寫單測的難易程度可以作為一個非常客觀的代碼質量評價指標。

如果有人跟你說他這段代碼設計得非常好,但是就是不好寫單元測試,千萬不要相信他。

另外再提一下設計模式,如果只是照著書抄抄代碼,設計模式是非常簡單的,關鍵是要用對場景,一不小心就會只學到了“形”,而沒有學到“神”,“形神兼備”的設計模式往往會讓代碼變得更加容易測試,如果用了設計模式發現系統變得更難測試了,那設計模式十有八九用得不對。

[[338224]]

 

如果有個程序員跟你說我程序的性能達到了多少 QPS,你肯定會立馬拿起測試工具就去測,看到底能不能到達這個 QPS。但是如果有程序員畫了框框圖說他的代碼分成了 A B C 模塊,要怎么驗證他的代碼真的分成了這幾個模塊呢?很簡單,你看看每一個模塊能否脫離其他模塊單獨測試就可以了,如果單獨測試非常困難,那就說明模塊并沒有真的分開,而是或多或少耦合在了一起。

易于單測的等級

現在我們可以總結易于單測的幾等級了。和別的領域不太一樣,別的領域你高級的工具用得越多,可能越厲害,但是在單測這個領域,使用越多的高級工具,反而是更加糟糕的測試。

另外,對這些規則也不要死腦筋,這些只適合業務含義比較豐富的代碼,如果你就是在寫一些封裝外部調用的代碼,這部分代碼我覺得不寫單測也是可行的。

  • 第一級,易于單測:大部分代碼不需要 Mock 就可以測試,少量的外部調用代碼需要 Mockito。
  • 第二級,能夠單測:超過一半的代碼需要 Mock 才能測試,但是這些測試也不是特別難寫。
  • 第三級,難以單測:大量 Mock,甚至大量使用了 PowerMock。
  • 第四級,無法單測:模塊被設計的及其復雜,連開發者自己都無法理解,更無法寫單測。

二 實踐篇

在上一篇學習了關于單測的正確觀念后,這一篇再來聊一聊關于單測的最佳實踐。

單元測試的運行速度重要嗎?

很多人會覺得單測反正也不是系統中的代碼,運行的快慢無所謂,然后寫出很多其慢無比的單測,以至于系統全量跑一次單測要幾十分鐘。這樣的話就完全偏離了單測的定位,單測的目的就是為了方便快速迭代,改了兩行代碼就可以在本地用 30 秒到幾分鐘的時間全量跑一次單測來確定影響范圍,而不是每次都要通讀系統源碼才能知道改動的影響范圍,這樣新人很快就可以大膽改代碼了,而不是先花幾個月通讀系統源碼,或者先踩好幾個坑,才能上手干活。那些全量跑單測要幾十分鐘的系統,他的開發者根本就不會在本地全量運行單測,每次都在 aone 上跑半天才知道單測不過,這樣的單測就形同虛設了。

違背這個原則的典型反例,就是在單測中啟動 Spring。

數據驅動測試(Data Driven Test)

[[338225]]

 

不好的單元測試常常只用一組正常測試數據進行測試,實際上我們應該使用多組數據,包括正常和異常數據,輸入模塊,看返回值是否符合預期。使用多組測試數據是否就意味著多寫很多代碼呢?并不是,我們只要注意將測試用例的邏輯與數據分離就可以,測試代碼依次讀取測試數據,校驗其是否符合預期。這樣的邏輯與數據分離的測試一般稱做 “數據驅動測試”,常見的單元測試框架都會提供這種支持。

"數據驅動測試" 的概念還是太抽象了,這里我們看兩段代碼,左圖未分離數據與用例,右圖則做了分離,能夠看出很明顯的不同,右圖是基于 Spock 單元測試框架來寫的,不熟悉的人看上去可能比較奇怪,可以把 where 標簽下的代碼看成一張表格,每一行都是一組測試數據,Spock 框架會將其依次代入 testAdd 方法參數進行測試。

 

測試數據未與用例分離

 

測試數據與用例分離

大家所熟悉的 junit 框架也是可以做的,但是需要寫一個額外的內部類,加上@RunWith(Parameterized.class),寫一個 data 靜態方法,然后返回需要測試的數據組,然后 junit 就會依次將數據填入這個類的屬性中,運行這個類中的全部測試用例。

 

基于 junit 的數據驅動測試

 

基于 Spock 的數據驅動測試

如何測試私有方法

大家寫單測時常有的一個困惑就是私有方法怎么測試?雖然理論上私有方法不需要寫單測,但是有些私有方法邏輯比較復雜,還是值得單獨寫測試的,目前公認比較好的實踐就是將修飾符從 private 改成 protected, 這也是很多開源項目給單測留口子的方法。如果你的項目剛好有引入 guava 的話,可以再給方法加上一個 @VisibleForTesting 的注解,表示僅僅是出于單元測試需要修改的修飾符。

一個典型的例子:

 

三 TDD 與 BDD

最后一篇來講一兩個大家可能經常聽說過的理念,TDD 和 BDD。個人覺得這兩個理念都比較極端,實際中很難應用,啟發意義大于其實用意義,所以放在最后,希望能帶來一些啟發。

TDD

[[338226]]

 

TDD 強調讓寫代碼的過程形成一個循環,第一步是為你要做的功能寫一個單元測試,跑一下發現沒有通過(畢竟你還沒有實現代碼),即圖中的 TEST FAILS,俗稱“紅燈”,之后編寫能夠通過全部測試的“最小代碼”,之所以強調“最小代碼”,就是為了防止過度優化,現實中我們經常會因為代碼過度優化,或者過度設計,導致很多遺留問題,在這個階段,只管用最快最臟的代碼實現就好了,不用管太多設計問題。這個階段俗稱“綠燈”。

最重要的就是下面的“重構”(REFACTOR)階段了,前面的代碼雖然可能很臟,但是至少是正確,也有足夠的測試來保障邏輯的正確,這個時候就可以大刀闊斧地重構代碼了,保證代碼繼續保持最優。

這啟發我們兩點:

  • 單測必須能夠快速運行,因為單測是經常要在本地全量運行的,只有運行足夠快,才能在 TDD 的循環中快速迭代。
  • 好的代碼并不是一次性就設計出來的,而是持續重構出來,而單測是持續重構的前提。

BDD

我常常抱怨產品經理在提需求時沒有想清楚,比如下圖,如果讓產品經理也可以寫出可執行的測試用例的話,情況想必會好很多。BDD 就是這么一個想法。

 

 

產品經理提需求

不知道大家有沒有在有的項目里見過 .story 文件,它本質上就是一種集成測試腳本,只不過是用自然語言描述,它包含敘述,場景和步驟三部分,比如上圖就是一個書店管理應用的 .story 文件,文件中敘述(Narrative) 和 場景(Scenario) 只是幫助思考的,本身并包含在測試用例的邏輯中,測試用例主要由 Given, When 和 Then 開頭的語句組成,含義如下:

 

story 文件示例

story 文件自己當然是無法執行的,需要框架提供支持,JBehave 就是這么一種框架(右圖),能夠定義各種 Given,When,Then 語句的實現,下圖的代碼本質上就是個基于 Selenide 的自動化界面點擊測試,它支撐 story 文件的執行。我們以這個 story 文件為依據,就可以像 TDD 循環一樣,先測試不通過(紅燈),然后用最小的代碼讓測試通過(綠燈),最后重構代碼。只不過這個循環可能會耗時好好幾天,乃至幾個星期。而 TDD 一個循環可能只需要幾個小時,所以說 BDD 是集成測試版的 TDD。

 

JBehave 框架

敏捷

我們往往會覺得 TDD 和 BDD 會嚴重拖慢迭代速度,值得諷刺的是,TDD 和 BDD 恰恰是敏捷開發實踐的重要組成部分:

 

圖源維基百科 Agile software development

我們學習敏捷開發的時候,常常只學習到它的 “快”,而忽略了敏捷開發所提出的質量保證方法。敏捷開發所謂的“快”,是指在代碼質量充分保證下的“快”,而不是做完功能就直接上線。

四 如何學習寫單測

學習單測的關鍵還是多實踐,多看看別人好的單測怎么寫。比如可以給一些公認代碼優秀的開源項目提交代碼。

五 總結

  • 單測能夠幫助我們驗證代碼設計的合理性。
  • 含有核心業務的代碼應該首先思考如何讓主體業務邏輯可以寫無 Mock 單測。
  • 用例數據盡量和測試邏輯分離。

參考資料

參考資料

[1]Test-Driven Java Development

https://www.oreilly.com/library/view/test-driven-java-development/9781783987429/

[2]Wiki Agile software development

https://en.wikipedia.org/wiki/Agile_software_development

[3]PowerMock

https://powermock.github.io/

[4]JBehave

https://jbehave.org/

[5]Spock

http://spockframework.org/

[6]JUnit

https://junit.org/junit4/

[7]Learning to Love TDD

 

https://medium.com/swlh/learning-to-love-tdd-f8eb60739a69

【本文為51CTO專欄作者“阿里巴巴官方技術”原創稿件,轉載請聯系原作者】

戳這里,看該作者更多好文

 

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2025-08-28 01:00:00

Go單元測試

2017-01-14 23:42:49

單元測試框架軟件測試

2017-01-16 12:12:29

單元測試JUnit

2017-01-14 23:26:17

單元測試JUnit測試

2011-05-16 16:52:09

單元測試徹底測試

2017-03-23 16:02:10

Mock技術單元測試

2021-05-05 11:38:40

TestNGPowerMock單元測試

2023-07-26 08:58:45

Golang單元測試

2020-05-07 17:30:49

開發iOS技術

2011-07-04 18:16:42

單元測試

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

單元測試應用

2009-12-23 15:03:52

WPF單元測試

2024-07-29 12:12:59

2009-09-25 10:33:25

Hibernate單元

2017-02-23 15:59:53

測試MockSetup

2011-04-18 13:20:40

單元測試軟件測試
點贊
收藏

51CTO技術棧公眾號

成年人网站免费在线观看| 亚洲一区二三| 日韩美一区二区| 日韩一区自拍| 日韩一级二级三级| 成人午夜视频在线观看免费| 青青草在线免费视频| 美美哒免费高清在线观看视频一区二区 | 欧美成人中文字幕| 在线观看国产网站| va天堂va亚洲va影视| 天天爽夜夜爽夜夜爽精品视频| 神马影院午夜我不卡影院| 午夜精品久久久久久久99老熟妇| 欧美亚洲专区| 欧美激情影音先锋| 18啪啪污污免费网站| 美女福利一区| 欧美一区二区观看视频| 色哟哟精品视频| 91美女精品| 亚洲人精品午夜| 日本不卡一区二区三区在线观看| 国产成人手机在线| 激情久久久久久久久久久久久久久久| 热re99久久精品国产66热| 青青草激情视频| 日韩久久综合| 亚洲一区二区久久| 亚洲色图14p| 99久久人爽人人添人人澡| 欧美日韩国产一级二级| www黄色在线| 欧美freesex黑人又粗又大| 亚洲精品国产成人久久av盗摄| 日韩在线观看电影完整版高清免费| 欧美一区二区三区成人片在线| 国模娜娜一区二区三区| 国产美女91呻吟求| 天天综合网久久综合网| 亚洲大胆在线| 欧美极品美女电影一区| 在线免费日韩av| 亚洲欧美在线专区| 超薄丝袜一区二区| 99鲁鲁精品一区二区三区| 日韩久久精品网| 日韩在线视频观看正片免费网站| 1024手机在线观看你懂的| 国产麻豆精品久久| 在线播放国产精品| 日韩精品123区| 久久精品亚洲人成影院| 久久视频免费在线播放| 91插插插插插插| 欧美高清一区| 高清欧美电影在线| 国产视频91在线| 久久国产精品毛片| 日韩av手机在线看| 中文字幕精品一区二区精| 免费av网站大全久久| 国产精品永久在线| 国产肥老妇视频| 粉嫩嫩av羞羞动漫久久久| 国产伦精品一区二区三区照片| 囯产精品一品二区三区| 26uuu另类欧美| 少妇免费毛片久久久久久久久| av每日在线更新| 中文字幕一区二区三区色视频| 精品一区二区成人免费视频| 日本中文字幕一区二区有码在线| 久久久久9999亚洲精品| 亚洲高清在线观看一区| 久久77777| 亚洲午夜免费福利视频| 国产日产欧美视频| 日韩成人一区| 精品国产成人系列| 国产精品国产三级国产专业不| 日韩综合网站| 欧美日本国产在线| 国产手机在线视频| 青椒成人免费视频| 97久久人人超碰caoprom欧美| 成人乱码一区二区三区| www国产精品av| 色乱码一区二区三区熟女| 男女免费观看在线爽爽爽视频| 欧美日韩免费在线| 久久国产这里只有精品| 综合激情久久| 亚洲最新av在线网站| 真实国产乱子伦对白在线| 在线日本成人| 国产日韩欧美视频| 五月激情婷婷综合| 国产精品超碰97尤物18| 奇米精品一区二区三区| 日韩成人一区| 亚洲美女av在线播放| 91麻豆精品成人一区二区| 免费亚洲一区| 97se视频在线观看| av在线日韩国产精品| 亚洲国产精品人人做人人爽| 一路向西2在线观看| 欧美综合精品| 欧美日韩国产第一页| 无码人妻久久一区二区三区| 粉嫩久久99精品久久久久久夜| 日韩精品成人一区二区在线观看| 丁香花电影在线观看完整版| 欧美日韩大陆在线| a视频免费观看| 欧美xxx在线观看| 国产精品一香蕉国产线看观看| 午夜福利一区二区三区| 亚洲精品少妇30p| 一本色道久久亚洲综合精品蜜桃 | 精品久久久久久久人人人人传媒 | 97精品人人妻人人| 99欧美视频| 国产精品爱久久久久久久| 手机在线精品视频| 亚洲一区二区欧美激情| 一区二区三区四区毛片| 国产一区二区三区探花| 欧美一级片久久久久久久| 亚洲精品一区二区三区新线路| 国产精品乱子久久久久| 亚洲 中文字幕 日韩 无码| 欧美五码在线| 97免费视频在线播放| 国产哺乳奶水91在线播放| 中文天堂在线一区| 嫩草av久久伊人妇女超级a| 亚洲va久久久噜噜噜久久| 久久久久久一区二区三区| 国产超碰人人模人人爽人人添| 国产精品国产三级国产三级人妇 | 日韩小视频在线| 精品久久久久久久久久久国产字幕| 成人禁用看黄a在线| 青草网在线观看| 伊人久久大香线蕉av超碰| 欧美日韩国产成人在线观看| 午夜精品在线播放| 亚洲高清三级视频| 奇米777第四色| 99视频在线精品国自产拍免费观看| 国产九色91| 色是在线视频| 亚洲视频在线免费看| 波多野结衣影片| 亚洲国产电影在线观看| 久久国产精品国产精品| 久久久久国产精品| 91欧美视频网站| 日韩另类在线| 日韩成人在线视频| 日本久久综合网| 国产精品剧情在线亚洲| 国内av一区二区| 午夜久久久久| 精品国产乱码久久久久久丨区2区 精品国产乱码久久久久久蜜柚 | 91色婷婷久久久久合中文| 黄色片一级视频| 精品色999| 91精品在线观看视频| 丝袜中文在线| 亚洲嫩模很污视频| 中文字幕人妻一区二区三区视频| 亚洲免费观看高清完整版在线 | 亚洲图片欧美在线| 亚洲精品午夜久久久| 午夜免费福利影院| 欧美一级专区| 中文字幕中文字幕一区三区| 亚洲天堂av资源在线观看| 欧洲成人在线观看| 思思99re6国产在线播放| 欧美岛国在线观看| 久久久免费高清视频| 国产精品乱人伦中文| 男人女人拔萝卜视频| 免费一区视频| 大桥未久一区二区三区| 麻豆精品av| 91精品视频在线免费观看| 高清视频在线观看三级| 色综合亚洲精品激情狠狠| 亚洲精品无码专区| 日本道精品一区二区三区| 青娱乐av在线| 国产精品女人毛片| 国产伦精品一区二区三区精品| 日韩 欧美一区二区三区| 精品人妻大屁股白浆无码| 国产一区二区三区站长工具| 国产精成人品localhost| 亚洲成av在线| 97av在线视频| a级片国产精品自在拍在线播放| 日韩国产中文字幕| 99热这里只有精品在线| 色美美综合视频| 国产精品9191| 亚洲女同一区二区| 欧美大波大乳巨大乳| 成人精品小蝌蚪| 午夜视频在线网站| 日韩高清在线不卡| 国内自拍在线观看| 欧美视频四区| 日本免费在线视频观看| 欧美色就是色| 欧美激情专区| 久久丝袜视频| 91在线免费看片| 99精品在线免费观看| 国产精品成久久久久三级| 九色porny自拍视频在线播放| 超碰97人人做人人爱少妇| 日韩精品成人av| 一本色道久久综合亚洲精品小说| 天天操天天干天天插| 日韩女优制服丝袜电影| 国产麻豆91视频| 欧美日韩和欧美的一区二区| 波多野结衣电车| 日韩欧美精品中文字幕| 性无码专区无码| 福利一区福利二区微拍刺激| 四虎永久在线精品| 亚洲午夜精品网| 久久久美女视频| 夜夜嗨av一区二区三区四季av| 成人高潮免费视频| 国产精品国产成人国产三级| a资源在线观看| 中文字幕精品一区二区精品绿巨人 | 国产精品久久久久久久成人午夜| 欧美天堂一区二区三区| 中文字幕天堂在线| 欧美专区在线观看一区| 成人午夜精品视频| 欧美日韩视频一区二区| 在线播放国产一区| 欧美日韩国产成人在线免费| 中文字幕第三页| 91精品免费观看| 国产三级在线观看视频| 欧美mv日韩mv国产网站| 国内爆初菊对白视频| 亚洲国产精品久久久| 天天色综合久久| 亚洲精品在线观看www| 激情小视频在线| 在线一区二区日韩| 久草免费在线| 欧美精品电影在线| 在线中文字幕播放| 国产精品久久久久久久久久小说| 另类一区二区三区| 亚洲最大av网| 欧美日韩一区二区三区在线电影| 免费亚洲一区二区| 91日韩欧美| 性高湖久久久久久久久aaaaa| 尤物精品在线| 日本成人在线免费视频| 麻豆精品一区二区| 欧美成人精品一区二区综合免费| 久久综合一区二区| 国精产品视频一二二区| 一区二区激情小说| 人妻丰满熟妇av无码区| 在线视频欧美精品| 99久久久久久久| 日韩高清免费在线| 嫩草在线视频| 97涩涩爰在线观看亚洲| 国内欧美日韩| 精品国产一区二区三区四区精华| 日韩在线观看| 国产黄页在线观看| 韩日av一区二区| 人人妻人人澡人人爽人人精品| 国产精品久久久久久久久图文区| 国产第100页| 欧美日韩一本到| 涩涩视频免费看| 日韩中文视频免费在线观看| bl视频在线免费观看| 国产精品丝袜久久久久久高清 | 日韩av大全| 欧美涩涩视频| 亚洲色图 在线视频| www.亚洲免费av| 2014亚洲天堂| 一本一本大道香蕉久在线精品 | 国产亚洲精品高潮| 日韩三级免费| 国产综合福利在线| 精品一区毛片| 久久av综合网| 国产综合久久久久久鬼色| 自拍偷拍中文字幕| 亚洲妇熟xx妇色黄| 国产偷拍一区二区| 中文字幕日韩在线视频| 色戒汤唯在线观看| 99久久综合狠狠综合久久止| 日韩成人影院| 国产av无码专区亚洲精品| 成人三级在线视频| 少妇影院在线观看| 欧美日韩亚洲另类| 国产午夜视频在线观看| 欧美一区二区三区精品电影| 91午夜精品| 2022中文字幕| 国产麻豆精品一区二区| www.黄色com| 欧美亚洲自拍偷拍| 国产在线黄色| 欧美在线激情视频| 日韩高清成人在线| 国产一二三在线视频| 国产精品一二三| 91嫩草丨国产丨精品| 欧美高清你懂得| 男人在线资源站| 国产美女久久精品| 日韩电影免费网站| 最新天堂在线视频| 国产精品久久福利| 国产理论视频在线观看| 久久亚洲影音av资源网 | 久久草视频在线看| 99热这里只有成人精品国产| 一级特级黄色片| 欧美三级欧美成人高清www| 亚洲av毛片成人精品| 97精品在线观看| 亚洲69av| 成人在线观看a| 国产欧美视频一区二区| 中文字幕视频二区| 日韩在线免费视频| 日韩精品一区二区三区中文字幕 | 欧产日产国产精品视频 | av男人的天堂在线| 成人美女免费网站视频| 欧美在线影院| 国产真实乱人偷精品| 日本乱码高清不卡字幕| 永久免费在线观看视频| 成人在线免费观看视视频| 在线成人激情| 中文字幕精品久久久| 91久久精品网| 国产不卡在线| 国产精品久久久久av福利动漫| 亚洲激情一区| 国产伦理片在线观看| 欧美日韩视频第一区| av软件在线观看| 国产一区二区三区色淫影院| 久久综合亚州| a级片在线观看免费| 亚洲男人第一av网站| 91成人福利社区| 久久黄色片视频| 国产女主播视频一区二区| 国产精品免费无遮挡| 97精品在线视频| 日韩成人影院| 污污污www精品国产网站| 欧美无砖砖区免费| 成人免费一区二区三区牛牛| 蜜桃视频在线观看成人| 久久99国内精品| 日本少妇裸体做爰| 中文字幕亚洲欧美日韩高清| 99精品在免费线中文字幕网站一区 | 日本人妖一区二区| 午夜精品一区二区三区视频| 日韩毛片在线看| 国产精品日本一区二区不卡视频| 激情伊人五月天| 亚洲欧洲一区二区在线播放| 天天干在线观看| 97视频热人人精品| 免费在线欧美视频| 成人免费视频毛片| 久久国产精品亚洲| 青草国产精品|