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

Swift 單元測試入門,你學會了嗎?

開發 前端
有多種方法可以測試相同的結果,但是當測試失敗時它并不總是給出相同的反饋。以下提示可幫助您編寫測試,通過從詳細的失敗消息中獲益,幫助您更快地解決失敗的測試。

前言

編程語言中的單元測試是為了確保編寫的代碼按預期工作。給定一個特定的輸入,您希望代碼帶有一個特定的輸出。通過測試您的代碼,能夠給您當前的重構和發布建立信心,因為您將能夠確保代碼在成功運行您的測試套件后按預期工作。

許多開發人員不編寫單元測試,因為他們認為這會花費太多時間,有可能錯過最后期限。在我看來,單元測試會讓你在最后期限前完成更多工作,因為你會花更少的時間解決錯誤或為關鍵問題打補丁。

這篇文章內不會涵蓋 內存泄漏測試 或 為共享擴展編寫 UI 測試,而是主要關注編寫更好的單元測試。我還將分享幫助我開發更好、更穩定的應用程序的最佳實踐。

什么是單元測試

單元測試是運行和驗證一段代碼(稱為“單元”)以確保其按預期運行并符合其設計的自動化測試。

單元測試在 Xcode 中有它們的 target,并使用 XCTest 框架編寫。XCTestCase 的子類包含要運行的測試方法,其中只有以 "test" 開頭的方法才會被 Xcode 解析并允許運行。

例如,假設有一個字符串擴展方法將第一個字母大寫:

extension String {
func uppercasedFirst() -> String {
let firstCharacter = prefix(1).capitalized
let remainingCharacters = dropFirst().lowercased()
return firstCharacter + remainingCharacters
}
}

我們要確保 uppercasedFirst() 方法按預期工作。如果我們給它一個輸入 antoine,我們期望它輸出 Antoine。我們可以使用 XCTAssertEqual 方法為此方法編寫單元測試:

final class StringExtensionsTests: XCTestCase {
func testUppercaseFirst() {
let input = "antoine"
let expectedOutput = "Antoine"
XCTAssertEqual(input.uppercasedFirst(), expectedOutput, "The String is not correctly capitalized.")
}
}

如果我們的方法不再按預期工作(比如上面的擴展代碼不小心被修改了),Xcode 將使用我們提供的描述顯示失敗:

圖片

在 Swift 中編寫單元測試

有多種方法可以測試相同的結果,但是當測試失敗時它并不總是給出相同的反饋。以下提示可幫助您編寫測試,通過從詳細的失敗消息中獲益,幫助您更快地解決失敗的測試。

命名測試用例和方法

描述你的單元測試是很重要的,這樣你就會明白測試試圖驗證什么。如果你不能想出一個簡短的名字,那你可能測試了太多東西。一個好名字還可以幫助您更快地解決失敗的測試。

要快速找到特定類的測試用例,建議使用相同的命名并結合 “test”。就像上面的例子一樣,我們根據我們正在測試一組字符串擴展的事實命名了 StringExtensionTests。如果您正在測試ContentViewModel 實例,另一個示例可能是 ContentViewModelTests。

不要所有測試都使用 XCTAssert

許多場景都可以使用 XCTAssert,但當測試失敗時會導致不同的結果。以下代碼行都測試了完全相同的結果:

func testEmptyListOfUsers() {
let viewModel = UsersViewModel(users: ["Ed", "Edd", "Eddy"])
XCTAssert(viewModel.users.count == 0)
XCTAssertTrue(viewModel.users.count == 0)
XCTAssertEqual(viewModel.users.count, 0)
}

正如你所看到的,該方法使用了一個描述性的名字,告訴人們要測試一個空的用戶列表。然而,我們定義的視圖模型不是空的,因此,所有的斷言都失敗了。

圖片

結果顯示了為什么必須對驗證類型使用正確的斷言。XCTAssertEqual 方法為我們提供了有關斷言失敗原因的更多上下文。這顯示在紅色錯誤和控制臺日志中,可幫助您快速識別失敗的測試。

Setup and Teardown

多個測試方法中使用的參數可以定義為測試用例類中的屬性。您可以使用 setUp() 方法為每個測試方法設置初始狀態,并使用 tearDown() 方法進行清理。有多種設置和拆卸方法的變體供您選擇,例如支持并發的變體或拋出變體,如果設置失敗,您可以在其中提前使測試失敗。

一個可以生成用戶默認實例以用于單元測試的示例:

struct SearchQueryCache {
var userDefaults: UserDefaults = .standard

func storeQuery(_ query: String) {
/// ...
}
}

final class SearchQueryCacheTests: XCTestCase {

private var userDefaults: UserDefaults!
private var userDefaultsSuiteName: String!

override func setUpWithError() throws {
try super.setUpWithError()
userDefaultsSuiteName = UUID().uuidString
userDefaults = UserDefaults(suiteName: userDefaultsSuiteName)
}

override func tearDownWithError() throws {
try super.tearDownWithError()
userDefaults.removeSuite(named: userDefaultsSuiteName)
userDefaults = nil
}

func testSearchQueryStoring() {
/// 使用生成的用戶默認值作為輸入。
let cache = SearchQueryCache(userDefaults: userDefaults)

/// ... write the test
}
}

這樣做可以確保您不會操縱在模擬器上測試期間使用的標準用戶默認值。其次,您將確保在測試開始時處于干凈狀態。我們使用了拆卸方法來刪除用戶默認套件并進行相應的清理。

拋出方法

和編寫應用程序代碼時一樣,您也可以定義一個可拋出測試的方法。這允許您在測試中的方法拋出錯誤時使測試失敗。例如,在測試 JSON 響應的解碼時:

func testDecoding() throws {
/// 當數據初始值設定項拋出錯誤時,測試將失敗。
let jsonData = try Data(contentsOf: URL(string: "user.json")!)

/// `XCTAssertNoThrow` 可用于獲取有關拋出的額外上下文
XCTAssertNoThrow(try JSONDecoder().decode(User.self, from: jsonData))
}

當在任何進一步的測試執行中不需要 throwing 方法的結果時,可以使用 XCTAssertNoThrow 方法。您應該使用 XCTAssertThrowsError 方法來匹配預期的錯誤類型。例如,您可以為證書密鑰驗證程序編寫測試:

struct LicenseValidator {
enum Error: Swift.Error {
case emptyLicenseKey
}

func validate(licenseKey: String) throws {
guard !licenseKey.isEmpty else {
throw Error.emptyLicenseKey
}
}
}

class LicenseValidatorTests: XCTestCase {
let validator = LicenseValidator()

func testThrowingEmptyLicenseKeyError() {
XCTAssertThrowsError(try validator.validate(licenseKey: ""), "An empty license key error should be thrown") { error in
/// 我們確保預期的錯誤被拋出。
XCTAssertEqual(error as? LicenseValidator.Error, .emptyLicenseKey)
}
}

func testNotThrowingLicenseErrorForNonEmptyKey() {
XCTAssertNoThrow(try validator.validate(licenseKey: "XXXX-XXXX-XXXX-XXXX"), "Non-empty license key should pass")
}
}

可選值解包

XCTUnwrap 方法最適合用于拋出測試,因為它是一個拋出斷言:

func testFirstNameNotEmpty() throws {
let viewModel = UsersViewModel(users: ["Antoine", "Maaike", "Jaap"])

let firstName = try XCTUnwrap(viewModel.users.first)
XCTAssertFalse(firstName.isEmpty)
}

XCTUnwrap 斷言可選變量的值不為 nil,如果斷言成功則返回它的值。它會阻止您編寫 XCTAssertNotNil 并結合解包或處理其余測試代碼的條件鏈接。

在 Xcode 中運行單元測試

編寫測試后,就該運行它們了。通過以下提示,這將變得更有效率。

使用測試三角形

您可以使用前導三角形運行單個測試或一組測試:

圖片

根據最新的測試運行結果,同一方塊顯示紅色或綠色。

重新運行最新的測試

使用以下命令重新運行上次運行測試:

? Control + ? Option + ? Command + G.

上面的快捷方式可能是我最常用的快捷方式之一,因為它可以幫助我在對失敗測試實施修復后快速重新運行測試。

運行測試組合

使用 CTRL 或 SHIFT 選擇要運行的測試,右鍵單擊并選擇“Run X Test Methods”。

圖片

在測試導航器中應用過濾器

測試導航器底部的過濾欄允許您縮小測試概覽范圍。

圖片

  • 使用搜索字段根據名稱搜索特定測試
  • 僅顯示當前所選方案的測試。如果您有多個測試方案,這將很有用。
  • 只顯示失敗的測試。這將幫助您快速找到失敗的測試。

在側邊欄中啟用覆蓋

圖片

測試迭代計數向您顯示在上次運行測試期間是否命中了特定代碼段。

圖片

它顯示了迭代次數(在上面的示例中為 3),一段代碼在到達時變為綠色。當一段代碼是紅色時,這意味著它在上次運行的測試中沒有被覆蓋。

編寫單元測試時的心態

你的心態是編寫高質量單元測試的一個很好的起點。通過一些基本原則,您可以確保工作效率、保持專注并編寫您的應用程序最需要的測試。

您的測試代碼與您的應用程序代碼一樣重要

在深入探討實用技巧之后,我想介紹一種必要的心態。就像編寫應用程序代碼一樣,您應該盡最大努力編寫高質量的測試代碼。

考慮重用代碼、使用協議、在多個測試中使用時定義屬性,并確保您的測試清理所有創建的數據。這將使您的單元測試更易于維護,并防止不穩定和奇怪的測試失敗。

100% 的代碼覆蓋率不應該是你的目標

盡管它是很多人的目標,但 100% 的覆蓋率不應該是您編寫測試時的主要目標。一個很好的開始是確保至少測試您最關鍵的業務邏輯。覆蓋率達到 100% 可能會很耗時,而收益并不總是那么顯著。并且達到100%,也意味著可能需要付出很大的努力。

最重要的是,100% 的覆蓋率可能會產生誤導。上面的單元測試示例覆蓋了所有方法,覆蓋率為 100%。但是,它并沒有測試所有場景,因為它只測試了一個非空數組。同時,也可能存在空數組的情況,其中 hasUsers 屬性應該返回 false。

圖片

您可以從 Scheme 設置窗口啟用測試覆蓋率。這個窗口可以通過Product ? Scheme ? Edit Scheme打開。

在修復錯誤之前編寫測試

跳到一個錯誤上并盡快修復它是很誘人的。雖然這很好,但如果您可以防止將來再次出現相同的錯誤,那就更好了。通過在修復 bug 之前編寫單元測試,可以確保相同的 bug 不會再次發生。將其視為“測試驅動的錯誤修復”,從現在開始也稱為 TDBF 。

其次,您可以開始編寫修復程序并運行新的單元測試來驗證修復程序是否有效。此技術比運行模擬器來驗證您的修復是否有效要快。

結論

編寫定性的單元測試是開發人員的基本技能。將能夠對您的代碼庫建立信心,確保您在新版本發布之前沒有破壞任何東西。使用正確的斷言,您可以更快地解決失敗的測試。確保至少測試關鍵業務代碼并避免達到 100% 的代碼覆蓋率。

責任編輯:武曉燕 來源: Swift君
相關推薦

2024-10-07 09:12:33

2023-07-26 13:11:21

ChatGPT平臺工具

2023-03-30 08:26:31

DNSTCPUDP

2022-11-02 07:37:07

WebAssembl瀏覽器服務器

2023-03-31 08:16:39

CDN網絡數據

2022-10-24 09:55:32

ESLintJavaScript

2023-01-26 00:28:45

前端測試技術

2023-04-26 00:41:36

A/B測試郵件數量

2024-01-19 08:25:38

死鎖Java通信

2023-01-10 08:43:15

定義DDD架構

2024-02-04 00:00:00

Effect數據組件

2023-03-10 22:08:20

2024-01-02 12:05:26

Java并發編程

2023-08-01 12:51:18

WebGPT機器學習模型

2024-03-01 08:13:45

Shell編程解釋器

2022-09-12 08:01:21

GreatSQLMySQL性能

2023-12-07 07:03:09

2023-07-29 00:10:48

2023-08-01 07:27:42

Mockito測試Callback

2023-01-30 09:01:54

圖表指南圖形化
點贊
收藏

51CTO技術棧公眾號

久久久免费高清电视剧观看| 91精品中文字幕一区二区三区| 久久久com| 亚洲精品成人在线视频| 精品精品久久| 欧美一区二区女人| 欧美日韩亚洲一| 天堂中文а√在线| 成人美女在线观看| 国产精品国产亚洲伊人久久| 99久久99久久精品国产| 牛牛影视久久网| 欧美日韩在线不卡| www插插插无码视频网站| 黄色片在线免费看| 国产高清不卡一区| 日韩美女av在线免费观看| 国产精品白丝喷水在线观看| 秋霞综合在线视频| 91精品久久久久久蜜臀| 国产男女在线观看| 18av在线视频| 国产亚洲婷婷免费| 成人精品一二区| 日本欧美www| 激情欧美日韩一区| 日韩最新免费不卡| 97伦伦午夜电影理伦片| 日韩一区二区三区色| 欧美亚洲图片小说| 欧洲黄色一级视频| 日本一本在线免费福利| 欧美激情在线看| 久久久久久国产精品mv| 国产成人精品毛片| 久久精品免费观看| 欧美在线xxx| 国产一级淫片免费| 亚洲综合色网| 色爱av美腿丝袜综合粉嫩av| 日本黄色网址大全| 久久久久观看| 精品少妇一区二区三区视频免付费| gogogo高清免费观看在线视频| 涩涩视频在线| 亚洲成人av中文| 800av在线免费观看| 久久77777| 国产精品欧美一区喷水| 日韩高清av电影| 能在线看的av| 久久香蕉国产线看观看99| 国产伦精品一区二区三区照片91| 午夜精品在线播放| 国产精品69久久久久水密桃| 成人免费视频在线观看超级碰| 中文天堂在线播放| 奇米精品一区二区三区在线观看一| 欧美亚洲国产另类| 丰满人妻老熟妇伦人精品| 亚洲精品1区| 午夜精品一区二区三区在线 | 久久综合色鬼综合色| 国产免费高清一区| 男人天堂网在线视频| 成人精品国产一区二区4080| 成人一区二区在线| 人妻妺妺窝人体色www聚色窝| 国产成人av电影在线播放| 91久久偷偷做嫩草影院| 午夜精品久久久久久久91蜜桃| 国产精品91一区二区| 91精品国产综合久久久久久丝袜 | 亚洲第一偷拍网| 娇妻高潮浓精白浆xxⅹ| 色婷婷综合久久久久久| 精品视频偷偷看在线观看| 瑟瑟视频在线观看| 奇米影视亚洲| 超碰精品一区二区三区乱码| 免费又黄又爽又色的视频| av成人国产| 国产精品久久久久久久久借妻| 在线免费看毛片| 韩国三级中文字幕hd久久精品| 亚洲自拍偷拍一区| 天天色综合久久| 亚洲国产精品成人综合色在线婷婷| 一区二区不卡在线视频 午夜欧美不卡' | 麻豆视频成人| 欧美成人二区| 亚洲国产精品久久人人爱蜜臀 | 免费污视频在线观看| 岛国av一区二区| 亚洲视频一二三四| 成人搞黄视频| 国产亚洲欧洲在线| 久久久久久久中文字幕| 欧美亚洲视频| 亚洲综合色激情五月| 性xxxx18| 国产精品久久久久天堂| 免费av手机在线观看| 国产精品天堂蜜av在线播放| 日韩欧美国产wwwww| mm131美女视频| 伊人成综合网| 日韩美女免费线视频| 国产成人a人亚洲精品无码| 91美女蜜桃在线| 波多野结衣三级在线| aaa在线播放视频| 欧美人与禽zozo性伦| 亚洲av永久无码精品| 日韩欧美视频| 欧美性受xxxx白人性爽| 99久久久国产精品无码网爆| 久久蜜桃一区二区| 久久av综合网| 91麻豆精品国产综合久久久| 国产视频久久久久久久| 一区二区三区免费高清视频| 蜜臀av亚洲一区中文字幕| 国产综合色一区二区三区| 毛片在线播放a| 色美美综合视频| 日本在线不卡一区二区| 久久久久久免费视频| 国产成人精品网站| 四虎影视在线观看2413| 夜夜嗨av一区二区三区网页| 日本中文字幕观看| 成人毛片免费看| 欧美亚洲在线观看| 少妇高潮一区二区三区69| 亚洲丝袜美腿综合| 不卡的av中文字幕| 精品免费在线| 日韩av大片在线| 亚洲av电影一区| 亚洲一区二区三区自拍| 日韩高清在线一区二区| 久久一区二区中文字幕| 国产精品男女猛烈高潮激情| 国产午夜精品一区理论片| 狠狠躁18三区二区一区| 国产午夜在线一区二区三区| 国产精品jizz在线观看美国| 亚洲a级在线观看| 黄色av电影在线观看| 欧美日韩在线亚洲一区蜜芽| 殴美一级黄色片| 久久国产人妖系列| 亚洲一区综合| 中文字幕日韩亚洲| 欧美剧在线观看| www.中文字幕| 亚洲午夜精品在线| 亚洲天堂美女视频| 国产精品美女| 欧美精品免费观看二区| 人人鲁人人莫人人爱精品| 伊人伊成久久人综合网站| 看黄色一级大片| 国产精品久久久久一区| 亚洲一区二区中文字幕在线观看| 综合久久精品| 国产精品二区三区| 亚洲优女在线| 一本色道久久88综合日韩精品| 夜夜狠狠擅视频| 亚洲欧美偷拍另类a∨色屁股| 黑人性生活视频| 在线看片成人| 日本视频一区二区在线观看| 97久久网站| 久久这里只有精品99| 亚洲精品国产一区二| 午夜精品福利一区二区三区蜜桃| 久久久久久久久免费看无码| 日韩av在线发布| 中文字幕一区二区三区四区五区六区 | 91精品国产高清久久久久久久久| 欧美巨乳在线| 欧美卡1卡2卡| 久久午夜无码鲁丝片午夜精品| 99re8在线精品视频免费播放| 亚洲熟妇av一区二区三区| 色综合五月天| 国产精品免费一区二区三区观看| 成人亚洲欧美| 久久久国产视频91| 少妇荡乳情欲办公室456视频| 在线视频欧美精品| 人妻少妇精品一区二区三区| 91麻豆免费看片| 亚洲免费在线播放视频| 一本色道久久综合一区| 日本免费在线视频观看| 精品国产18久久久久久洗澡| 国产精品男人的天堂| av剧情在线观看| 最新国产成人av网站网址麻豆| 不卡视频免费在线观看| 欧美性猛交一区二区三区精品| 老妇女50岁三级| 久久精品一级爱片| 国产在线a视频| 蜜桃视频一区二区| 国产极品在线视频| 天天射综合网视频| 欧美成人一区二区在线| 精品国产亚洲日本| 国产精品女人久久久久久| 波多野结依一区| 精品国产网站地址| 国产女人在线观看| 日韩av在线看| 国产草草影院ccyycom| 欧美午夜电影网| 日本黄色片视频| 一区二区三区国产精品| 妖精视频在线观看免费| 91在线观看地址| 中国男女全黄大片| 国产一区二区91| 污视频网站观看| 日本欧美一区二区三区乱码| 浮妇高潮喷白浆视频| 国产精品第十页| 欧美日韩在线免费观看视频| 国产欧美一区二区精品久久久| 黑人另类av| 红杏视频成人| 国产精品v欧美精品v日韩| 亚洲高清在线一区| 成人网页在线免费观看| 日韩高清在线| 日本欧美一级片| 成人亚洲欧美| 国产黑人绿帽在线第一区| 国产精品迅雷| 国产91在线播放九色快色| 丝袜诱惑一区二区| 8x拔播拔播x8国产精品| 三妻四妾的电影电视剧在线观看| 久久久人成影片一区二区三区观看| 在线欧美三级| 久久久影视精品| 老牛影视精品| 欧美一级视频免费在线观看| 在线人成日本视频| 日本久久久久久| 四虎4545www精品视频| 国产精品久久999| 国产经典一区| 国产欧美日韩视频| 麻豆国产一区二区三区四区| 亚洲a成v人在线观看| aiss精品大尺度系列| 国产一区二区三区高清视频| 亚洲男人都懂第一日本| 日韩成人av网站| 国产精品成人a在线观看| 黄色a级在线观看| 激情欧美一区| 蜜臀av午夜一区二区三区| 免费一级片91| 午夜视频在线免费看| 91原创在线视频| 欧美激情视频二区| 亚洲毛片av在线| 亚洲精品国产精品乱码| 日本道色综合久久| 91精品中文字幕| 精品欧美黑人一区二区三区| 老司机午夜福利视频| 亚洲风情亚aⅴ在线发布| 久久精品国产亚洲a∨麻豆| 亚洲人a成www在线影院| 国产在线观看91| 欧美精品videos| 日韩欧美精品一区二区三区| 国产精品综合网站| 国产日本亚洲| 国产欧美日韩综合一区在线观看| 综合干狼人综合首页| 午夜精品视频在线观看一区二区| 久久要要av| 欧美日韩一道本| 日韩制服丝袜av| jizzjizz国产精品喷水| 久久精品国产秦先生| 在线视频日韩欧美| 91亚洲精品久久久蜜桃| 我不卡一区二区| 亚洲免费在线观看| 国产免费a视频| 日韩一区二区三区在线| 午夜在线观看视频18| 一本一道久久a久久精品逆3p| 乱人伦中文视频在线| 欧美激情一区二区三级高清视频| 五月激情久久| aa成人免费视频| 青青草久久爱| 国产精品视频网站在线观看| 亚洲影音先锋| 不许穿内裤随时挨c调教h苏绵 | 亚洲免费三区一区二区| 国产精品成人国产乱| 日韩欧美在线第一页| 精品人妻午夜一区二区三区四区 | 国产精品久久久久久久久男 | 超碰91在线播放| 国产亚洲欧美日韩日本| www青青草原| 欧美视频中文在线看| 国产免费视频一区二区三区| 日韩电影第一页| 黄页在线观看免费| 国产精品偷伦视频免费观看国产 | 久久久久久国产精品mv| 91精品高清| 白嫩少妇丰满一区二区| 成人精品电影在线观看| 91大神福利视频| 粉嫩老牛aⅴ一区二区三区| 国产欧美日韩成人| 亚洲色图日韩av| 中文字幕资源网在线观看免费| 99高清视频有精品视频| 欧美肉体xxxx裸体137大胆| 欧美性大战久久久久xxx| 福利一区福利二区| 国产毛片久久久久久久| 黑人巨大精品欧美一区二区| 国产sm主人调教女m视频| 久久久999精品| 成人看片在线观看| 久久婷婷开心| 国产农村妇女精品一区二区| 亚洲欧美日韩综合网| 国产亚洲欧美中文| 午夜精品久久久久久久久久久久久蜜桃| 日韩精品一区二区三区swag| 韩国中文字幕在线| 国产精品揄拍一区二区| 四虎成人av| 美女一区二区三区视频| 9久草视频在线视频精品| 六月丁香在线视频| 亚洲成年人在线| 国产美女高潮在线观看| 99久久伊人精品影院| 中文字幕日韩一区二区不卡| 亚洲精品乱码久久久久久9色| 亚洲欧美在线aaa| 在线观看免费中文字幕| 亚洲最新视频在线| 性感美女一区二区在线观看| 日本一区二区三区四区高清视频| 亚久久调教视频| 大又大又粗又硬又爽少妇毛片 | 久久久久久久性潮| 色一情一乱一伦一区二区三欧美| 日本一不卡视频| 人成免费在线视频| 欧美一区国产二区| 成人免费网址| 51精品国产人成在线观看| 极品少妇一区二区三区| 欧洲熟妇的性久久久久久| 岛国av一区二区三区| 成人资源www网在线最新版| 国产精品久久久久av| 亚洲女同另类| 成年人看片网站| 欧美午夜美女看片| 久久经典视频| 国产精品日韩在线播放| 欧美一区二区三区久久精品茉莉花 | 狠狠躁天天躁日日躁欧美| 精品视频二区| 日本欧美一二三区| 中文字幕乱码亚洲无线精品一区| 国产成人精品一区二区三区在线观看 | 免费电影视频在线看 | 亚洲va久久| 国产视频1区2区3区| 亚洲精选视频在线| 日韩av成人| 国产精品亚洲网站| 亚洲精品一二三区区别| 久久久久无码国产精品一区李宗瑞| 一本大道久久a久久精品综合| yiren22亚洲综合伊人22| 147欧美人体大胆444| 三级一区在线视频先锋| 黑人と日本人の交わりビデオ|