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

TestNG + PowerMock 單元測試

開發 測試
單元測試(Unit Testing),是指對軟件或項目中最小可測試單元進行正確性檢驗的測試工作。單元是人為規定最小可測試的功能模塊,可以是一個模塊,一個函數或者一個類。單元測試需要與模塊開發進行隔離情況下進行測試。

[[397322]]

單元測試(Unit Testing),是指對軟件或項目中最小可測試單元進行正確性檢驗的測試工作。單元是人為規定最小可測試的功能模塊,可以是一個模塊,一個函數或者一個類。單元測試需要與模塊開發進行隔離情況下進行測試。

在程序開發完成后,我們往往不能保證程序 100% 的正確,通過單元測試的編寫,我們可以通過自動化的測試程序將我們的輸入輸出程序進行定義,通過斷言來 Check 各個 Case 的結果,檢測我們的程序。以提高程序的正確性,穩定性,可靠性,節省程序開發時間。我們在項目中主要用到的單元測試框架有 Spring-Boot-Test TestNG、PowerMock 等。

TestNG,即 Testing, Next Generation,下一代測試技術,是一套根據 JUnit 和 NUnit 思想而構建的利用注釋來強化測試功能的一個測試框架,即可以用來做單元測試,也可以用來做集成測試。

PowerMock 也是一個單元測試模擬框架,它是在其它單元測試模擬框架的基礎上做出的擴展。通過提供定制的類加載器以及一些字節碼篡改技巧的應用,PowerMock 現了對靜態方法、構造方法、私有方法以及 Final 方法的模擬支持,對靜態初始化過程的移除等強大的功能。

常用注解

1. TestNG 注解

  • @BeforeSuite 在該套件的所有測試都運行在注釋的方法之前,僅運行一次
  • @AftereSuite 在該套件的所有測試都運行在注釋方法之后,僅運行一次
  • @BeforeClass 在調用當前類的第一個測試方法之前運行,注釋方法僅運行一次
  • @AftereClass 在調用當前類的第一個測試方法之后運行,注釋方法僅運行一次
  • @BeforeMethod 注釋方法將在每個測試方法之前運行
  • @AfterMethod 注釋方法將在每個測試方法之后運行
  • @BeforeTest 注釋的方法將在屬于test標簽內的類的所有測試方法運行之前運行
  • @AfterTest 注釋的方法將在屬于test標簽內的類的所有測試方法運行之后運行
  • @DataProvider 標記一種方法來提供測試方法的數據。注釋方法必須返回一個Object [] [],其中每個Object []可以被分配給測試方法的參數列表。要從該DataProvider接收數據的@Test方法需要使用與此注釋名稱相等的dataProvider名稱
  • @Parameters 描述如何將參數傳遞給@Test方法 ;適用于 xml 方式的參數化方式傳值
  • @Test 將類或方法標記為測試的一部分,此標記若放在類上,則該類所有公共方法都將被作為測試方法

2. PowerMock 注解

  • @Mock 注解實際上是 Mockito.mock() 方法的縮寫,我們只在測試類中使用它;
  • @InjectMocks 主動將已存在的 mock 對象注入到 bean 中, 按名稱注入, 但注入失敗不會拋出異常;
  • @Spy 封裝一個真實的對象,以便可以像其他 mock 的對象一樣追蹤、設置對象的行為;

示例代碼

1. 添加 pom.xml 依賴

以 Spring-Boot 項目為例,首先我們需要添加 TestNG + ProwerMock 依賴依賴如下:

  1. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter-test</artifactId> 
  4.     <scope>test</scope> 
  5. </dependency> 
  6. <dependency> 
  7.     <groupId>org.testng</groupId> 
  8.     <artifactId>testng</artifactId> 
  9.     <version>${testng.version}</version> 
  10.     <scope>test</scope> 
  11. </dependency> 
  12. <dependency> 
  13.     <groupId>org.powermock</groupId> 
  14.     <artifactId>powermock-api-mockito2</artifactId> 
  15.     <version>${powermock.version}</version> 
  16.     <scope>test</scope> 
  17. </dependency> 
  18. <dependency> 
  19.     <groupId>org.powermock</groupId> 
  20.     <artifactId>powermock-module-junit4</artifactId> 
  21.     <version>${powermock.version}</version> 
  22.     <scope>test</scope> 
  23. </dependency> 
  24. <dependency> 
  25.     <groupId>org.powermock</groupId> 
  26.     <artifactId>powermock-module-testng</artifactId> 
  27.     <version>${powermock.version}</version> 
  28.     <scope>test</scope> 
  29. </dependency> 

2. 增加單元測試

增加測試代碼

  1. import com.test.testng.dto.OrderDto; 
  2. import com.test.testng.dto.UserDto; 
  3. import org.mockito.*; 
  4. import org.powermock.modules.testng.PowerMockTestCase; 
  5. import org.testng.annotations.BeforeMethod; 
  6. import org.testng.annotations.Test; 
  7. import static org.junit.jupiter.api.Assertions.*; 
  8. import static org.mockito.Mockito.when
  9. public class OrderServiceTest extends PowerMockTestCase { 
  10.     @BeforeMethod 
  11.     public void before() { 
  12.         MockitoAnnotations.openMocks(this); 
  13.     } 
  14.     @InjectMocks 
  15.     private OrderService orderService; 
  16.     @Mock 
  17.     private UserService userService; 
  18.     // 正常測試 
  19.     @Test 
  20.     public void testCreateOrder() { 
  21.         //1. mock method start 
  22.         UserDto userDto = new UserDto(); 
  23.         userDto.setId(100); 
  24.         when(userService.get()).thenReturn(userDto); 
  25.         //2. call business method 
  26.         OrderDto order = orderService.createOrder(new OrderDto()); 
  27.         //3. assert 
  28.         assertEquals(order.getId(), 100); 
  29.     } 
  30.     // 異常測試 
  31.     @Test 
  32.     public void testCreateOrderEx() { 
  33.         //1. mock method start 
  34.         when(userService.get()).thenThrow(new RuntimeException()); 
  35.         Exception exception = null
  36.         try { 
  37.             //2. call business method 
  38.             orderService.createOrder(new OrderDto()); 
  39.         } catch (RuntimeException e) { 
  40.             exception = e; 
  41.         } 
  42.         //3. assert 
  43.         assertNotNull(exception); 
  44.     } 

常用 Mock 方式

1. Mock 靜態方法

  1. //靜態方法 
  2. UserDto dto = new UserDto(); 
  3. dto.setId(100000); 
  4. PowerMockito.mockStatic(UserService.class); 
  5. PowerMockito.when(UserService.loginStatic()).thenReturn(dto); 
  6. UserDto userDto = UserService.loginStatic(); 
  7. assertEquals(100000, userDto.getId().intValue()); 

2. Mock 私有屬性

  1. //字段賦值 
  2. ReflectionTestUtils.setField(orderService, "rateLimit", 99); 

3. Mock 私有方法

  1. // 模擬私有方法 
  2. MemberModifier.stub(MemberMatcher.method(UserService.class, "get1")).toReturn(new UserDto()); 
  3. // 測試私有方法 
  4. Method method = PowerMockito.method(UserService.class, "get1"Integer.class); 
  5. Object userDto = method.invoke(userService, 1); 
  6. assertTrue(userDto instanceof UserDto); 

進階使用

1. 參數化批量測試

在測試數據比較多的時候,我們可以通過 @DataProvider 生成數據源,通過 @Test(dataProvider = "xxx") 使用數據, 如下所示:

  1. import com.test.testng.BaseTest; 
  2. import com.test.testng.dto.UserDto; 
  3. import org.mockito.InjectMocks; 
  4. import org.testng.annotations.DataProvider; 
  5. import org.testng.annotations.Test; 
  6. import static org.testng.Assert.assertFalse; 
  7. import static org.testng.AssertJUnit.assertTrue; 
  8. public class UserServiceTest2 extends BaseTest { 
  9.     @InjectMocks 
  10.     private UserService userService; 
  11.     // 定義數據源 
  12.     @DataProvider(name = "test"
  13.     public static Object[][] userList() { 
  14.         UserDto dto1 = new UserDto(); 
  15.         UserDto dto2 = new UserDto(); 
  16.         dto2.setSex(1); 
  17.         UserDto dto3 = new UserDto(); 
  18.         dto3.setSex(1); 
  19.         dto3.setFlag(1); 
  20.         UserDto dto4 = new UserDto(); 
  21.         dto4.setSex(1); 
  22.         dto4.setFlag(1); 
  23.         dto4.setAge(1); 
  24.         return new Object[][] {{dto1, null}, {dto2, null}, {dto3, null}, {dto4, null}}; 
  25.     } 
  26.     // 正確場景 
  27.     @Test 
  28.     public void testCheckEffectiveUser() { 
  29.         UserDto dto = new UserDto(); 
  30.         dto.setSex(1); 
  31.         dto.setFlag(1); 
  32.         dto.setAge(18); 
  33.         boolean result = userService.checkEffectiveUser(dto); 
  34.         assertTrue(result); 
  35.     } 
  36.  
  37.     // 錯誤場景 
  38.     @Test(dataProvider = "test"
  39.     public void testCheckEffectiveUser(UserDto dto, Object object) { 
  40.         boolean result = userService.checkEffectiveUser(dto); 
  41.         assertFalse(result); 
  42.     } 
  43.  

2. 復雜判斷保證測試覆蓋率

案例:

1.判斷有效用戶: 年齡大于 18 并且 sex = 1 并且 flag = 1

  1. public boolean checkEffectiveUser(UserDto dto) { 
  2.     // 判斷有效用戶: 年齡大于 18 并且 sex = 1 并且 flag = 1 
  3.     return Objects.equals(dto.getSex(), 1) && 
  4.         Objects.equals(dto.getFlag(), 1) && 
  5.         dto.getAge() != null && dto.getAge() >= 18; 

2.拆分邏輯。將其轉換為最簡單的 if ... else 語句。然后增加的單元測試,如下所示:

  1. public boolean checkEffectiveUser(UserDto dto) { 
  2.     if (!Objects.equals(dto.getSex(), 1)) { 
  3.         return false
  4.     } 
  5.     if (!Objects.equals(dto.getFlag(), 1)) { 
  6.         return false
  7.     } 
  8.     if (dto.getAge() == null) { 
  9.         return false
  10.     } 
  11.     if (dto.getAge() < 18) { 
  12.         return false
  13.     } 
  14.     return true

3.拆分后我們可以看到,咱們只需要 5 條單元測試就能做到全覆蓋。

  1. public class UserServiceTest extends BaseTest { 
  2.     @InjectMocks 
  3.     private UserService userService; 
  4.     // 覆蓋第一個 return  
  5.     @Test 
  6.     public void testCheckEffectiveUser_0() { 
  7.         UserDto dto =new UserDto(); 
  8.         boolean result = userService.checkEffectiveUser(dto); 
  9.         assertFalse(result); 
  10.     } 
  11.     // 覆蓋第二個 return  
  12.     @Test 
  13.     public void testCheckEffectiveUser_1() { 
  14.         UserDto dto =new UserDto(); 
  15.         dto.setSex(1); 
  16.         boolean result = userService.checkEffectiveUser(dto); 
  17.         assertFalse(result); 
  18.     } 
  19.     // 覆蓋第三個 return  
  20.     @Test 
  21.     public void testCheckEffectiveUser_2() { 
  22.         UserDto dto =new UserDto(); 
  23.         dto.setSex(1); 
  24.         dto.setFlag(1); 
  25.         boolean result = userService.checkEffectiveUser(dto); 
  26.         assertFalse(result); 
  27.     } 
  28.     // 覆蓋第四個 return 
  29.     @Test 
  30.     public void testCheckEffectiveUser_3() { 
  31.         UserDto dto =new UserDto(); 
  32.         dto.setSex(1); 
  33.         dto.setFlag(1); 
  34.         dto.setAge(1); 
  35.         boolean result = userService.checkEffectiveUser(dto); 
  36.         assertFalse(result); 
  37.     } 
  38.     // 覆蓋第五個 return 
  39.     @Test 
  40.     public void testCheckEffectiveUser_4() { 
  41.         UserDto dto =new UserDto(); 
  42.         dto.setSex(1); 
  43.         dto.setFlag(1); 
  44.         dto.setAge(18); 
  45.         boolean result = userService.checkEffectiveUser(dto); 
  46.         assertTrue(result); 
  47.     } 

4.單測覆蓋率檢測檢測

3. 通過斷言校驗方法參數

1.assert:斷言是 java 的一個保留字,用來對程序進行調試,后接邏輯運算表達式,如下:

  1. int a = 0, b = 1; 
  2. assert a == 0 && b == 0; 
  3. // 使用方法:javac編譯源文件,再 java -ea class文件名即可。 

2.在 Spring-Boot 中可以使用 Spring 提供的 Assert 類的方法對前端來的參數進行校驗,如:

  1. // 檢查年齡 >= 18 歲 
  2. public boolean checkUserAge(UserDto dto){ 
  3.     Assert.notNull(dto.getAge(), "用戶年齡不能為空"); 
  4.     Assert.isTrue(dto.getAge() >= 18, "用戶年齡不能小于 18 歲"); 
  5.     return Boolean.TRUE

3.如果是需要轉換為,rest api 返回的統一相應消息,我們可以通過:

  1. @ControllerAdvice 
  2. public class GlobalExceptionHandler { 
  3.     @ResponseBody 
  4.     @ExceptionHandler(value = IllegalArgumentException.class) 
  5.     public Response<String> handleArgError(IllegalArgumentException e){ 
  6.         return new Response().failure().message(e.getMessage()); 
  7.     } 

總結

原則上來講,在功能模塊的設計過程中我們應該遵循一下原則(參考 《軟件工程-結構化設計準則》):

  1. 模塊大小適中
  2. 合適的系統調用深度
  3. 多扇入、少扇出(增加復用度, 減少依賴程度)
  4. 單入口,單出口
  5. 模塊的作用域,應該在模塊內
  6. 功能應該可以預測的
  7. 高內聚,低耦合
  8. 系統分解有層次
  9. 較少的數據冗余

參考文檔

https://testng.org/doc/

https://github.com/powermock/powermock

https://www.netconcepts.cn/detail-41004.html

 

責任編輯:姜華 來源: 運維開發故事
相關推薦

2021-03-11 12:33:50

JavaPowerMock技巧

2024-08-21 08:22:33

2017-01-14 23:42:49

單元測試框架軟件測試

2017-01-16 12:12:29

單元測試JUnit

2017-01-14 23:26:17

單元測試JUnit測試

2020-08-18 08:10:02

單元測試Java

2017-03-23 16:02:10

Mock技術單元測試

2023-07-26 08:58:45

Golang單元測試

2020-05-07 17:30:49

開發iOS技術

2011-07-04 18:16:42

單元測試

2011-05-16 16:52:09

單元測試徹底測試

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單元測試

2011-04-18 13:20:40

單元測試軟件測試

2024-07-29 12:12:59

2017-02-23 15:59:53

測試MockSetup
點贊
收藏

51CTO技術棧公眾號

亚洲激情黄色| 99久热在线精品视频观看| 91污片在线观看| 国产成人一区二| www欧美com| 噜噜噜天天躁狠狠躁夜夜精品| 色综合久久六月婷婷中文字幕| 日韩欧美在线一区二区| av一区二区三| 久久久久国内| 欧美巨乳在线观看| 亚洲性猛交xxxx乱大交| 欧美欧美在线| 91成人免费网站| 黄色特一级视频| 国产免费a∨片在线观看不卡| 久久99热这里只有精品| 91干在线观看| 欧美丰满艳妇bbwbbw| 九色精品国产蝌蚪| 日韩视频在线你懂得| 国产超级av在线| 午夜av在线免费观看| 久久久高清一区二区三区| 高清不卡一区二区三区| 一道本无吗一区| 亚洲欧美bt| 欧美黄色小视频| 国产农村妇女精品一区| 日本妇女一区| 亚洲精品在线网站| 在线观看av免费观看| 午夜精品成人av| 天天操天天干天天综合网| 一级一片免费播放| av每日在线更新| 久久先锋影音av| 国产91免费视频| 国产精品一区二区av白丝下载| 亚洲欧美高清| 国内精品伊人久久| 久久久一二三区| 一二三区不卡| 久久久精品2019中文字幕神马| 久久精品无码一区| 亚洲免费毛片| 日韩精品在线私人| 欧美深性狂猛ⅹxxx深喉| 日韩视频在线直播| 51精品久久久久久久蜜臀| 亚洲老女人av| 成人免费视频观看| 欧美色成人综合| 日本新janpanese乱熟| 91精品产国品一二三产区| 天天综合网 天天综合色| 日韩精品在线中文字幕| 日本资源在线| 亚洲一区二三区| 成人免费在线网| 黄色在线观看www| 欧美日韩亚洲高清| 国产无套内射久久久国产| 都市激情亚洲一区| 色狠狠一区二区| 激情六月丁香婷婷| julia一区二区三区中文字幕| 欧洲一区二区三区在线| 成人日韩在线视频| 日本伊人久久| 亚洲成在人线av| 亚洲精品在线视频免费观看| 亚洲另类春色校园小说| 一区二区在线视频| 免费在线观看a级片| 一本一道久久a久久精品蜜桃| 欧美黑人xxxx| 四虎成人永久免费视频| 日韩精品免费专区| 成人h视频在线| 性色av蜜臀av| 91蝌蚪porny九色| 一区二区三区四区不卡| av免费网站在线| 午夜av电影一区| www.99av.com| 91综合精品国产丝袜长腿久久| 亚洲国产精品99| 精品成人无码一区二区三区| 亚洲欧美综合久久久| 久久久久久中文字幕| 色老头在线视频| 韩国v欧美v亚洲v日本v| 国产亚洲精品美女久久久m| 国产香蕉视频在线看| 亚洲男人的天堂在线观看| 亚洲不卡中文字幕无码| 久久久加勒比| 精品久久久网站| www亚洲色图| 韩国av一区| 国产精品免费电影| 欧美一级视频免费| 中文字幕一区二区三区不卡在线| 777av视频| 国产一区二区三区四区五区3d| 欧美videossexotv100| 白白色免费视频| 亚洲网址在线| 成人免费高清完整版在线观看| 色wwwwww| 亚洲欧美成aⅴ人在线观看| www黄色av| 51社区在线成人免费视频| 在线看欧美日韩| 日韩在线视频免费播放| 国产福利91精品一区二区三区| 日韩福利在线| 色是在线视频| 精品裸体舞一区二区三区| 亚洲天堂最新地址| 久久激情婷婷| 精品国产一区二区三区久久久久久| 日本中文在线观看| 在线视频你懂得一区| 99re这里只有| 狠狠88综合久久久久综合网| 成人国产精品日本在线| yourporn在线观看中文站| 精品免费在线视频| jjzzjjzz欧美69巨大| **女人18毛片一区二区| 国产精品一香蕉国产线看观看| 同心难改在线观看| 一区二区三区四区av| 日韩成人精品视频在线观看| 欧洲美女日日| 国产精品都在这里| 九色在线观看视频| 欧美性少妇18aaaa视频| 艳妇乳肉亭妇荡乳av| 韩日成人av| 91久久国产自产拍夜夜嗨| 黄色网页在线免费看| 欧美久久一二区| 二区三区四区视频| 精品一区二区在线观看| 亚洲看片网站| 97久久精品一区二区三区的观看方式 | 成人小视频免费观看| 中文字幕在线亚洲三区| 国产精品伊人| 久久精品人人做人人爽| 97人妻精品一区二区三区动漫| 国产精品天天看| gai在线观看免费高清| 成人亚洲一区| 91精品久久久久久久久中文字幕| 自拍视频在线网| 欧美日韩视频不卡| 日韩高清dvd碟片| 国产高清在线观看免费不卡| 狠狠精品干练久久久无码中文字幕| 麻豆精品国产| 久久久久久国产三级电影| 日韩一级片免费在线观看| 婷婷亚洲久悠悠色悠在线播放| 噜噜噜在线视频| 久久亚洲美女| 中国成人在线视频| 91蝌蚪精品视频| 欧美专区中文字幕| 8888四色奇米在线观看| 5月丁香婷婷综合| 国产一级久久久| 久久久久久久久久久99999| 国产又大又黄又粗又爽| 欧美 日韩 国产一区二区在线视频| 成人xxxxx色| 亚洲精华液一区二区三区| 国产亚洲视频在线观看| 91精品中文字幕| 亚洲国产日韩av| 人妻av无码一区二区三区| 激情国产一区二区 | 国产盗摄精品一区二区酒店| 精品无人区乱码1区2区3区在线 | 久久99久久99小草精品免视看| 日韩精品一区二区三区电影| 免费萌白酱国产一区二区三区| 国产精品久久久久久久久久久久久久 | 亚洲精品一区在线| 日本精品久久久久久久| 岛国成人毛片| 亚洲精品视频免费| 999精品国产| 一本久久a久久免费精品不卡| 四虎影院中文字幕| 91免费视频网址| 欧美激情国内自拍| 亚洲综合欧美| 精品视频在线观看一区二区| 国产精品一区二区99| 999精品在线观看| 国产精品久久亚洲不卡| 久久久噜噜噜久久久| 午夜伦理在线| 日韩av在线看| 精品人妻少妇AV无码专区| 在线免费av一区| 国产女同在线观看| 亚洲精品欧美在线| 日本精品久久久久中文| 成a人片亚洲日本久久| 香蕉视频999| 视频一区免费在线观看| 国产69精品久久久久久久| 午夜精品毛片| 亚洲国产一区二区精品视频| 精品网站aaa| 成人免费视频观看视频| 国产福利亚洲| 日本欧美爱爱爱| 黄色软件视频在线观看| 色综合视频一区中文字幕| 欧美日韩视频在线播放| 亚洲图片欧洲图片av| 欧美性受xxxx狂喷水| 日韩女优视频免费观看| 亚洲一区中文字幕在线| 欧亚一区二区三区| jizz国产在线观看| 精品久久久久人成| 懂色av.com| 亚洲成人精品一区| 久久国产免费观看| 亚洲线精品一区二区三区| 麻豆视频在线免费看| 中文字幕亚洲一区二区av在线| 亚洲国产av一区| 国产欧美日韩卡一| 亚洲成人黄色av| 日本一区二区三区四区在线视频 | 超碰在线观看99| 日韩一区二区三区av| 国产女人高潮毛片| 欧美一区二区三区视频在线 | 亚洲第一偷拍网| 国产 欧美 精品| 亚洲黄页视频免费观看| 天天操天天操天天操| 亚洲精品不卡在线| 性插视频在线观看| 国产视频精品免费播放| 男人天堂亚洲二区| 中国日韩欧美久久久久久久久| 成人好色电影| 精品国产一区二区在线| 老司机在线看片网av| 久久亚洲精品小早川怜子66| 菠萝菠萝蜜在线观看| 欧美国产视频日韩| 交100部在线观看| 国产成人精品久久久| 99re66热这里只有精品4| 国产精品一区二区在线| 欧美第一在线视频| 国产午夜精品一区| 波多野结衣在线观看一区二区| 亚洲欧美在线网| 欧美.www| 北条麻妃在线观看| 久久草av在线| 中文字幕无人区二| 91麻豆高清视频| 欧美a在线播放| 亚洲精品美国一| 久久亚洲精品国产| 欧美日韩成人综合天天影院| www.xxx国产| 亚洲人成五月天| 综合久久2019| 欧美自拍大量在线观看| 不卡的国产精品| 精品国产一二| 久久久久国产精品| 国产亚洲综合视频| 久久97超碰国产精品超碰| 久久精品aⅴ无码中文字字幕重口| 2020日本不卡一区二区视频| 91香蕉视频污在线观看| 香蕉成人伊视频在线观看| 成人黄色免费网| 欧美精品一区二区三区很污很色的| 久久精品蜜桃| 欧美激情免费看| 精品福利在线| 久久综合入口| 伊人久久大香线| 我看黄色一级片| av电影在线观看一区| 亚洲波多野结衣| 91久久奴性调教| 人妻无码中文字幕| 久久国产精品影视| 成人天堂yy6080亚洲高清| 国产精品推荐精品| 欧美r级电影| 天天摸天天碰天天添| 国产成人精品综合在线观看 | 亚洲二区三区不卡| 欧美成人精品欧美一级乱| 粉嫩13p一区二区三区| 国产成人免费在线观看视频| 欧美午夜无遮挡| 亚洲精品久久久久久久久久久久久久 | 国产美女视频免费观看下载软件| 国产精品欧美一级免费| 国产a∨精品一区二区三区仙踪林| 欧美一区二区人人喊爽| 成人亚洲综合天堂| 欧美一区在线直播| 国产成人精品福利| 国产精品无码电影在线观看| 蜜桃久久久久久| 欧美大波大乳巨大乳| 狠狠久久亚洲欧美专区| 黄色小视频免费观看| 欧美成人免费全部观看天天性色| av成人免费看| 色大师av一区二区三区| 日韩中文字幕不卡| 欧美熟妇一区二区| 狠狠久久亚洲欧美专区| 婷婷综合激情网| 97香蕉超级碰碰久久免费的优势| 中文无码日韩欧| 国产精品无码电影在线观看| 国产精品一区久久久久| 国产免费久久久久| 4hu四虎永久在线影院成人| 日韩成人影视| 91精品久久久久久久久久久久久久| 欧美综合另类| 黄色小视频免费网站| 国产精品久久久久久久久晋中| 一区精品在线观看| 日韩在线国产精品| 亚洲精品乱码日韩| 天天做天天爱天天高潮| 国产呦萝稀缺另类资源| 欧美特级一级片| 欧美岛国在线观看| 91桃色在线观看| 欧美日韩国产精品一区二区| 久久精品九九| 亚洲毛片亚洲毛片亚洲毛片| 666欧美在线视频| 羞羞污视频在线观看| 俄罗斯精品一区二区| 亚洲精品专区| 亚洲精品成人无码熟妇在线| 色婷婷综合中文久久一本| 92国产在线视频| 91人成网站www| 极品av少妇一区二区| 国产精品一区二区入口九绯色| 色拍拍在线精品视频8848| 一区二区三区视频网站| 91中文字幕一区| 1024成人| 精品丰满少妇一区二区三区| 日韩一区二区三区免费看| heyzo在线欧美播放| 麻豆一区区三区四区产品精品蜜桃| 视频在线观看一区二区三区| 日本一二三区在线观看| 亚洲国产精品电影在线观看| 偷拍视频一区二区三区| 国产精品久久成人免费观看| 国产99久久久精品| 精品不卡一区二区| xxxx性欧美| 欧美绝顶高潮抽搐喷水合集| 日本成人中文字幕在线| 亚洲色图另类专区| 亚洲日本中文字幕在线| 国产在线久久久| 99精品视频免费全部在线| av男人的天堂av| 日韩一二在线观看| 欧美日韩国产v| 天天在线免费视频| 久久蜜桃av一区二区天堂| 国产精品熟女久久久久久 | 写真福利精品福利在线观看| 国产精品久久久影院| 久久天堂av综合合色蜜桃网| 国产乱子伦精品无码码专区| 26uuu国产精品视频|