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

避免 Swift 單元測試中的強制解析

開發(fā) 后端
強制解析(使用 !)是 Swift 語言中不可或缺的一個重要特點(特別是和 Objective-C 的接口混合使用時)。它回避了一些其他問題,使得 Swift 語言變得更加優(yōu)秀。

[[421417]]

本文轉載自微信公眾號「網羅開發(fā)」,作者Rickey王小吉。轉載本文請聯(lián)系網羅開發(fā)公眾號。

前言

強制解析(使用 !)是 Swift 語言中不可或缺的一個重要特點(特別是和 Objective-C 的接口混合使用時)。它回避了一些其他問題,使得 Swift 語言變得更加優(yōu)秀。比如 處理 Swift 中非可選的可選值類型[1] 這篇文章中,在項目邏輯需要時使用強制解析去處理可選類型,將導致一些離奇的情況和崩潰。

所以盡可能地避免使用強制解析,將有助于搭建更加穩(wěn)定的應用,并且在發(fā)生錯誤時提供更好的報錯信息。那么如果是編寫測試時,情況會怎么樣呢?安全地處理可選類型和未知類型需要大量的代碼,那么問題就在于我們是否愿意為編寫測試做所有的額外工作。這就是我們這周將要探討的問題,讓我們開始深入研究吧!

測試代碼 vs 產品代碼

當編寫測試代碼時,我們經常明確區(qū)分測試代碼和產品代碼。盡管保持這兩部分代碼的分離十分重要(我們不希望意外地讓我們的模擬測試對象成為 App Store 上架的部分??),但就代碼質量來說,沒有必要進行明顯區(qū)分。

如果你思考一下的話,我們想要對移交給使用者的代碼進行高標準的要求,原因是什么呢?

我們想要我們的 app 為使用者穩(wěn)定、流暢地運行。

  • 我們想要我們的 app 在未來易于維護和修改。
  • 我們想要更容易讓新人融入我們的團隊。
  • 現(xiàn)在如果反過來考慮我們的測試,我們想要避免哪些事情呢?

測試不穩(wěn)定、脆弱、難于調試。

  • 當我們的 app 增加了新功能時,我們的測試代碼需要花費大量時間來維護和升級。
  • 測試代碼對于加入團隊的新人來說難于理解。
  • 你可能已經理解我所講的內容了 ??。

之前很長的時間,我曾認為測試代碼只是一些我快速堆砌的代碼,因為有人告訴我必須要編寫測試。我不那么在乎它們的質量,因為我將它視為一件瑣事,并不將它放在首位。然而,一旦我因為編寫測試而發(fā)現(xiàn)驗證自己的代碼有多么快,以及對自己有多么自信 —— 我對測試的態(tài)度就開始了轉變。

所現(xiàn)在我相信對于測試代碼,和將要移交的產品代碼進行同等的高標準要求是非常重要的。因為我們配套的測試是需要我們長期使用、拓展和掌握的,我們理應讓這些工作更容易完成。

強制解析的問題

那么這一切與 Swift 中的強制解析有什么關系呢???

有時必須要強制解析,很容易編寫一個 “go-to solution” 的測試。讓我們來看一個例子,測試 UserService實現(xiàn)的登陸機制是否正常工作:

  1. class UserServiceTests: XCTestCase { 
  2.     func testLoggingIn() { 
  3.         // 為了登陸終端 
  4.         // 構建一個永遠返回成功的模擬對象 
  5.         let networkManager = NetworkManagerMock() 
  6.         networkManager.mockResponse(forEndpoint: .login, with: [ 
  7.             "name""John"
  8.             "age": 30 
  9.         ]) 
  10.  
  11.         // 構建 service 對象以及登錄 
  12.         let service = UserService(networkManager: networkManager) 
  13.         service.login(withUsername: "john"password"password"
  14.  
  15.         // 現(xiàn)在我們想要基于已登陸的用戶進行斷言, 
  16.         // 這是可選類型,所以我們對它進行強制解析 
  17.         let user = service.loggedInUser! 
  18.         XCTAssertEqual(user.name"John"
  19.         XCTAssertEqual(user.age, 30) 
  20.     } 

如你所見,在進行斷言之前,我們強制解析了 service 對象的 loggedInUser 屬性。像上面這樣的做法并不是絕對意義上的錯,但是如果這個測試因為一些原因開始失敗,就可能會導致一些問題。

假設某人(記住,“某人”可能就是“未來的你自己”??)改變了網絡部分的代碼,導致上述測試開始崩潰。如果這樣的事情發(fā)生了,錯誤信息可能只會像下面這樣:

  1. Fatal error: Unexpectedly found nil while unwrapping an Optional value 

盡管用 Xcode 本地運行時這不是個大問題(因為錯誤會被關聯(lián)地顯示 —— 至少在大多數(shù)時候 ??),但當連續(xù)地整體運行整個項目時,它可能問題重重。上述的錯誤信息可能出現(xiàn)在巨大的“文字墻”中,導致難以看出錯誤的來源。更嚴重的是,它會阻止后續(xù)的測試被執(zhí)行(因為測試進程會崩潰),這將導致修復工作進展緩慢并且令人煩躁。

Guard 和 XCTFail

一個潛在的解決上述問題的方式是簡單地使用 guard 聲明,優(yōu)雅地解析問題中的可選類型,如果解析失敗再調用 XCTFail 即可,就像下面這樣:

  1. guard let user = service.loggedInUser else { 
  2.     XCTFail("Expected a user to be logged in at this point"
  3.     return 

盡管上述做法在某些情況下是正確的做法,但事實上我推薦避免使用它 —— 因為它向你的測試中增加了控制流。為了穩(wěn)定性和可預測性,你通常希望測試只是簡單的遵循 given,when,then 結構,并且增加控制流會使得測試代碼難于理解。如果你真的非常倒霉,控制流可能成為誤報的起源(對此之后的文章會有更多的相關內容)。

保持可選類型

另一個方法是讓可選類型一直保持可選。這在某些使用情況下完全可用,包括我們 UserManager 的例子。因為我們對已經登錄的 user 的 name 和 age 屬性使用了斷言,如果任意一個屬性為 nil ,我們會自動得到錯誤提示。同時如果我們對 user 使用額外的 XCTAssertNotNil 檢查,我們就能得到一個非常完整的診斷信息。

  1. let user = service.loggedInUser 
  2. XCTAssertNotNil(user"Expected a user to be logged in at this point"
  3. XCTAssertEqual(user?.name"John"
  4. XCTAssertEqual(user?.age, 30) 

現(xiàn)在如果我們的測試開始出錯了,我們就能得到如下信息:

  1. XCTAssertNotNil failed - Expected a user to be logged in at this point 
  2. XCTAssertEqual failed: ("nil"is not equal to ("Optional("John")"
  3. XCTAssertEqual failed: ("nil"is not equal to ("Optional(30)"

這讓我們能夠更加容易地知道發(fā)生錯誤的地方,以及該從哪里入手去調試、解決這個錯誤 ??。

使用 throw 的測試

第三個選擇在某些情況下是非常有用的,就是將返回可選類型的 API 替換為 throwing API。Swift 中的 throwing API 的優(yōu)雅之處在于,需要時它能夠非常容易地被當成可選類型使用。所以很多時候選擇采用 throwing 方法,不需要犧牲任何的可用性。比如說,假設我們有一個 EndpointURLFactory 類,被用來在我們的 app 中生成特定終端的 URL,這顯然會返回可選類型:

  1. class EndpointURLFactory { 
  2.     func makeURL(for endpoint: Endpoint) -> URL? { 
  3.         ... 
  4.     } 

現(xiàn)在我們將其轉換為采用 throwing API,像這樣:

  1. class EndpointURLFactory { 
  2.     func makeURL(for endpoint: Endpoint) throws -> URL { 
  3.         ... 
  4.     } 

當我們仍然想得到一個可選類型的 URL 時,我們只需要使用 try? 命令去調用它:

  1. let loginEndpoint = try? urlFactory.makeURL(for: .login) 

就測試而言,上述這種做法的最大好處在于可以在測試中輕松地使用 try,并且使用 XCTest runner 完全可以毫無代價地處理無效值。這是鮮為人知的,但事實上 Swift 測試可以是 throwing 函數(shù),看看這個:

  1. class EndpointURLFactoryTests: XCTestCase { 
  2.     func testSearchURLContainsQuery() throws { 
  3.         let factory = EndpointURLFactory() 
  4.         let query = "Swift" 
  5.  
  6.         // 因為我們的測試函數(shù)是 throwing,這里我們可以簡單地采用 'try' 
  7.         let url = try factory.makeURL(for: .search(query)) 
  8.         XCTAssertTrue(url.absoluteString.contains(query)) 
  9.     } 

沒有可選類型,沒有強制解析,某些發(fā)生錯誤的時候也能完美地做出診斷 ??。

使用 require 的可選類型

然而,并不是所有返回可選類型的 API 都可以被替換為 throwing。不過在寫包含可選類型的測試時,有一個和 throwing API 同樣好的方法。

讓我們回到最開始 UserManager 的例子。如果既不對 loggedInUser 進行強制解析,又不把它看作可選類型,那么我們可以簡單地這樣做:

  1. let user = try require(service.loggedInUser) 
  2. XCTAssertEqual(user.name"John"
  3. XCTAssertEqual(user.age, 30) 

這實在是太酷了!??這樣我們可以擺脫大量的強制解析,同時避免讓我們的測試代碼難于編寫、難于上手。那么為了達到上述效果我們應該怎么做呢?這很簡單,我們只需要對 XCTestCase 增加一個拓展,讓我們分析任何可選類型表達式,并且返回非可選的值或者拋出一個錯誤,像這樣:

  1. extension XCTestCase { 
  2.     // 為了能夠輸出優(yōu)雅的錯誤信息 
  3.     // 我們遵循 LocallizedErrow 
  4.     private struct RequireError<T>: LocalizedError { 
  5.         let file: StaticString 
  6.         let line: UInt 
  7.  
  8.         // 實現(xiàn)這個屬性非常重要 
  9.         // 否則測試失敗時我們無法在記錄中優(yōu)雅地輸出錯誤信息 
  10.         var errorDescription: String? { 
  11.             return "😱 Required value of type \(T.self) was nil at line \(line) in file \(file)." 
  12.         } 
  13.     } 
  14.  
  15.     // 使用 file 和 line 使得我們能夠自動捕獲 
  16.     // 源代碼中出現(xiàn)的相對應的表達式 
  17.     func require<T>(_ expression: @autoclosure () -> T?, 
  18.                     file: StaticString = #file, 
  19.                     line: UInt = #line) throws -> T { 
  20.         guard let value = expression() else { 
  21.             throw RequireError<T>(file: file, line: line) 
  22.         } 
  23.  
  24.         return value 
  25.     } 

現(xiàn)在有了上述內容,如果我們 UserManager 登錄測試發(fā)生失敗,我們也能得到一個非常優(yōu)雅的錯誤信息,告訴我們錯誤發(fā)生的準確位置。

  1. [UserServiceTests testLoggingIn] : failed: caught error: 😱 Required value of type User was nil at line 97 in file UserServiceTests.swift. 

你可能意識到這個技巧來源于我的迷你框架 Require[2], 它對所有可選類型增加了一個 require() 方法,以提高對無法避免的強制解析的診斷效果。

總結

以同樣謹慎的態(tài)度對待你的應用代碼和測試代碼,在最開始可能有些不適應,但可以讓長期維護測試變的更加簡單 —— 不論是獨立開發(fā)還是團隊開發(fā)。良好的錯誤診斷和錯誤信息是其中特別重要的一部分,使用本文中的一些技巧或許能夠讓你在未來避免很多奇怪的問題。

我在測試代碼中唯一使用強制解析的時候,就是在構建測試案例的屬性時。因為這些總是在 setUp 中被創(chuàng)建、tearDown 中被銷毀,我并不把他們當作真正的可選類型。正如以往,你同樣需要查看你自己的代碼,根據你自己的喜好,來權衡決定。

 

所以你覺得呢?你會采用一些本文中的技巧,還是你已經用了一些相關的方式?請讓我知道,包括你可能有的任何的問題、評價和反饋。

 

責任編輯:武曉燕 來源: 網羅開發(fā)
相關推薦

2011-07-27 17:02:12

Xcode iPhone 單元測試

2017-01-14 23:42:49

單元測試框架軟件測試

2016-03-23 10:47:55

Xcode7Swift測試

2017-03-28 12:25:36

2023-04-14 09:04:07

測試TDBF單元測試

2023-07-26 08:58:45

Golang單元測試

2011-05-16 16:52:09

單元測試徹底測試

2017-01-16 12:12:29

單元測試JUnit

2017-01-14 23:26:17

單元測試JUnit測試

2022-12-08 08:01:02

Python測試單元

2011-06-14 15:56:42

單元測試

2022-05-12 09:37:03

測試JUnit開發(fā)

2020-08-18 08:10:02

單元測試Java

2023-09-20 21:30:14

單元測試完全指南

2017-03-23 16:02:10

Mock技術單元測試

2021-05-05 11:38:40

TestNGPowerMock單元測試

2024-10-16 16:09:32

2020-05-07 17:30:49

開發(fā)iOS技術

2011-07-04 18:16:42

單元測試

2011-06-14 15:39:46

單元測試
點贊
收藏

51CTO技術棧公眾號

91精品国产91久久综合桃花| 日韩无码精品一区二区三区| 五月婷婷激情五月| 国产精品18| 国产一级一区二区| 日韩视频123| 亚洲精品在线视频观看| 日本中文字幕第一页| 加勒比中文字幕精品| 亚洲在线成人精品| 91欧美视频网站| 免费黄色国产视频| 精品九九久久| 国产精品水嫩水嫩| 国产精品夫妻激情| 亚洲成人黄色av| 欧美在线极品| 91亚洲永久精品| 91精品国产成人www| 一级少妇精品久久久久久久| 女囚岛在线观看| 国产一区二区三区四区二区| 欧美性猛交xxxx乱大交3| 国产一区在线免费观看| 日韩精品人妻中文字幕| 欧美日韩导航| 色婷婷精品大在线视频 | 国产精品99久久久久久人| 亚洲欧美在线磁力| 大西瓜av在线| 亚洲成人黄色片| 欧美女人交a| 欧美成人性福生活免费看| 99re8这里只有精品| 久久综合激情| 日韩中文字幕区一区有砖一区 | 亚洲成人77777| 神马影视一区二区| 综合自拍亚洲综合图不卡区| 欧美日韩精品不卡| 91看片破解版| 日本三级视频在线播放| 精品一区二区三区久久久| 久久综合成人精品亚洲另类欧美 | 色综合天天性综合| 男女裸体影院高潮| 国产嫩bbwbbw高潮| 日韩视频中文| 日韩精品电影在线观看| 久久精品男人天堂| 亚洲欧美偷拍另类| 黄色小网站在线观看| 国产资源精品在线观看| 欧美黑人巨大xxx极品| 国产精品无码在线| 天天免费亚洲黑人免费| 亚洲欧洲精品成人久久奇米网| 欧美久久在线| 国产精品一二三区视频| 精品系列免费在线观看| 久久免费精品日本久久中文字幕| 久久精品一区二区免费播放| 免费一区二区三区四区| 丰满女人性猛交| 久久精品五月天| 久久影视一区| 精品乱码亚洲一区二区不卡| 日韩精品视频网址| 欧美gay视频| 色综合久久中文综合久久97| 九九热在线视频观看这里只有精品| 欧美日韩色综合| 国产精品久久精品国产 | av久久久久久| 午夜羞羞小视频在线观看| 成人午夜视频网站| 国产精品久久久久久久午夜| 国产精品日日夜夜| 成人在线免费观看视频| 亚洲电影在线看| 香蕉一区二区| 国产欧美中文在线| 91成人理论电影| 亚洲 欧美 中文字幕| 日韩精品亚洲专区| 成人精品视频99在线观看免费| 日韩欧美亚洲视频| 香蕉精品999视频一区二区| 欧美日韩aaaaa| 免费看污污视频| 欧美人与牲禽动交com| 精品国产91| 欧美在线三级电影| 国产一区二区网| av毛片在线免费看| 中文字幕一区二区三区不卡| 美日韩精品免费| 丰满肉嫩西川结衣av| 久久99久久久欧美国产| 国产精品xxxx| 亚洲高清视频网站| 久久久99精品免费观看| 国产日韩亚洲精品| av在线播放网| 国产精品一区二区x88av| 国产精品一区电影| 国产男人搡女人免费视频| 麻豆久久婷婷| 日韩免费黄色av| 亚洲欧美一区二区三区在线观看| 久久99久久99| 蜜桃欧美视频| 国产精品—色呦呦| 亚洲第一精品在线| www.射射射| 国产理论在线| 欧美日韩中文在线| 国产黄色一区二区三区| 欧美丝袜一区| 4438全国成人免费| www.国产一区二区| 国产精品一区二区三区四区| 香蕉久久夜色| 欧美成人高清在线| 一区二区三区精密机械公司| 欧美伦理视频在线观看| 未满十八勿进黄网站一区不卡| 69精品人人人人| 亚洲综合中文网| 99精品国产高清一区二区麻豆| 亚洲精品成人久久久| 国产吞精囗交久久久| 国产精品videosex极品| 午夜剧场成人观在线视频免费观看 | 无人区在线高清完整免费版 一区二| 欧美性xxxx在线播放| 成人一区二区三区仙踪林| 国产成人夜色高潮福利影视| 亚洲精品98久久久久久中文字幕| 精品国产欧美日韩不卡在线观看 | 青青艹视频在线| 日韩免费小视频| 亚洲精品影视在线观看| 亚洲不卡的av| 欧美私人啪啪vps| 成人免费网视频| 性开放的欧美大片| 欧美嫩在线观看| 高清中文字幕mv的电影| 你微笑时很美电视剧整集高清不卡| 欧美华人在线视频| 黑人精品一区二区| 亚洲成人动漫精品| 美女又爽又黄免费| 久久aⅴ乱码一区二区三区| 免费精品视频一区| 日韩国产网站| 日韩在线视频中文字幕| 国产乡下妇女做爰视频| 大桥未久av一区二区三区中文| 丰满人妻一区二区三区53号| 自拍在线观看| 欧美一区二区播放| 亚洲熟女www一区二区三区| 久久婷婷久久| 亚洲高清123| 日本免费成人| 欧美日韩国产成人| 中文有码在线播放| 91一区一区三区| 久久久噜噜噜www成人网| 精品国产亚洲一区二区三区大结局| 亚洲精品午夜精品| 波多野结衣家庭主妇| 中文字幕在线不卡国产视频| xxxxwww一片| 亚洲综合好骚| 中文字幕一区二区三区乱码| 亚洲欧美小说色综合小说一区| 亚洲一区二区精品| 少妇一级淫片免费放中国 | 亚洲 欧美 日韩在线| 久久免费大视频| 1区1区3区4区产品乱码芒果精品| 18video性欧美19sex高清| 91麻豆精品91久久久久久清纯| 天天看片中文字幕| 91在线观看视频| 欧美一级小视频| 日韩视频一区| 手机看片日韩国产| 亚州av日韩av| 91传媒视频免费| 欧美日韩国产v| 欧美高清视频在线| 国产爆初菊在线观看免费视频网站| 91精品国产91综合久久蜜臀| 91黑人精品一区二区三区| 亚洲嫩草精品久久| 久久精品国产露脸对白| 1024成人| 九色综合婷婷综合| 漫画在线观看av| 久久久999精品| 欧美777四色影视在线| 色婷婷av一区二区三区大白胸 | 无码精品国产一区二区三区免费| 99久久亚洲精品| 国产精品一区二区三区免费视频| 五月婷婷视频在线观看| 国产午夜一区二区| 日韩性xxxx| 精品久久久久久久中文字幕| 中文字幕人妻一区二区三区| 麻豆成人久久精品二区三区红 | 欧美 变态 另类 人妖| 日韩视频中文| 日本a级片在线播放| 欧美成免费一区二区视频| 欧美成人综合一区| 极品国产人妖chinesets亚洲人妖 激情亚洲另类图片区小说区 | 欧美精品一区二区蜜臀亚洲| www.av视频| 中文字幕在线不卡国产视频| 日本一卡二卡在线播放| 蓝色福利精品导航| 日本免费黄视频| 九九综合在线| 国产一区精品在线| 一区二区三区四区视频免费观看| 欧美激情一区二区三区在线视频观看| 日韩一级片免费| 日韩午夜精品视频| 国产免费黄色录像| 午夜视频久久久久久| 91中文字幕永久在线| 久久草av在线| 最新中文字幕免费视频| 中文字幕一区二区av| 精品国产一区二区三区麻豆免费观看完整版 | 日本伊人色综合网| 一区二区三区四区五区精品| 久久综合给合| 91精品综合视频| 91麻豆精品国产91久久久更新资源速度超快| 久久91精品国产91久久跳| 免费看a在线观看| 久久精品成人欧美大片| 精精国产xxxx视频在线| 日韩在线视频国产| 黄色在线播放网站| 欧美激情视频在线| 福利影院在线看| 欧美一级淫片aaaaaaa视频| 在线免费av资源| 国产精品igao视频| 超薄肉色丝袜脚交一区二区| 欧美日本精品在线| 18+激情视频在线| 欧美精品成人91久久久久久久| 国产盗摄精品一区二区酒店| 韩国v欧美v日本v亚洲| 成人欧美大片| 欧美大秀在线观看| www.8ⅹ8ⅹ羞羞漫画在线看| 91国内产香蕉| 日韩精品一区二区三区av| 国产一区二区香蕉| 午夜精品成人av| 国产精品入口夜色视频大尺度| 日韩成人精品一区二区三区| 99c视频在线| 精品久久毛片| 91在线视频成人| 久久夜色电影| 亚洲春色综合另类校园电影| 亚洲精品一区二区妖精| 日韩精彩视频| 亚洲成人一品| 精品国产乱码久久久久久蜜柚| 免费国产自久久久久三四区久久| 一区二区免费在线观看| 今天的高清视频免费播放成人| 中国人体摄影一区二区三区| 国产精品mv在线观看| 日韩avxxx| 国产精品1区2区3区在线观看| 成人性生交免费看| 日韩国产一区二| 丰满少妇中文字幕| 久久久久久久久久电影| 黄视频网站免费看| 亚洲欧美日韩中文字幕一区二区三区 | 欧美在线一级视频| 日韩精品一区二区三区国语自制| 亚洲成人资源网| 国产精品无码粉嫩小泬| 欧美草草影院在线视频| 国产裸舞福利在线视频合集| 精品中文字幕乱| 久久99久久99精品免观看软件| 91手机在线观看| 成人在线电影在线观看视频| 国产精品专区在线| 韩国欧美国产1区| 一区二区伦理片| 亚洲第一久久影院| 国产永久免费视频| 欧美久久久一区| 三级国产在线观看| 日韩精品中文字| 亚洲欧美成人影院| 国产欧美日韩亚洲精品| 蜜桃成人av| 免费 成 人 黄 色| 国产91丝袜在线播放| 在线观看免费视频黄| 亚洲欧美综合网| 久久久999久久久| 日韩精品在线观| 丁香花电影在线观看完整版| 成人乱人伦精品视频在线观看| 奇米狠狠一区二区三区| 免费av观看网址| 波多野结衣视频一区| 丝袜美腿中文字幕| 亚洲国产成人精品视频| 国内精品久久久久久久久久久 | 超碰福利在线观看| 亚洲精品在线电影| 在线观看男女av免费网址| 国产在线高清精品| 日韩美女一区二区三区在线观看| 精品国产无码在线| 久久精品国产一区二区| 亚洲精品国产精品国自产网站| 国产精品久久久久婷婷| 久久久久久av无码免费网站| 欧美视频免费在线| 日本精品久久久久久| 久久久亚洲精选| 久久久久久毛片免费看 | 精品人伦一区二区色婷婷| 手机在线免费观看av| 亚洲综合国产精品| 色爱综合av| 国产91在线视频观看| 久久久久久免费| 中文天堂在线资源| 久久久91精品国产一区不卡| 欧美三级一区| 18禁裸男晨勃露j毛免费观看 | 制服 丝袜 综合 日韩 欧美| 日本高清无吗v一区| 91精彩在线视频| 91在线视频九色| 狠狠入ady亚洲精品| 亚洲国产精品成人综合久久久| 欧美日韩国产中文精品字幕自在自线| 中文字幕久久久久| 日韩色av导航| 二吊插入一穴一区二区| 亚洲7777| 国产精品一区二区黑丝| 国产成人精品a视频一区| 亚洲欧美在线免费观看| 热久久久久久| 91免费国产精品| 久久伊人蜜桃av一区二区| 羞羞色院91蜜桃| 欧美成人手机在线| 成人免费在线观看视频| 美乳视频一区二区| 日日骚欧美日韩| www欧美com| 日韩国产欧美区| 男女在线视频| 久久精品国产综合精品| 日韩电影在线观看电影| 青青青在线免费观看| 日韩经典第一页| 日韩黄色在线| 9久久9毛片又大又硬又粗| 中文字幕制服丝袜一区二区三区 | 黄色片网站在线免费观看| 日韩欧美国产精品| 免费大片黄在线观看视频网站| 动漫一区二区在线| 久久精品中文| 青娱乐在线视频免费观看| 91精品国产综合久久婷婷香蕉| 999av小视频在线| 一本久道久久综合| 99精品久久免费看蜜臀剧情介绍| 在线观看亚洲国产| 中文字幕久久亚洲| 成人在线视频观看| 久久久久久久9| 成人国产精品免费观看动漫| 中文字幕人妻一区二区在线视频 |