日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

新來(lái)的騰訊后端,直接定義代碼測(cè)試新姿勢(shì)!

來(lái)源: 責(zé)編: 時(shí)間:2024-06-25 17:19:31 259觀看
導(dǎo)讀在日常工作中,看過(guò)很多開(kāi)發(fā)人員不寫(xiě)代碼測(cè)試,大部分理由是“太忙“或者”沒(méi)必要”,更嚴(yán)重的是很多開(kāi)發(fā)人員甚至不知道如何寫(xiě)測(cè)試代碼,本文我們總結(jié)了一位騰訊后端對(duì) Controller層代碼優(yōu)秀的測(cè)試經(jīng)驗(yàn),希望對(duì)你有幫助。在 如

在日常工作中,看過(guò)很多開(kāi)發(fā)人員不寫(xiě)代碼測(cè)試,大部分理由是“太忙“或者”沒(méi)必要”,更嚴(yán)重的是很多開(kāi)發(fā)人員甚至不知道如何寫(xiě)測(cè)試代碼,本文我們總結(jié)了一位騰訊后端對(duì) Controller層代碼優(yōu)秀的測(cè)試經(jīng)驗(yàn),希望對(duì)你有幫助。Ty028資訊網(wǎng)——每日最新資訊28at.com

Ty028資訊網(wǎng)——每日最新資訊28at.com

在 如何編寫(xiě)優(yōu)雅的 Controller代碼? 這篇文章中,我們分析了 Controller層的 6個(gè)主要職責(zé),本文將分析如何對(duì) Controller層進(jìn)行360度無(wú)死角測(cè)試,首先回顧下 Controller層的6個(gè)主要職責(zé):Ty028資訊網(wǎng)——每日最新資訊28at.com

  • 接收 HTTP(s)請(qǐng)求
  • 解析請(qǐng)求參數(shù)
  • 校驗(yàn)請(qǐng)求參數(shù)
  • 調(diào)用業(yè)務(wù)方法
  • 組織返回?cái)?shù)據(jù)
  • 統(tǒng)一異常處理

理解了 Controller的職責(zé),才能更有目的對(duì)它進(jìn)行測(cè)試,如下代碼,包含了 6個(gè)主要職責(zé),我們?cè)撊绾尉帉?xiě)測(cè)試代碼?Ty028資訊網(wǎng)——每日最新資訊28at.com

@RestControllerpublic class UserController {    private final UserService userService;    public UserController(UserService userService) {        this.userService = userService;    }    @PostMapping("/user/register")    public String getGradeById(@Validated @RequestBody User user) {        // 調(diào)用注冊(cè)的業(yè)務(wù)方法        String userId = userService.register(user);        return userId;    }}public class User {    @NotBlank(message = "Nickname is required.")    private String nickname;    private Integer age;    // getters and setters and constructors}

為什么要測(cè)試?

作為一名程序員,代碼質(zhì)量是我們必須守住的底線,對(duì)于自己編寫(xiě)的代碼一定需要經(jīng)過(guò)測(cè)試,而不是把測(cè)試工作不負(fù)責(zé)的全部交給測(cè)試人員。Ty028資訊網(wǎng)——每日最新資訊28at.com

對(duì)于開(kāi)發(fā)人員,保證代碼質(zhì)量最有效的方式是測(cè)試,最常見(jiàn)的測(cè)試方式有 2種:?jiǎn)卧獪y(cè)試(Unit Testing)和 集成測(cè)試(Integration Testing)。Ty028資訊網(wǎng)——每日最新資訊28at.com

單元測(cè)試的目的是驗(yàn)證單個(gè)功能單元的行為是否正確,這里的功能單元通常是一個(gè)類或方法,單元測(cè)試最大的優(yōu)點(diǎn)是可以在不依賴于其他部分的前提下測(cè)試某個(gè)功能單元。Ty028資訊網(wǎng)——每日最新資訊28at.com

集成測(cè)試的目的是驗(yàn)證多個(gè)功能單元之間的交互是否正確,可能涉及數(shù)據(jù)庫(kù)、文件系統(tǒng)、網(wǎng)絡(luò)等外部系統(tǒng),如果需要排除外部系統(tǒng)的干擾,可以對(duì)他們進(jìn)行 mock。Ty028資訊網(wǎng)——每日最新資訊28at.com

如何測(cè)試?

對(duì)于 Controller層的代碼測(cè)試,因?yàn)閱卧獪y(cè)試的局限性,所以我們需要采用集成測(cè)試,本文將使用SpringBootTest 和 Mockito兩個(gè)主流的測(cè)試框架進(jìn)行分析,下面先說(shuō)明幾個(gè)重要的組件:Ty028資訊網(wǎng)——每日最新資訊28at.com

1.@WebMvcTest

@WebMvcTest是 Spring Boot提供的一個(gè)注解,用于測(cè)試 SpringMVC的 Controller,它能夠啟動(dòng)一個(gè)最小化的 Spring應(yīng)用上下文,包含僅與 Web層相關(guān)的 bean,從而快速且高效地測(cè)試 Controller的功能。Ty028資訊網(wǎng)——每日最新資訊28at.com

@WebMvcTest主要功能如下:Ty028資訊網(wǎng)——每日最新資訊28at.com

  • 加載 Web層相關(guān)的 Bean: @WebMvcTest只加載與 Web層相關(guān)的 bean,例如 Controller、過(guò)濾器、攔截器等,這使得測(cè)試環(huán)境更加輕量級(jí)。
  • 自動(dòng)配置 MockMvc: @WebMvcTest 自動(dòng)配置 MockMvc,使得測(cè)試控制器的 HTTP請(qǐng)求處理變得簡(jiǎn)單。
  • 支持 @MockBean注解: 可以使用 @MockBean注解來(lái)模擬服務(wù)層的 bean,以隔離控制器測(cè)試,不依賴實(shí)際的服務(wù)層實(shí)現(xiàn)。

2.MockMvc

MockMvc是 Spring框架中用于測(cè)試 Spring MVC控制器的主要工具,它允許開(kāi)發(fā)者在不啟動(dòng)整個(gè) HTTP服務(wù)器的情況下,測(cè)試控制器的請(qǐng)求處理方法。MockMvc 提供了一種方式來(lái)模擬 HTTP請(qǐng)求并驗(yàn)證響應(yīng),確保控制器行為符合預(yù)期。Ty028資訊網(wǎng)——每日最新資訊28at.com

MockMvc的主要功能如下:Ty028資訊網(wǎng)——每日最新資訊28at.com

  • 模擬 HTTP 請(qǐng)求: MockMvc 可以模擬各種 HTTP 請(qǐng)求,如 GET、POST、PUT、DELETE 等。
  • 驗(yàn)證響應(yīng): MockMvc 提供了一組豐富的斷言來(lái)驗(yàn)證響應(yīng)的狀態(tài)碼、內(nèi)容類型、內(nèi)容、頭信息等。
  • 測(cè)試控制器邏輯: 通過(guò)模擬請(qǐng)求并驗(yàn)證響應(yīng),可以測(cè)試控制器的業(yè)務(wù)邏輯、路徑變量、請(qǐng)求參數(shù)、請(qǐng)求體等。
  • 集成測(cè)試: 可以與 Spring 的其他測(cè)試工具結(jié)合,進(jìn)行更復(fù)雜的集成測(cè)試。

3.Mockito

Mockito 是一個(gè)流行的 Java測(cè)試框架,用于創(chuàng)建和配置 mock 對(duì)象。它主要用于單元測(cè)試中,通過(guò)模擬依賴對(duì)象的行為,使得測(cè)試目標(biāo)對(duì)象能夠獨(dú)立于其依賴項(xiàng)進(jìn)行測(cè)試。Ty028資訊網(wǎng)——每日最新資訊28at.com

Mockito主要功能如下:Ty028資訊網(wǎng)——每日最新資訊28at.com

  • 創(chuàng)建 Mock 對(duì)象: 使用 @Mock注解或 Mockito.mock()方法創(chuàng)建 mock對(duì)象。
  • 定義行為: 使用 when 和 thenReturn 等方法定義 mock 對(duì)象的方法行為。
  • 驗(yàn)證行為: 使用 verify 方法驗(yàn)證 mock 對(duì)象的方法是否被調(diào)用,以及調(diào)用的次數(shù)和參數(shù)。
  • 參數(shù)匹配: 使用 any、eq 等參數(shù)匹配器來(lái)驗(yàn)證方法調(diào)用時(shí)傳入的參數(shù)。
  • 模擬異常: 使用 thenThrow 方法模擬方法拋出異常的行為。

4.ObjectMapper

它是 Jackson庫(kù)中的核心類之一,用于將 Java 對(duì)象轉(zhuǎn)換為 JSON 字符串,或者將 JSON 字符串轉(zhuǎn)換為 Java 對(duì)象。在 Spring 應(yīng)用中,ObjectMapper 被廣泛用于處理 JSON 數(shù)據(jù)。Ty028資訊網(wǎng)——每日最新資訊28at.com

ObjectMapper的主要功能如下:Ty028資訊網(wǎng)——每日最新資訊28at.com

  • 序列化(Serialization): 將 Java 對(duì)象轉(zhuǎn)換為 JSON 字符串。
  • 反序列化(Deserialization): 將 JSON 字符串轉(zhuǎn)換為 Java 對(duì)象。
  • 讀取和寫(xiě)入 JSON 文件或流: 直接從文件、輸入流讀取 JSON 數(shù)據(jù),或?qū)?JSON 數(shù)據(jù)寫(xiě)入文件、輸出流。

所以,一個(gè)包含上述所有組件的完整代碼示例如下:Ty028資訊網(wǎng)——每日最新資訊28at.com

@WebMvcTest(controllers = RegisterRestController.class)class RegisterRestControllerTest {  @Autowired  private MockMvc mockMvc;  @Autowired  private ObjectMapper objectMapper;  @MockBean  private XXX xxx; // 用戶業(yè)務(wù)的bean  @Test  void test() throws Exception {    mockMvc.perform(...);  }}

介紹了上面幾個(gè)集成測(cè)試的組件之后,接下來(lái)我們就可以詳解的分析他們是如何應(yīng)用到 Controller的集成測(cè)試中。Ty028資訊網(wǎng)——每日最新資訊28at.com

測(cè)試詳解

我們按照 Controller的 6個(gè)主要職責(zé)來(lái)分別講解他們是如何進(jìn)行測(cè)試的。Ty028資訊網(wǎng)——每日最新資訊28at.com

1.測(cè)試接收 HTTP(s)請(qǐng)求

Controller是接收請(qǐng)求的入口,因此對(duì)于 Controller接收 HTTP(s)請(qǐng)求驗(yàn)證 Controller是否偵聽(tīng)某個(gè) HTTP 請(qǐng)求非常簡(jiǎn)單,我們只需調(diào)用 MockMvc.perform() 方法,返回 200代表成功,返回非200就代表異常,示例代碼如下:Ty028資訊網(wǎng)——每日最新資訊28at.com

@Testvoid whenReceiveHttpRqe_thenReturns200() throws Exception {    mockMvc.perform(post("/user/register")        .contentType("application/json"))        .andExpect(status().isOk()); }

2.測(cè)試解析請(qǐng)求參數(shù)

Controller是通過(guò)@PathVariable、@RequestBody、@RequestParam 3種方式來(lái)接收參數(shù)的,因此,下面的示例代碼分別模擬這 3種方式是如何進(jìn)行參數(shù)傳遞的。Ty028資訊網(wǎng)——每日最新資訊28at.com

@Autowiredprivate ObjectMapper objectMapper;@Testvoid whenValidInput_thenReturns200() throws Exception {  User user = new User("zhangsan", 21);     mockMvc.perform(post("/user/register/{id}", 1111) // 模擬通過(guò) @PathVariable傳遞參數(shù)        .contentType("application/json")        .param("name", "張三") // 模擬通過(guò) @RequestParam傳遞參數(shù)        .content(objectMapper.writeValueAsString(user))) // 模擬通過(guò) @RequestBody傳遞參數(shù)        .andExpect(status().isOk());}

通過(guò)上面的方式,我們模擬了一個(gè)正常的 HTTP請(qǐng)求,并且使用 3種方式進(jìn)行參數(shù)傳遞。Ty028資訊網(wǎng)——每日最新資訊28at.com

3.測(cè)試校驗(yàn)請(qǐng)求參數(shù)

測(cè)試參數(shù)的校驗(yàn),主要是為了檢查代碼邏輯有沒(méi)有對(duì)參數(shù)進(jìn)行有效的驗(yàn)證,比如,必填字段判空,字符串最大長(zhǎng)度限制,數(shù)字最大值和最小值校驗(yàn),手機(jī)號(hào)或郵箱格式校驗(yàn)等。Ty028資訊網(wǎng)——每日最新資訊28at.com

參數(shù)校驗(yàn)測(cè)試一般分正常測(cè)試和按預(yù)期失敗的異常測(cè)試,特別需要進(jìn)行邊界的測(cè)試。如下示例,給出了測(cè)試通過(guò)和符合預(yù)期并返回 400的 BadRequest:Ty028資訊網(wǎng)——每日最新資訊28at.com

public class User {    @NotBlank(message = "Nickname is required.")    private String nickname;    private Integer age;    // getters and setters and constructors}@Testvoid whenNicknameNull_thenReturns400() throws Exception {  User user = new User(null, 21); // 當(dāng) nickname為空時(shí),會(huì)拋出 400的 BadRequest異常  mockMvc.perform(post("/user/register")      .content(objectMapper.writeValueAsString(user)))      .andExpect(status().isOk());}@Testvoid testReturns200() throws Exception {    User user = new User("zhangsan", 21);    mockMvc.perform(post("/user/register")        .content(objectMapper.writeValueAsString(user)))        .andExpect(status().isBadRequest());}

4.測(cè)試調(diào)用業(yè)務(wù)方法

對(duì)于業(yè)務(wù)方法調(diào)用的測(cè)試,通常我們會(huì)使用Mockito.mock來(lái)模擬業(yè)務(wù)方法的返回值,而業(yè)務(wù)方式的真實(shí)運(yùn)行邏輯會(huì)在 Server的單元測(cè)試中完成,如下示例代碼:Ty028資訊網(wǎng)——每日最新資訊28at.com

// 調(diào)用注冊(cè)的業(yè)務(wù)方法String userId = userService.register(user);@Testvoid whenLogic_thenReturnsExceptData() throws Exception {    User user = new User(null, 21);    // mock userService.register(user)返回值為 userId    Mockito.when(userService.register(user)).thenReturn("userId");    mockMvc.perform(post("/user/register")                    .content(objectMapper.writeValueAsString(user)))            .andExpect(status().isOk())            .andExpect(jsonPath("$.data", is("userId")));}

5.測(cè)試組織返回?cái)?shù)據(jù)

在業(yè)務(wù)代碼執(zhí)行完之后,我們需要對(duì) HTTP對(duì)應(yīng)響應(yīng),因此可以使用 andReturn()方法將 HTTP交互的結(jié)果存儲(chǔ)在 MvcResult類型的變量中,然后從響應(yīng)正文中讀取 JSON字符串,并使用 isEqualToIgnoringWhitespace()將其與預(yù)期字符串進(jìn)行比較,如下示例:Ty028資訊網(wǎng)——每日最新資訊28at.com

// 調(diào)用注冊(cè)的業(yè)務(wù)方法String userId = userService.register(user);@Testvoid whenLogic_thenReturnsExceptData() throws Exception {    User user = new User("zhangsan", 21);    // mock userService.register(user)返回值為 userId    Mockito.when(userService.register(user)).thenReturn("userId");    MvcResult mvcResult = mockMvc.perform(post("/user/register")        .content(objectMapper.writeValueAsString(user)))        .andReturn(); //將結(jié)果返回    String expectedResponse = "userId";    String actualResponseBody = mvcResult.getResponse().getContentAsString();    assertThat(actualResponseBody).isEqualToIgnoringWhitespace(            objectMapper.writeValueAsString(expectedResponse));}

6.測(cè)試統(tǒng)一異常處理

測(cè)試異是指如果發(fā)生異常,Controller應(yīng)返回特定的 HTTP狀態(tài),比如 200,400,500等等, 默認(rèn)情況下,Spring 會(huì)處理其中的大多數(shù)情況。但是,如果我們有一個(gè)自定義異常處理,我們想要測(cè)試它。假設(shè)我們要返回一個(gè)結(jié)構(gòu)化的 JSON 錯(cuò)誤響應(yīng),其中包含請(qǐng)求中每個(gè)無(wú)效字段的字段名稱和錯(cuò)誤消息。我們會(huì)創(chuàng)建一個(gè)這樣的@ControllerAdvice:Ty028資訊網(wǎng)——每日最新資訊28at.com

@Testvoid whenNullValue_thenReturns400AndErrorResult() throws Exception {  User user = new User("zhangsan", 21);  MvcResult mvcResult = mockMvc.perform(post("/user/register")          .contentType("application/json")          .content(objectMapper.writeValueAsString(user)))          .andExpect(status().isBadRequest())          .andReturn();  ErrorResult expectedErrorResponse = new ErrorResult("Nickname", "Nickname is required.");  String actualResponse = mvcResult.getResponse().getContentAsString();  String expectedResponseBody = objectMapper.writeValueAsString(expectedErrorResponse);  assertThat(actualResponse).isEqualToIgnoringWhitespace(expectedErrorResponse);}

總結(jié)

本文結(jié)合 SpringBootTest 和 Mockito兩個(gè)主流的測(cè)試框架,對(duì) Controller各個(gè)職責(zé)進(jìn)行全面的測(cè)試,并且給出了比較詳細(xì)的示例代碼,通過(guò)本文的分析,我們不僅可以學(xué)會(huì)對(duì) Controller的測(cè)試,同時(shí)還應(yīng)該觸類旁通,將里面優(yōu)秀的思維應(yīng)用到其他層級(jí)代碼的測(cè)試。Ty028資訊網(wǎng)——每日最新資訊28at.com

代碼質(zhì)量是開(kāi)發(fā)人員必須守住的底線,所以在日常的開(kāi)發(fā)中一定要秉著對(duì)自己負(fù)責(zé)的態(tài)度,采用單元測(cè)試和集成測(cè)試對(duì)自己的代碼進(jìn)行測(cè)試。Ty028資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-96427-0.html新來(lái)的騰訊后端,直接定義代碼測(cè)試新姿勢(shì)!

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 2024 Vue 最全的生態(tài)工具組合推薦指南

下一篇: CVPR 2024 | PICO 交互感知團(tuán)隊(duì) - 從圖像到可驅(qū)動(dòng)形象:OHTA 實(shí)現(xiàn)單圖創(chuàng)建手部化身

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美亚洲一区二区在线| 亚洲国产精品美女| 欧美精选在线| 欧美日韩国产bt| 国产精品sss| 国产美女精品视频| 国产一区在线免费观看| 亚洲国产乱码最新视频| 宅男精品导航| 性欧美大战久久久久久久久| 久久久久久夜精品精品免费| 欧美freesex交免费视频| 欧美日韩你懂的| 国产日韩亚洲欧美| 亚洲国产日韩精品| 亚洲一区二区免费视频| 久久精品国产久精国产一老狼| 欧美a级一区| 国产精品麻豆欧美日韩ww| 狠狠色综合色区| aa成人免费视频| 久久国产精品毛片| 欧美日本精品一区二区三区| 国产日韩欧美在线视频观看| 亚洲三级电影全部在线观看高清| 亚洲一区二区视频在线观看| 久久免费视频一区| 国产精品国产精品国产专区不蜜| 在线观看欧美日韩国产| 一区二区三区四区在线| 久久久久一区二区三区| 欧美午夜精品| 亚洲国产精品精华液网站| 亚洲午夜精品久久| 欧美成年人视频| 国产欧美一区二区三区在线看蜜臀| 亚洲国产裸拍裸体视频在线观看乱了中文 | 黄色小说综合网站| 9l国产精品久久久久麻豆| 久久精品国产免费| 欧美视频精品一区| 亚洲国产精品成人| 欧美在线一区二区三区| 欧美日韩视频一区二区三区| 伊人婷婷欧美激情| 欧美一级视频免费在线观看| 欧美日韩亚洲一区二区三区在线观看 | 欧美与欧洲交xxxx免费观看 | 国产精品亚洲第一区在线暖暖韩国| 亚洲黄色成人久久久| 久久国产色av| 国产精品亚洲不卡a| 99国产精品久久久| 欧美成人亚洲成人日韩成人| 国内精品99| 翔田千里一区二区| 国产精品观看| 亚洲最新色图| 欧美极品在线观看| 亚洲国产导航| 久久亚洲一区二区| 国内精品伊人久久久久av一坑| 亚洲小说春色综合另类电影| 欧美日韩国产在线看| 亚洲精品国产精品国产自| 久热综合在线亚洲精品| 怡红院精品视频| 久久久久成人精品免费播放动漫| 国产欧美日韩综合| 午夜精品影院| 国产精品一区二区在线观看不卡 | 亚洲国产精品一区二区www| 久久婷婷一区| 影音先锋久久资源网| 久久久久久综合网天天| 国产一区二区久久久| 欧美一区二区三区在线| 国产精品综合网站| 欧美亚洲网站| 国产午夜精品一区二区三区视频| 午夜精品视频网站| 国产欧美日本| 久久不射中文字幕| 国产一区二区三区四区hd| 久久国产加勒比精品无码| 国产午夜精品全部视频在线播放| 久久成人av少妇免费| 韩国三级在线一区| 久久香蕉国产线看观看网| 尤物九九久久国产精品的特点| 久久在线91| 亚洲激情影视| 欧美日韩国产区| 一区二区三区www| 国产精品久久久久久久久久免费看| 亚洲一区视频| 国产三级欧美三级| 久久久久www| 亚洲电影天堂av| 欧美二区在线看| 一本不卡影院| 国产精品爽爽爽| 久久精品国产69国产精品亚洲| 一区免费观看| 欧美精品www| 亚洲一区二区三区四区在线观看| 国产伦精品一区二区三区照片91 | av不卡免费看| 国产精品视频免费在线观看| 久久成人羞羞网站| 亚洲高清在线精品| 欧美日韩午夜精品| 午夜视频在线观看一区二区| 国产一区二区三区四区| 美女尤物久久精品| 一区二区三区国产| 国产日韩亚洲欧美| 免费永久网站黄欧美| 一区二区三区欧美| 国产一区二区三区高清| 欧美高清在线观看| 亚洲主播在线播放| 一区二区三区在线免费播放| 欧美精品偷拍| 欧美一区二区三区在线看| 亚洲国产精品久久久久久女王| 欧美色欧美亚洲另类七区| 性欧美18~19sex高清播放| 亚洲第一毛片| 国产精品成人aaaaa网站| 久久精品国产免费| 99热在这里有精品免费| 国产日韩欧美三区| 欧美大秀在线观看| 亚洲男人第一av网站| 在线免费观看成人网| 国产精品二区二区三区| 久久久久久网| 一本久道综合久久精品| 国产一区日韩一区| 欧美日韩一区二区三区在线视频| 久久国产乱子精品免费女 | 亚洲美女中文字幕| 国产欧美亚洲一区| 欧美精品1区| 久久国内精品视频| 一区二区三区欧美成人| 伊人久久综合97精品| 欧美视频成人| 免费看黄裸体一级大秀欧美| 午夜精品免费| 99热在这里有精品免费| 在线看日韩av| 国产欧美日韩精品丝袜高跟鞋| 欧美激情在线观看| 久久久欧美精品| 亚洲欧美国产高清va在线播| 91久久久精品| 国产真实精品久久二三区| 欧美视频观看一区| 你懂的网址国产 欧美| 欧美在线免费播放| 亚洲午夜91| 亚洲九九精品| 在线观看一区欧美| 国产精品一区二区三区四区 | 亚洲大片av| 国产日韩欧美视频| 国产精品久久久久久久久免费樱桃| 免费成人av| 久久精品网址| 香蕉久久一区二区不卡无毒影院| 99精品欧美一区二区三区| 在线免费高清一区二区三区| 国产免费一区二区三区香蕉精| 欧美日韩mv| 欧美国产日韩亚洲一区| 久久欧美肥婆一二区| 欧美与欧洲交xxxx免费观看| 亚洲一级免费视频| 正在播放欧美视频| 日韩视频免费在线| 亚洲经典在线看| 亚洲第一页在线| 一区二区三区在线观看视频| 国产婷婷色一区二区三区| 国产精品区一区二区三| 国产精品国产自产拍高清av| 欧美三级视频| 欧美日韩一区综合| 欧美日韩精品一区二区三区四区| 欧美国产视频在线| 欧美国产精品一区| 欧美成人一二三| 免费日韩av| 麻豆精品网站| 蜜臀av在线播放一区二区三区| 久久久久久久久综合| 久久黄色小说| 久久久久久一区| 久久人体大胆视频| 久久先锋资源| 久久综合国产精品| 久久综合色播五月|