精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产精品色噜噜| 图片小说视频色综合| 亚州成人在线电影| 岛国视频一区免费观看| 性欧美疯狂猛交69hd| 成人黄色图片网站| 国产精品乱人伦中文| 成人高清视频观看www| 日韩欧美在线视频播放| 久久影视精品| 一区二区久久久久| 岛国视频一区免费观看| 亚洲国产成人无码av在线| 国产在线日韩精品| 51精品视频一区二区三区| 日韩精品久久久| 国产伦理一区二区| 亚洲免费黄色| 国产一区二区三区在线观看视频| 日韩一区二区三区久久| 18视频在线观看网站| 成人免费视频app| 日韩免费在线看| 三级影片在线观看| swag国产精品一区二区| 亚洲伊人色欲综合网| 蜜桃麻豆91| 97视频免费在线| 亚洲二区在线| 一区二区三区www| 久久久久久久久久久久91| 亚洲羞羞网站| 久久久精品黄色| 亚洲一区二区三区视频| 中文字幕超碰在线| 国产精品黑丝在线播放| 亚洲国产私拍精品国模在线观看| www黄色av| 国产美女av在线| 99久久99久久综合| 成人黄色免费网站在线观看| 日韩少妇高潮抽搐| 国产国产精品| 亚洲欧美日韩国产精品| 日本女人性视频| 户外露出一区二区三区| 亚洲国产综合在线| 亚洲最新在线| 黄色av免费在线观看| 国产成人免费在线观看| 国产精品美女久久久久av超清| 伊人365影院| 性欧美欧美巨大69| 亚洲片国产一区一级在线观看| 国产精品19p| 成人涩涩视频| 欧美日韩国产中文精品字幕自在自线| 国产奶头好大揉着好爽视频| 黄色av网站在线看| 91在线小视频| 国产高清自拍99| 国产精品一区二区av白丝下载 | 欧美成人国产va精品日本一级| 在线xxxxx| 亚洲日本va中文字幕| 欧美久久久一区| 在线免费观看av的网站| 深夜成人影院| 欧美午夜激情视频| 国产欧美日韩网站| 成人性生交大片免费看在线播放| 亚洲丝袜另类动漫二区| 亚洲精品8mav| 免费在线观看污视频| 久久品道一品道久久精品| 美乳视频一区二区| av在线免费一区| 国产精品成人一区二区三区夜夜夜| 自拍偷拍视频在线| 午夜在线激情影院| 午夜电影一区二区三区| 乱子伦视频在线看| 欧美日韩伦理一区二区| 欧美一区二区日韩一区二区| 性感美女一区二区三区| 天天操综合520| 伊人久久久久久久久久久| 日本一级二级视频| 亚洲啪啪91| 国产精品久久久久久亚洲影视| 国产女人爽到高潮a毛片| 国产河南妇女毛片精品久久久| 国产区二精品视| 国产69精品久久app免费版| 亚洲同性同志一二三专区| 亚洲熟妇无码av在线播放| 热色播在线视频| 欧美绝品在线观看成人午夜影视| 久久久久无码精品| 九一亚洲精品| 欧美日韩成人在线观看| 波多野结衣影片| 国产成人在线观看| 欧美日韩在线一二三| 中文字幕免费高清电视剧网站在线观看| 亚洲3atv精品一区二区三区| 9l视频白拍9色9l视频| 97se亚洲| 日韩视频在线免费观看| 日本中文字幕免费观看| 免费成人小视频| 国产亚洲欧美一区二区三区| √天堂资源地址在线官网| 亚洲一区二区不卡免费| 久久婷五月综合| 精品网站aaa| xvideos亚洲人网站| 青青草成人av| 国产成人a级片| 视频一区二区三区免费观看| 久久青青色综合| 欧美日韩精品福利| 国产精品无码在线| 欧美不卡视频| 国产日韩欧美夫妻视频在线观看| 亚洲欧美综合在线观看| 亚洲免费观看在线视频| 丁香婷婷激情网| 欧美成人基地| 色综合色综合久久综合频道88| 在线视频你懂得| 久久综合视频网| 男女猛烈激情xx00免费视频| 国产精品日本一区二区不卡视频| 亚洲美女激情视频| 日韩精品一区二区三| 国产精品一品视频| 一区在线电影| 99热播精品免费| 亚洲片av在线| 中文字幕免费观看| 久久综合九色综合久久久精品综合| 国产91在线亚洲| 国产95亚洲| 日韩亚洲欧美成人| 中文无码精品一区二区三区| 国产网站一区二区| 欧美日韩一区二区在线免费观看| 久久综合另类图片小说| 欧美激情国内偷拍| www精品国产| 亚洲精品国产成人久久av盗摄 | 色www永久免费视频首页在线 | 精品久久人妻av中文字幕| 国产精品久久久久影视| 国产又猛又黄的视频| 国产91精品对白在线播放| 欧美最猛性xxxxx(亚洲精品)| 天堂网在线播放| 亚洲成av人片一区二区梦乃| 99riav国产精品视频| 激情自拍一区| 国产一区免费观看| 两个人看的在线视频www| 亚洲精品福利在线| 欧美激情亚洲综合| 久久亚洲免费视频| 国产精品入口免费软件| 精品日本12videosex| 国产精品视频大全| а天堂中文在线官网| 欧美一区二区三区四区高清| 久草国产在线观看| 成人一区在线看| 好吊妞无缓冲视频观看| 国产成人精品免费视| 国产精品久久久久999| 男人影院在线观看| 日韩欧美在线观看一区二区三区| 久久久久99精品成人片毛片| 国产91高潮流白浆在线麻豆| 国产老熟妇精品观看| 免费一区二区三区视频导航| 国产精品久久久久久久久久免费| 香蕉视频在线播放| 欧美一区二区三区免费| 日韩精品――中文字幕| 国产午夜精品一区二区三区视频 | 日韩成人在线视频| 久久精品五月天| 亚洲三级免费电影| 在线观看免费视频黄| 天堂久久一区二区三区| 自拍偷拍亚洲色图欧美| 精品国内亚洲2022精品成人| 国产精品久久久久久五月尺| 欧美伦理免费在线| 亚洲欧美日韩成人| 亚洲AV无码一区二区三区少妇 | 中文字幕亚洲一区二区三区五十路| 国产女18毛片多18精品| 欧美日韩亚洲一区二| 天天操夜夜操av| 97久久超碰精品国产| 九九热精品在线播放| aa亚洲婷婷| 伊人av成人| 日韩影视在线观看| 51国偷自产一区二区三区的来源| 中文字幕在线直播| 精品少妇v888av| 免费看男男www网站入口在线 | 色www免费视频| 亚洲看片一区| 国产免费色视频| 美女精品一区最新中文字幕一区二区三区| 国产精品综合网站| av电影一区| 国内揄拍国内精品| 欧美精品电影| 亚洲色图欧美制服丝袜另类第一页| 99久久婷婷国产一区二区三区| 色综合天天综合| 国产一级大片在线观看| 中文字幕一区二区三区视频| 91丝袜在线观看| 国产盗摄女厕一区二区三区| 五月婷婷六月丁香激情| 久久精品一本| 成人毛片一区二区| 欧美深夜福利| 久久久无码中文字幕久...| 欧美日韩国产在线观看网站 | 日韩美女精品| 成人激情直播| 高清不卡一区| 91精品视频免费看| 成人亚洲网站| 国产精品久久久亚洲| 中文字幕这里只有精品| 午夜精品在线视频| 女人黄色免费在线观看| 久久国产加勒比精品无码| 在线看黄色av| 中文字幕日韩电影| yes4444视频在线观看| 亚洲欧美中文字幕| 欧美xxx.com| 亚洲午夜未删减在线观看| 十九岁完整版在线观看好看云免费| 精品福利一区二区三区免费视频| www.热久久| 欧美xingq一区二区| 丰满人妻一区二区三区四区53| 欧美一级艳片视频免费观看| 国产视频一二三四区| 欧美一区二区三级| www.爱爱.com| 精品国产露脸精彩对白| 人妻91麻豆一区二区三区| 亚洲成人在线网| 天堂av在线7| 亚洲人成欧美中文字幕| 国产在线视频网| 一区二区三区无码高清视频| 成a人片在线观看www视频| 中文字幕av一区二区| 九色porny在线| 欧美高清视频在线播放| sis001亚洲原创区| 欧美亚洲在线播放| 精品123区| 国产一区二区丝袜| 久久久久亚洲精品中文字幕| 岛国一区二区三区高清视频| 色老板在线视频一区二区| 欧美在线播放一区二区| 成人黄色av| 玖玖精品在线视频| 亚洲免费成人| 爆乳熟妇一区二区三区霸乳| 狠狠色丁香久久婷婷综合丁香| www.四虎精品| 久久久不卡网国产精品一区| 污污视频网站在线免费观看| 一区二区三区四区在线免费观看| 欧美成人aaaaⅴ片在线看| 欧美午夜无遮挡| 91丨porny丨在线中文 | 国产99久久精品一区二区永久免费 | 国产乱国产乱300精品| 亚洲一区二区在线免费| 国产欧美一区二区三区鸳鸯浴 | 国产精品一区二区av日韩在线 | 亚洲三级网站| 国产 porn| 福利一区二区在线观看| 国产sm调教视频| 一区二区三区欧美视频| 精品国产乱子伦| 日韩一区二区三区电影| 欧美日韩影视| 欧美成人高清视频| 亚洲日本网址| 国产精品三区www17con| 日韩一区自拍| 日本阿v视频在线观看| 免费久久精品视频| 色噜噜在线观看| 亚洲欧美国产三级| 中文字幕在线天堂| 精品久久一区二区三区| 成人性爱视频在线观看| 韩国一区二区电影| 国产成人久久精品一区二区三区| 欧美日韩电影一区二区| 欧美黄色免费| 狠狠操狠狠干视频| 久久精品视频一区二区| 国产污视频在线看| 欧美一区二区三区啪啪| www.亚洲.com| 日本久久久久久| 加勒比中文字幕精品| 欧美交换配乱吟粗大25p| 奇米综合一区二区三区精品视频| 老熟妇精品一区二区三区| 亚洲美女视频一区| 亚洲图片小说视频| 国产小视频91| 巨茎人妖videos另类| 国产伦精品一区二区三区| 亚洲色图欧美| 国产精品一区二区小说| 国产欧美精品一区aⅴ影院| 啦啦啦免费高清视频在线观看| 亚洲爱爱爱爱爱| 欧美人与牲禽动交com| 91精品国产高清久久久久久91裸体 | 五月天综合视频| 欧美午夜激情视频| 欧美日本网站| 欧洲成人免费aa| 天堂在线精品| 国产激情在线观看视频| 97精品国产97久久久久久久久久久久| 国产性一乱一性一伧一色| 日韩欧美高清在线| 亚洲卡一卡二| 高清不卡日本v二区在线| 精品白丝av| 97精品人妻一区二区三区蜜桃| 亚洲综合男人的天堂| 午夜精品一区二区三| 欧美成人中文字幕| 一区二区三区免费在线看| 免费在线黄网站| 波波电影院一区二区三区| 男人的天堂一区| 日韩福利在线播放| 都市激情亚洲综合| 青青草原成人| 久久精品久久综合| 久久国产精品国语对白| 日韩一区二区三区在线| 午夜成年人在线免费视频| 成人在线免费网站| 日韩香蕉视频| 一本加勒比北条麻妃| 欧美丝袜丝交足nylons图片| 欧美成人高清在线| 成人黄动漫网站免费| 一区二区久久| 久久精品—区二区三区舞蹈| 欧美巨大另类极品videosbest| av大大超碰在线| 国产综合 伊人色| 久久久久欧美精品| 岛国片在线免费观看| 欧美一区二区三区性视频| 末成年女av片一区二区下载| 日韩欧美第二区在线观看| 九九久久精品视频| 国产精品 欧美 日韩| 亚洲精品视频播放| 999久久久国产999久久久| 东北少妇不带套对白| 久久九九国产精品| 国产乱色精品成人免费视频| 高清欧美性猛交xxxx| 精品国产乱码久久久久久果冻传媒 | av在线私库| 日韩一二三区不卡在线视频| 国产又粗又猛又爽又黄91精品| 日韩欧美大片在线观看| 精品麻豆剧传媒av国产九九九| 日韩性感在线| 国产suv一区二区三区88区| 国产精品久久久久久久久久精爆| 日韩专区中文字幕|