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

精品国偷自产国产一区| 亚洲制服丝袜在线| 91精品综合久久久久久五月天| 中文字幕亚洲欧美日韩| 美女视频亚洲色图| 欧美日韩黄色一区二区| 欧美久久久久久久久久久久久久| 三级国产在线观看| 韩国成人在线视频| 欧美又大又粗又长| 欧美精品乱码视频一二专区| 欧美猛男做受videos| 宅男在线国产精品| 成年人在线看片| av美女在线观看| 国产精品久久久久久久久快鸭 | 亚洲人123区| 久久精品一二三区| www.com欧美| 乱一区二区av| 浅井舞香一区二区| 久一视频在线观看| 我不卡神马影院| 亚洲色图第三页| 亚洲精品无码一区二区| 99精品视频在线免费播放| 日本黄色一区二区| 欧美日韩精品在线一区二区| 国产午夜精品久久久久免费视| 久久亚洲二区三区| 国产一区二区免费电影| 99热这里只有精品5| 日av在线不卡| 国产成人激情视频| www.国产高清| 99精品视频免费| 欧美激情在线观看视频| 顶臀精品视频www| 欧美激情偷拍自拍| 中文字幕日韩欧美精品在线观看| 一区二区三区免费在线观看视频 | 日韩成人精品在线| 欧洲日韩成人av| 91在线看视频| 亚洲美女毛片| 久久久久久伊人| 久久国产精品波多野结衣av| 亚洲欧洲中文字幕| 久热在线中文字幕色999舞| 懂色av蜜桃av| 成人一区不卡| 中文字幕欧美精品在线| 亚洲一级黄色录像| 成人免费看片39| 中文字幕一区二区精品| 成人在线观看免费高清| 凹凸成人精品亚洲精品密奴| 在线观看国产精品淫| 老司机福利在线观看| 日韩系列欧美系列| 日韩在线观看高清| 中国毛片直接看| 欧美欧美全黄| 久久露脸国产精品| 你懂的国产视频| 日韩综合小视频| 国产精品香蕉av| 国产精品无码天天爽视频| 国产综合久久久久久鬼色| 91久久久久久| 欧美一级片免费| 久久久噜噜噜久久中文字幕色伊伊| 黄色一区三区| 国产系列在线观看| 国产精品久久久久一区| 欧美日韩午夜爽爽| 国产在线天堂www网在线观看| 日韩欧美中文字幕在线观看| 99久久国产宗和精品1上映| 99久久亚洲国产日韩美女| 欧美丰满美乳xxx高潮www| 91人妻一区二区| 自拍自偷一区二区三区| 最近2019中文字幕mv免费看| 欧美黄色一区二区三区| 亚洲综合99| 91精品免费视频| 亚洲欧美日本在线观看| 国产精品视频一二| 91亚洲精品国产| 日韩电影免费观看高清完整版| 欧美日本在线观看| 国产美女视频免费观看下载软件| 精品国产一区二区三区四区| 不卡毛片在线看| 男人天堂2024| 国产精品一二三在| 清纯唯美一区二区三区| av片在线观看| 欧美无人高清视频在线观看| 免费欧美一级片| 欧美一区三区| …久久精品99久久香蕉国产| 国产精品视频一二区| 99久久精品久久久久久清纯| 影音先锋在线亚洲| 国模冰冰炮一区二区| 日韩一区二区三区免费看| 偷拍夫妻性生活| 一区福利视频| 国产欧美韩国高清| 经典三级在线| 亚洲国产精品久久久久婷婷884| 性刺激的欧美三级视频| 美腿丝袜亚洲图片| 欧美激情按摩在线| 亚洲综合视频在线播放| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 波多野结衣乳巨码无在线| 中文成人在线| 中文字幕久久久| 一级黄色大片视频| 91婷婷韩国欧美一区二区| 欧美国产视频一区| www.久久草.com| 最近中文字幕日韩精品| www.欧美色| 91视频com| 五月丁香综合缴情六月小说| 日韩欧美高清一区二区三区| 日韩亚洲第一页| 波多野结衣在线观看视频| 99精品视频在线播放观看| 日韩精品手机在线观看| 91精品一区| www.久久久久| 国产精品国产一区二区三区四区 | 亚洲色图13p| www.毛片.com| 成人精品国产免费网站| 肉大捧一出免费观看网站在线播放 | 操欧美老女人| 国产精品久久久久久av| 国产福利在线看| 欧美性感一区二区三区| 精品无码在线观看| 青娱乐精品在线视频| 视频一区二区在线观看| 影音成人av| 丝袜情趣国产精品| 国产又粗又猛又爽| 最新国产成人在线观看| 在线免费黄色网| 一区二区三区在线| 18成人在线| 高清电影在线免费观看| 精品久久久久久久人人人人传媒 | jizzjizz在线观看| 欧美色图一区二区三区| 美女网站视频色| 国产一区二区三区精品视频| 蜜臀在线免费观看| 777久久精品| 欧美一级电影在线| 国产h在线观看| 欧美日韩一区二区三区免费看| 国产第一页精品| 国产一区二区精品在线观看| 51xx午夜影福利| 菁菁伊人国产精品| 亲子乱一区二区三区电影| 国产高清一级毛片在线不卡| 在线不卡a资源高清| 欧美色图亚洲天堂| 91亚洲精品乱码久久久久久蜜桃| 日韩中文字幕免费在线| 久久精品久久久| 国产欧美日韩视频一区二区三区| 怡红院成人在线| 久久综合免费视频| 亚洲 小说区 图片区 都市| 欧美专区亚洲专区| 校园春色 亚洲| 久久理论电影网| 在线播放av中文字幕| aa国产精品| 亚洲一区二区精品在线观看| 丁香婷婷成人| 国产欧美 在线欧美| av午夜在线观看| 日韩一二三在线视频播| 手机在线观看毛片| 欧美日韩一区二区不卡| 日韩av一区二区在线播放| 欧美激情中文字幕| 欧美日韩一区二区三区四区五区六区| 国产精品色网| 色哟哟免费网站| 国产精品美女久久久久久不卡| 91精品视频在线看| 超级碰碰久久| 欧美激情一级精品国产| eeuss影院www在线播放| 亚洲国产天堂久久综合网| 亚洲图片在线播放| 色综合天天综合网国产成人综合天| 任你操精品视频| 2021中文字幕一区亚洲| 三大队在线观看| 精品中文av资源站在线观看| 国产91xxx| 欧美高清日韩| 亚洲日本精品国产第一区| 思热99re视热频这里只精品| 91久久久一线二线三线品牌| 欧美va在线观看| 91成人性视频| av免费不卡国产观看| 欧美成年人网站| 麻豆网站在线看| 中文字幕久久久| 免费在线视频你懂得| 精品国产污污免费网站入口 | 国产在线一二区| 亚洲欧美另类图片小说| 激情五月深爱五月| 亚洲国产精品传媒在线观看| 成人精品在线观看视频| 99久久精品国产精品久久| 国偷自产av一区二区三区麻豆| 免费成人你懂的| 成人中文字幕av| 蜜桃视频一区| 99免费视频观看| 老司机亚洲精品| 成年人网站大全| 日韩中文字幕不卡| 好男人www社区| 视频一区在线视频| 成年人小视频网站| 天堂资源在线中文精品| 毛片av免费在线观看| 久久国产日本精品| 亚洲欧美另类动漫| 日本视频中文字幕一区二区三区| aaa毛片在线观看| 久久一区精品| 91制片厂毛片| 精品一区二区综合| 国产资源中文字幕| 国产aⅴ综合色| 欧美做受高潮中文字幕| av一区二区三区黑人| 国产不卡一二三| 26uuu久久综合| 9.1片黄在线观看| 亚洲色图欧洲色图婷婷| 丰满少妇高潮久久三区| 亚洲高清免费观看| 4438国产精品一区二区| 色先锋aa成人| 91资源在线视频| 日韩三级在线观看| 亚洲 国产 欧美 日韩| 一本色道久久88综合亚洲精品ⅰ| 午夜不卡视频| 欧美激情18p| 中文字幕人成乱码在线观看| 国产精品美女久久久久久免费| 成人av在线播放| 国产精品久久久一区二区三区| 四虎影视精品| 一区二区精品视频| 激情综合在线| 青青草精品视频在线观看| 精品一区二区三区香蕉蜜桃| 手机免费看av片| 久久精品亚洲精品国产欧美 | 男男激情在线| 日韩视频第一页| 久久男人av资源站| 国产女精品视频网站免费| 日本一区二区乱| 欧美日韩另类丝袜其他| 国产精品久久久久一区二区三区厕所 | 亚洲激情 欧美| 中文字幕欧美日韩一区| 私库av在线播放| 欧美性猛交xxx| 国产成人精品亚洲精品色欲| 亚洲精品自产拍| 影音先锋在线播放| 日韩av免费网站| 日韩精品一区二区三区免费视频| 久久一区免费| 中文字幕日韩欧美精品高清在线| 欧美 日本 亚洲| 国产曰批免费观看久久久| 蜜桃精品一区二区| 一区二区三区四区激情| 国产情侣免费视频| 日韩电影大片中文字幕| 影音先锋在线视频| 91精品国产自产在线观看永久| 久久久久久毛片免费看| 老司机av福利| 日韩高清不卡一区二区三区| 91超薄肉色丝袜交足高跟凉鞋| 中文字幕免费一区| 免费观看一区二区三区毛片| 日韩视频一区二区在线观看| a天堂在线资源| 91精品国产99| 超碰cao国产精品一区二区| 在线观看视频黄色| 日韩不卡在线观看日韩不卡视频| 青青草成人免费视频| 一区二区三区在线高清| 91在线观看喷潮| 中文字幕在线观看亚洲| 欧美性suv| 欧美日韩一区二区三区在线视频| 国内精品嫩模av私拍在线观看| wwwwwxxxx日本| 欧美激情一区二区三区四区| 五月天激情国产综合婷婷婷| 精品久久久久99| 欧美24videosex性欧美| 成人做爽爽免费视频| 国产精品99一区二区三| 五月天婷婷亚洲| 亚洲欧美在线aaa| 在线观看中文字幕av| 国产一区二区日韩精品欧美精品| 亚洲最大网站| 欧美一区三区二区在线观看| 国产日韩一区二区三区在线播放| 天天躁日日躁狠狠躁av麻豆男男| 一区二区在线免费观看| wwwav网站| 欧美国产高跟鞋裸体秀xxxhd| 日韩高清一区| 国产91在线亚洲| 国产成人无遮挡在线视频| 久久精品www| 亚洲成人精品视频在线观看| sm久久捆绑调教精品一区| 国产欧美一区二区三区另类精品| 欧美日韩亚洲一区三区| 在线观看免费视频黄| 午夜精品成人在线| 天堂中文在线8| 国产成人午夜视频网址| 国产精品一在线观看| 国产wwwxx| 亚洲欧美另类久久久精品| 精品国产亚洲av麻豆| 久久久在线视频| 亚洲品质自拍| 伊人网在线综合| 一区二区三区中文免费| 无码精品黑人一区二区三区| 青青草精品毛片| 日韩欧美高清| 亚洲天堂小视频| 懂色av一区二区三区| lutube成人福利在线观看| 亚洲精品免费网站| 在线综合亚洲| 一本在线免费视频| 日韩一区二区免费在线电影| 国产精品蜜芽在线观看| 欧美三级电影在线播放| 韩国v欧美v日本v亚洲v| 精品视频久久久久| 亚洲视频精品在线| 久久久久久久久成人| 九九九九免费视频| 国产精品久久网站| 日本激情一区二区三区| 国产精品露脸自拍| 国内在线观看一区二区三区| 日韩人妻一区二区三区 | 成人乱码一区二区三区| 欧美性视频精品| 91亚洲国产| 制服丝袜第二页| 欧美一卡二卡三卡| a日韩av网址| 久久久天堂国产精品| 久久色视频免费观看| 国产精品高潮呻吟av| 2019最新中文字幕| 欧美极品一区二区三区| 免费毛片视频网站| 日韩精品一区二区三区四区| 三上悠亚亚洲一区| 欧美又粗又长又爽做受| 国产精品污污网站在线观看 | 99riav一区二区三区|