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

軟件開發中的自測及C代碼示例

開發 開發工具
很多人所理解的軟件開發人員的工作就是寫代碼,而不包括測試,這樣的理解是片面的。實際的經驗表明,很多時候,我們花在測試上的時間比寫代碼的時間還要多。為了保證產品質量,很多項目組也對自測提出了較高的要求。

[[179305]]

在軟件開發中,程序自測是一個永遠都繞不開的話題。很多開發人員以寫出有難度的代碼為榮,但卻不重視對自己編寫的代碼進行測試,這導致了最終到達客戶手中的產品質量不高,bug頻發,損害了公司的形象。對于一個開發人員來說,我們應該將開發和自測置于同等重要的地位,我們花在自測上的時間要不比開發少。能否對自己編寫的代碼進行充分的自測也是檢驗一個開發人員水平高低的標準之一。

自測方法

根據所編寫的程序的特點,自測方法大致有如下幾種:

***種,利用模擬工具進行自測。這種方法適用于需要其他模塊(尚不具備)發過來的消息才能觸發程序流程的情況。模擬工具要嚴格按照協議的要求發消息,并處理相應的應答消息。這種方法的優點是可模擬真實的系統來測試代碼,功能覆蓋比較完全;其缺點是模擬工具的編寫比較復雜(相當于要實現一個完整的功能模塊)、花費的時間較多。

第二種,利用對端模塊進行自測。這種方法適用于兩個軟件模塊功能的耦合性比較強且在同時開發的情況。例如,正在開發的模塊1的功能A需要正在開發的模塊2的功能B才能觸發,而模塊1和模塊2的開發進度差不多,此時,就可以通過模塊2向模塊1發消息的方法來對功能A和功能B進行自測。

第三種,手動插入數據或執行命令進行自測。這種方法適用于某個軟件模塊的功能比較獨立的情況。此時,沒有其他模塊與該模塊進行消息的交互,也沒有編寫單獨的測試模塊。利用手工的方法的優點是可以根據程序的特點設置測試用例,代碼覆蓋率比較高;其缺點是難以對大數據量的消息進行測試,無法保證程序性能。

第四種,在程序中添加測試代碼進行自測。也就是說,在編寫軟件功能代碼的同時,將測試代碼一并加入其中。這種方法的優點比較明顯,那就是無需與其他程序模塊進行消息交互、無需手動插入數據或發消息,當整個軟件模塊運行起來之后,測試代碼即可發揮其功效。當然,該方法也有缺點,那就是編寫這些測試代碼需要花費一定的時間,可能導致代碼過于臃腫。

本文接下來的部分,將用實際的C代碼來示例第四種自測方法的使用。

示例程序

本文用到的示例程序比較簡單,其功能是每個一段時間(1分鐘)將源目錄中滿足前綴要求的文件備份(移動)到備份目錄中。

程序(FilesBackup.c)如下:

  1. /********************************************************************** 
  2. * 版權所有(C)2016, Zhou Zhaoxiong。 
  3. * 文件名稱:FilesBackup.c 
  4. * 文件標識:無 
  5. * 內容摘要:將某個目錄中的文件進行備份 
  6. * 其它說明:無 
  7. * 當前版本:V1.0 
  8. * 作    者:Zhou Zhaoxiong 
  9. * 完成日期:20160701 
  10. **********************************************************************/ 
  11. #include <stdio.h> 
  12. #include <string.h> 
  13. #include <dirent.h> 
  14. #include <ftw.h> 
  15. #include <time.h> 
  16.  
  17. // 重定義數據類型 
  18. typedef signed   int       INT32; 
  19. typedef unsigned int       UINT32; 
  20. typedef unsigned char      UINT8; 
  21.  
  22. // 全局變量定義 
  23. UINT8 g_szSourceDir[256] = {0};     // 源文件的目錄 
  24. UINT8 g_szBackupDir[256] = {0};     // 備份文件的目錄 
  25.  
  26. // 函數聲明 
  27. INT32 SelectFlies(struct dirent *pDir); 
  28. void ScanDirAndBackup(void); 
  29. void Sleep(UINT32 iCountMs); 
  30.  
  31.  
  32. /**************************************************************** 
  33. * 功能描述: 主函數 
  34. * 輸入參數: 無 
  35. * 輸出參數: 無 
  36. * 返回值: 0-執行完成 
  37. * 其他說明: 無 
  38. * 修改日期       版本號        修改人        修改內容 
  39. *------------------------------------------------------------- 
  40. * 20160701        V1.0    Zhou Zhaoxiong     創建 
  41. ****************************************************************/ 
  42. INT32 main(void) 
  43.     INT32 iRetValue = 0; 
  44.  
  45.    // 獲取源文件的目錄 
  46.    snprintf(g_szSourceDir, sizeof(g_szSourceDir)-1,"%s/zhouzx/TestDir/SourceDir", getenv("HOME")); 
  47.  
  48.     // 獲取備份文件的目錄 
  49.    snprintf(g_szBackupDir, sizeof(g_szBackupDir)-1,"%s/zhouzx/TestDir/BackupDir", getenv("HOME")); 
  50.  
  51.    // 調用函數執行文件的備份 
  52.    while (1) 
  53.    { 
  54.        ScanDirAndBackup(); 
  55.  
  56.        Sleep(60 * 1000);    // 每一分鐘執行一次文件的備份 
  57.    } 
  58.  
  59.    return 0; 
  60.  
  61.  
  62. /********************************************************************** 
  63. * 功能描述:根據前綴和后綴選擇文件 
  64. * 輸入參數:dir-目錄 
  65. * 輸出參數:無 
  66. * 返回值:0-失敗   1-成功 
  67. * 其它說明:無 
  68. * 修改日期         版本號      修改人          修改內容 
  69. *-------------------------------------------------------------------- 
  70. * 20160701         V1.0   ZhouZhaoxiong        創建 
  71. ***********************************************************************/ 
  72. INT32 SelectFlies(struct dirent *pDir) 
  73.    INT32 iSelectResult = 0; 
  74.  
  75.    UINT8 szFilePrefix[10] = {0};     // 源文件的前綴 
  76.  
  77.    if (pDir == NULL
  78.    { 
  79.        printf("SelectFlies:input parameter is NULL!\n"); 
  80.        return 0; 
  81.    } 
  82.  
  83.    // 匹配文件前綴和后綴 
  84.    strncpy(szFilePrefix, "File_", strlen("File_")); 
  85.    iSelectResult = (strncmp(pDir->d_name, szFilePrefix,strlen(szFilePrefix)) == 0); 
  86.  
  87.    if (iSelectResult == 1)           // 找到了匹配前綴的文件 
  88.    { 
  89.        return 1; 
  90.    } 
  91.    else 
  92.    { 
  93.        return 0; 
  94.    } 
  95.  
  96.  
  97. /********************************************************************** 
  98. * 功能描述:掃描目錄并備份文件 
  99. * 輸入參數:無 
  100. * 輸出參數:無 
  101. * 返回值:無 
  102. * 其它說明:無 
  103. * 修改日期         版本號      修改人          修改內容 
  104. *-------------------------------------------------------------------- 
  105. * 20160701         V1.0     ZhouZhaoxiong        創建 
  106. ***********************************************************************/ 
  107. void ScanDirAndBackup(void) 
  108.    INT32  iScanDirRet       = 0; 
  109.    UINT32 iFileIdx          = 0; 
  110.    UINT8  szScanedFile[512] = {0}; 
  111.    UINT8  szCmdBuf[256]     = {0}; 
  112.    struct dirent **ppDirEnt = NULL
  113.  
  114.    iScanDirRet = scandir(g_szSourceDir, &ppDirEnt, SelectFlies,alphasort); 
  115.    if (iScanDirRet < 0)   // 掃描目錄出錯 
  116.    { 
  117.        printf("ScanDirAndBackup:exec scandir failed, path=%s\n",g_szSourceDir); 
  118.        return
  119.    } 
  120.    else if (iScanDirRet == 0)   // 目錄下無文件 
  121.    { 
  122.        printf("ScanDirAndBackup:no satisfied file in directory %s\n",g_szSourceDir); 
  123.        return
  124.    } 
  125.    else          // 將滿足條件的文件移動到備份目錄中 
  126.    { 
  127.        for (iFileIdx = 0; iFileIdx < iScanDirRet; iFileIdx ++) 
  128.        { 
  129.            memset(szScanedFile, 0x00, sizeof(szScanedFile)); 
  130.            snprintf(szScanedFile, sizeof(szScanedFile) - 1, "%s/%s",g_szSourceDir, ppDirEnt[iFileIdx]->d_name); 
  131.  
  132.            memset(szCmdBuf, 0x00, sizeof(szCmdBuf)); 
  133.            snprintf(szCmdBuf, sizeof(szCmdBuf) - 1, "mv %s %s",szScanedFile, g_szBackupDir); 
  134.            system(szCmdBuf); 
  135.  
  136.            printf("ScanDirAndBackup:now, %s\n", szCmdBuf); 
  137.        } 
  138.    } 
  139.  
  140.    printf("ScanDirAndBackup:this time,totally moved %d file(s) to%s\n", iScanDirRet, g_szBackupDir); 
  141.  
  142.    return
  143.  
  144.  
  145. /********************************************************************** 
  146. * 功能描述:程序休眠 
  147. * 輸入參數:iCountMs-休眠時間(單位:ms) 
  148. * 輸出參數:無 
  149. * 返回值:無 
  150. * 其它說明:無 
  151. * 修改日期      版本號       修改人        修改內容 
  152. *------------------------------------------------------------------ 
  153. * 20160701       V1.0    Zhou Zhaoxiong     創建 
  154. ********************************************************************/ 
  155. void Sleep(UINT32 iCountMs) 
  156.    struct timeval t_timeout = {0}; 
  157.  
  158.    if (iCountMs < 1000) 
  159.    { 
  160.        t_timeout.tv_sec  = 0; 
  161.        t_timeout.tv_usec = iCountMs * 1000; 
  162.    } 
  163.    else 
  164.    { 
  165.        t_timeout.tv_sec  = iCountMs /1000; 
  166.        t_timeout.tv_usec = (iCountMs % 1000) * 1000; 
  167.    } 
  168.    select(0, NULLNULLNULL, &t_timeout);    // 調用select函數阻塞程序 

添加測試代碼之后的程序

我們添加測試代碼的基本思路是在掃描源文件目錄之前,先在該目錄下生成文件,這樣就相當于手動將文件放到源目錄中了。

添加之后的程序代碼如下:

  1. /********************************************************************** 
  2. * 版權所有(C)2016, Zhou Zhaoxiong。 
  3. * 文件名稱:FilesBackup.c 
  4. * 文件標識:無 
  5. * 內容摘要:將某個目錄中的文件進行備份 
  6. * 其它說明:無 
  7. * 當前版本:V1.0 
  8. * 作    者:Zhou Zhaoxiong 
  9. * 完成日期:20160701 
  10. **********************************************************************/ 
  11. #include <stdio.h> 
  12. #include <string.h> 
  13. #include <dirent.h> 
  14. #include <ftw.h> 
  15. #include <time.h> 
  16.  
  17. // 重定義數據類型 
  18. typedef signed   int       INT32; 
  19. typedef unsigned int       UINT32; 
  20. typedef unsigned char      UINT8; 
  21.  
  22. // 全局變量定義 
  23. UINT8 g_szSourceDir[256] = {0};     // 源文件的目錄 
  24. UINT8 g_szBackupDir[256] = {0};     // 備份文件的目錄 
  25.  
  26. // 函數聲明 
  27. INT32 SelectFlies(struct dirent *pDir); 
  28. void ScanDirAndBackup(void); 
  29. void Sleep(UINT32 iCountMs); 
  30. void CreateTestFile(void); 
  31.  
  32.  
  33. /**************************************************************** 
  34. * 功能描述: 主函數 
  35. * 輸入參數: 無 
  36. * 輸出參數: 無 
  37. * 返回值: 0-執行完成 
  38. * 其他說明: 無 
  39. * 修改日期       版本號        修改人        修改內容 
  40. *------------------------------------------------------------- 
  41. * 20160701        V1.0    Zhou Zhaoxiong     創建 
  42. ****************************************************************/ 
  43. INT32 main(void) 
  44.     INT32 iRetValue = 0; 
  45.  
  46.     // 獲取源文件的目錄 
  47.     snprintf(g_szSourceDir, sizeof(g_szSourceDir)-1,"%s/zhouzx/TestDir/SourceDir", getenv("HOME")); 
  48.  
  49.    // 獲取備份文件的目錄    snprintf(g_szBackupDir,sizeof(g_szBackupDir)-1, "%s/zhouzx/TestDir/BackupDir",getenv("HOME")); 
  50.  
  51.    // 調用函數執行文件的備份 
  52.    while (1) 
  53.    { 
  54.        // ------------- 
  55.        // 先在源目錄中創建測試文件 
  56.        CreateTestFile(); 
  57.        // ------------- 
  58.  
  59.         ScanDirAndBackup(); 
  60.  
  61.        Sleep(60 * 1000);    // 每一分鐘執行一次文件的備份 
  62.    } 
  63.  
  64.    return 0; 
  65.  
  66.  
  67. /********************************************************************** 
  68. * 功能描述:根據前綴和后綴選擇文件 
  69. * 輸入參數:dir-目錄 
  70. * 輸出參數:無 
  71. * 返回值:0-失敗   1-成功 
  72. * 其它說明:無 
  73. * 修改日期         版本號      修改人          修改內容 
  74. *-------------------------------------------------------------------- 
  75. * 20160701         V1.0   ZhouZhaoxiong        創建 
  76. ***********************************************************************/ 
  77. INT32 SelectFlies(struct dirent *pDir) 
  78.    INT32 iSelectResult = 0; 
  79.  
  80.    UINT8 szFilePrefix[10] = {0};     // 源文件的前綴 
  81.  
  82.    if (pDir == NULL
  83.    { 
  84.        printf("SelectFlies:input parameter is NULL!\n"); 
  85.        return 0; 
  86.    } 
  87.  
  88.    // 匹配文件前綴和后綴 
  89.    strncpy(szFilePrefix, "File_", strlen("File_")); 
  90.    iSelectResult = (strncmp(pDir->d_name, szFilePrefix,strlen(szFilePrefix)) == 0); 
  91.  
  92.    if (iSelectResult == 1)           // 找到了匹配前綴的文件 
  93.    { 
  94.        return 1; 
  95.    } 
  96.    else 
  97.    { 
  98.        return 0; 
  99.    } 
  100.  
  101.  
  102. /********************************************************************** 
  103. * 功能描述:掃描目錄并備份文件 
  104. * 輸入參數:無 
  105. * 輸出參數:無 
  106. * 返回值:無 
  107. * 其它說明:無 
  108. * 修改日期         版本號      修改人          修改內容 
  109. *-------------------------------------------------------------------- 
  110. * 20160701         V1.0    ZhouZhaoxiong        創建 
  111. ***********************************************************************/ 
  112. void ScanDirAndBackup(void) 
  113.    INT32  iScanDirRet       = 0; 
  114.    UINT32 iFileIdx          = 0; 
  115.    UINT8  szScanedFile[512] = {0}; 
  116.    UINT8  szCmdBuf[256]     = {0}; 
  117.    struct dirent **ppDirEnt = NULL
  118.  
  119.    iScanDirRet = scandir(g_szSourceDir, &ppDirEnt, SelectFlies,alphasort); 
  120.    if (iScanDirRet < 0)   // 掃描目錄出錯 
  121.    { 
  122.        printf("ScanDirAndBackup:exec scandir failed, path=%s\n",g_szSourceDir); 
  123.        return
  124.    } 
  125.    else if (iScanDirRet == 0)   // 目錄下無文件 
  126.    { 
  127.        printf("ScanDirAndBackup:no satisfied file in directory %s\n",g_szSourceDir); 
  128.        return
  129.    } 
  130.    else          // 將滿足條件的文件移動到備份目錄中 
  131.    { 
  132.        for (iFileIdx = 0; iFileIdx < iScanDirRet; iFileIdx ++) 
  133.        { 
  134.            memset(szScanedFile, 0x00, sizeof(szScanedFile)); 
  135.            snprintf(szScanedFile, sizeof(szScanedFile) - 1, "%s/%s", g_szSourceDir,ppDirEnt[iFileIdx]->d_name); 
  136.  
  137.            memset(szCmdBuf, 0x00, sizeof(szCmdBuf)); 
  138.            snprintf(szCmdBuf, sizeof(szCmdBuf) - 1, "mv %s %s",szScanedFile, g_szBackupDir); 
  139.            system(szCmdBuf); 
  140.  
  141.            printf("ScanDirAndBackup:now, %s\n", szCmdBuf); 
  142.        } 
  143.    } 
  144.  
  145.    printf("ScanDirAndBackup:this time,totally moved %d file(s) to%s\n", iScanDirRet, g_szBackupDir); 
  146.  
  147.    return
  148.  
  149.  
  150. /********************************************************************** 
  151. * 功能描述:程序休眠 
  152. * 輸入參數:iCountMs-休眠時間(單位:ms) 
  153. * 輸出參數:無 
  154. * 返回值:無 
  155. * 其它說明:無 
  156. * 修改日期      版本號       修改人        修改內容 
  157. *------------------------------------------------------------------ 
  158. * 20160701       V1.0    Zhou Zhaoxiong     創建 
  159. ********************************************************************/ 
  160. void Sleep(UINT32 iCountMs) 
  161.    struct timeval t_timeout = {0}; 
  162.  
  163.    if (iCountMs < 1000) 
  164.    { 
  165.        t_timeout.tv_sec  = 0; 
  166.        t_timeout.tv_usec = iCountMs * 1000; 
  167.    } 
  168.    else 
  169.    { 
  170.        t_timeout.tv_sec  = iCountMs /1000; 
  171.        t_timeout.tv_usec = (iCountMs % 1000) * 1000; 
  172.    } 
  173.    select(0, NULLNULLNULL, &t_timeout);    // 調用select函數阻塞程序 
  174.  
  175.  
  176. /********************************************************************** 
  177.  * 功能描述:創建本地測試文件 
  178.  * 輸入參數:無 
  179.  * 輸出參數:無 
  180.  * 返回值:無 
  181.  * 其它說明:每一輪創建的測試文件數目加1,到達1000個之后又從1開始 
  182.  * 修改日期            版本號            修改人           修改內容 
  183.  *-------------------------------------------------------------------- 
  184.  *20160701             V1.0          Zhou Zhaoxiong        創建 
  185.  **********************************************************************/ 
  186. void CreateTestFile(void) 
  187.    UINT32  iFileIdx        = 0; 
  188.    UINT8   szFileName[500] = {0}; 
  189.    FILE   *fp              = NULL
  190.  
  191.    static UINT32 s_iFileNo = 0; 
  192.  
  193.    s_iFileNo ++; 
  194.    if (s_iFileNo > 1000) 
  195.    { 
  196.        s_iFileNo = 0; 
  197.    } 
  198.  
  199.    for (iFileIdx = 0; iFileIdx < s_iFileNo; iFileIdx ++) 
  200.    { 
  201.        // 獲取帶路徑的文件名 
  202.        memset(szFileName, 0x00, sizeof(szFileName)); 
  203.        snprintf(szFileName, sizeof(szFileName)-1, "%s/File_%d.txt",g_szSourceDir, iFileIdx); 
  204.  
  205.        fp = fopen(szFileName, "a+"); 
  206.        if (fp == NULL
  207.        { 
  208.             printf("CreateTestFile: open file %s failed!\n", szFileName); 
  209.             return
  210.        } 
  211.  
  212.        fputs("Hello,world!", fp); 
  213.        fflush(fp); 
  214.  
  215.        fclose(fp); 
  216.        fp = NULL
  217.    } 
  218.  
  219.    if (s_iFileNo % 10 == 0)   // 每生成10批滿足前綴要求的文件之后, 生成1個不滿足前綴要求的文件 
  220.    { 
  221.        memset(szFileName, 0x00, sizeof(szFileName)); 
  222.        snprintf(szFileName, sizeof(szFileName)-1, "%s/Test_%d.txt",g_szSourceDir, s_iFileNo); 
  223.  
  224.        fp = fopen(szFileName, "a+"); 
  225.        if (fp == NULL
  226.        { 
  227.             printf("CreateTestFile: open file %s failed!\n", szFileName); 
  228.             return
  229.        } 
  230.  
  231.        fputs("Hello,world!", fp); 
  232.        fflush(fp); 
  233.  
  234.        fclose(fp); 
  235.        fp = NULL
  236.    } 

程序說明如下:

***,本程序中添加的測試函數是CreateTestFile,其作用是在源目錄中創建測試文件??紤]到程序性能,我們設定最多生成1000(可根據實際情況修改)個滿足前綴要求的文件,并且每一輪生成的文件數比上一輪多一個。同時,每生成10輪的滿足前綴要求的文件之后,要生成一個不滿足前綴要求的文件,用以測試異常情況。如此,正常和異常情況都考慮到了。

第二,示例代碼中寫入文件的內容是固定的“Hello,world!”,大家可以根據需要修改該內容以滿足自身測試的要求。

第三,在提交正式版本的時候,大家要將測試代碼注釋掉或刪掉,以免影響正常的程序流程。

總結

很多人所理解的軟件開發人員的工作就是寫代碼,而不包括測試,這樣的理解是片面的。實際的經驗表明,很多時候,我們花在測試上的時間比寫代碼的時間還要多。為了保證產品質量,很多項目組也對自測提出了較高的要求。

作為一位合格的軟件開發人員,自測是一個檢驗和提升自身能力的好方法,大家一定要對自己編寫的代碼進行充分的測試。通過不斷地實踐,大家也可以總結出更多和更好的自測方法。

【本文是51CTO專欄作者周兆熊的原創文章,作者微信公眾號:周氏邏輯(logiczhou)】

責任編輯:武曉燕 來源: csdn博客
相關推薦

2016-12-05 16:55:16

開發實踐C代碼

2023-02-09 16:48:12

軟件開發測試結對測試

2020-04-17 18:00:01

軟件人工智能Python

2011-08-11 09:56:50

模式

2009-08-27 15:53:30

C#中using wo

2023-09-13 15:09:35

軟件開發數字化進程

2013-02-18 09:54:05

軟件開發程序員

2011-05-12 11:28:40

軟件開發

2023-01-09 16:08:19

2014-01-16 14:06:18

軟件開發團隊管理

2024-09-23 15:02:40

2009-02-10 17:11:53

SaaSSaaS開發PaaS

2015-03-02 09:35:07

軟件開發

2011-07-04 17:09:54

2023-10-16 08:00:00

2022-08-22 16:03:15

軟件開發系統

2011-09-09 09:18:43

軟件開發團隊

2024-07-17 08:15:09

2009-06-12 11:35:28

模式框架軟件設計

2024-04-02 06:03:00

GenAI軟件開發人工智能
點贊
收藏

51CTO技術棧公眾號

在线观看中文字幕视频| 亚洲国产精品日韩| 天天操中文字幕| 欧美在线免费看视频| 欧美日韩高清一区二区三区| 红桃一区二区三区| 蜜桃视频在线免费| 国产精品一区一区三区| 欧美专区在线播放| 精品欧美一区二区久久久久| 久9久9色综合| 日韩视频免费观看高清完整版| 国产精品va无码一区二区| h网站视频在线观看| 国产69精品久久久久777| 国产福利精品视频| 精品少妇久久久| 日本电影一区二区| 亚洲第一av网站| 九九九九九国产| 欧美羞羞视频| 亚洲制服丝袜在线| 久久久国产精华液999999| 天堂√在线中文官网在线| 国产一区在线精品| 国产精品欧美日韩久久| 国产乡下妇女做爰| 欧美成人国产| 在线日韩第一页| 亚洲第九十七页| 大奶一区二区三区| 欧美一区二区女人| 99日在线视频| 97成人超碰| 欧美性高潮在线| 和岳每晚弄的高潮嗷嗷叫视频| 国产乱色在线观看| 中文字幕在线免费不卡| 日韩高清三级| 欧美女子与性| 97国产一区二区| 久久精品二区| 日本久久一级片| 成人激情免费网站| 国产 高清 精品 在线 a | 欧美曰成人黄网| 蜜臀av午夜一区二区三区| 黄毛片在线观看| 精品久久久久久中文字幕一区奶水 | 久久香蕉国产| 色狠狠久久aa北条麻妃| 日本成人午夜影院| 精品国产一区二区三区久久久樱花| 亚洲乱码国产乱码精品精天堂| 成人午夜精品无码区| 精品国产午夜肉伦伦影院| 精品久久久三级丝袜| 最新版天堂资源在线| 国产劲爆久久| 日韩精品中文字| 天天躁夜夜躁狠狠是什么心态| 九九在线高清精品视频| 一区二区三区高清国产| 欧美xxxooo| 亚洲欧美亚洲| 午夜精品一区二区三区在线| 中国一级免费毛片| 日韩av午夜在线观看| 国产欧美日韩91| 99热在线只有精品| 成人av在线电影| 久久资源av| 1区2区3区在线观看| 亚洲婷婷在线视频| 日本一区午夜艳熟免费| 亚洲精品日产| 精品视频在线免费观看| 91香蕉视频免费看| 全国精品免费看| 揄拍成人国产精品视频| 91成人福利视频| 国产精品亚洲欧美| 国产欧美一区二区三区在线| 亚洲高清精品视频| 久久久另类综合| 公共露出暴露狂另类av| 超级白嫩亚洲国产第一| 欧美自拍丝袜亚洲| 香蕉视频1024| 欧美精品一区二区三区精品| 欧美大胆a视频| 国产精品久久久久久久久久久久久久久久久 | 国产成人精品综合久久久| 一级片视频播放| 白白色 亚洲乱淫| 亚洲乱码一区二区三区 | 亚州成人在线电影| 99视频在线视频| 国产精东传媒成人av电影| 最近2019中文字幕在线高清| 中文在线观看免费网站| 九九九久久久精品| 免费看成人午夜电影| 在线三级中文| 精品视频一区 二区 三区| 久久久久国产免费| 91日韩视频| 欧日韩不卡在线视频| 亚洲精品一区二区三区蜜桃 | 久久久一区二区三区四区| 视频一区在线视频| 国产精品一区二区av| 精品视频在线一区二区| 色综合久久精品| 久久精品无码专区| 国产精品91一区二区三区| 日本在线观看天堂男亚洲| 精品国产黄色片| 日本一区二区三区dvd视频在线| 久久男人资源站| a一区二区三区亚洲| 国产亚洲人成网站在线观看| 国产污污视频在线观看 | 日产国产高清一区二区三区| 久久99精品久久久久久久久久| 伊人精品影院| 欧美一区二区三区免费视频| 日本黄色录像视频| 日韩精品久久理论片| 蜜桃免费一区二区三区| 97在线超碰| 亚洲成人aaa| 精品一级少妇久久久久久久| 国产精品一区二区在线观看不卡| 亚洲午夜精品久久久久久浪潮| 精品3atv在线视频| 亚洲美女精品久久| 午夜毛片在线观看| 91麻豆免费看| 日批视频在线免费看| 欧美18xxxx| 1769国内精品视频在线播放| 午夜视频免费在线| 一区二区三区精密机械公司| www.国产区| 久久综合欧美| 国产精品三级在线| 在线免费观看的av网站| 欧美日韩三级在线| 99自拍视频在线| 国产一区二区女| 菠萝蜜视频在线观看入口| 亚洲视频国产精品| 国内成人精品一区| 四虎精品欧美一区二区免费| av资源免费看| 亚洲女女做受ⅹxx高潮| 波多野结衣在线免费观看| 亚洲成人xxx| 年下总裁被打光屁股sp| 欧美亚洲不卡| 国产精品国模大尺度私拍| 国产91足控脚交在线观看| 亚洲精品一区二区三区香蕉| 国产福利拍拍拍| 26uuu色噜噜精品一区二区| 国产精品少妇在线视频| 色777狠狠狠综合伊人| 国产一区在线播放| 欧美黑人猛交| 亚洲男人天堂2023| 亚洲视频一区在线播放| 亚洲女同一区二区| 99久久免费看精品国产一区 | 国产欧美一区二区精品久导航| 无码人妻精品一区二区三区66| 色婷婷粉嫩av| 丁香网亚洲国际| 国产二区视频在线播放| 手机在线一区二区三区| 国产不卡一区二区在线观看| 成人影院av| 久久中文字幕国产| 色视频在线看| 欧美高清一级片在线| 国产无遮挡aaa片爽爽| 国产视频一区二区在线观看| 夜夜夜夜夜夜操| 日韩一区二区久久| 日本一区二区三区www| 国产精品久久久久久久久久久久久久久 | 狠狠色综合播放一区二区| 欧美国产综合在线| 日韩欧美一区免费| 精品一区国产| 婷婷成人av| 日本伊人精品一区二区三区介绍| 2020国产在线视频| 国产亚洲综合久久| 天天爱天天干天天操| 欧美日本韩国一区二区三区视频| 日韩av无码中文字幕| 亚洲视频在线一区| 蜜桃无码一区二区三区| 粉嫩av一区二区三区在线播放| 色婷婷狠狠18| 羞羞答答国产精品www一本| 大地资源网在线观看免费官网| 精品国产午夜| 欧美日本韩国国产| 97青娱国产盛宴精品视频| 国产精品自在线| 樱桃视频成人在线观看| 欧美黑人视频一区| 老司机免费在线视频| 亚洲色图50p| 午夜激情小视频| 精品国产伦理网| 精品国产亚洲AV| 欧美日韩国产在线播放网站| 国产黄网在线观看| 欧美日韩激情视频8区| 草视频在线观看| 亚洲日本乱码在线观看| 五月天婷婷丁香网| 国产调教视频一区| 亚洲AV无码国产成人久久| www.性欧美| 99久久久无码国产精品性波多 | 涩涩视频在线| 国内精品久久久久久久久| 在线免费观看的av| 美女性感视频久久久| 国产原创在线观看| 久久九九全国免费精品观看| 欧美精品电影| 精品国产一区av| 成人在线网址| 欧美另类极品videosbest最新版本| 黄a在线观看| 欧美精品免费在线| 暖暖在线中文免费日本| 欧美激情视频一区二区| 天天干在线视频论坛| 欧美人交a欧美精品| 欧美xxxx做受欧美88bbw| 欧美激情视频一区| 热三久草你在线| 欧美一区二区三区免费观看| 欧产日产国产精品视频| 日本高清不卡的在线| 亚洲欧美一区二区三区| 国产精品国内视频| 亚洲精品tv| 97欧洲一区二区精品免费| 亚洲午夜免费| 九色91视频| 精品国产aⅴ| youjizz.com亚洲| 欧美黄污视频| 久草青青在线观看| 奇米色一区二区| 午夜av中文字幕| 国产超碰在线一区| 日韩成人av一区二区| 国产三级欧美三级| 国产精品成人69xxx免费视频 | 日韩 欧美 视频| 亚洲中午字幕| 性生活免费在线观看| 国产成人午夜精品影院观看视频 | 99er热精品视频| 亚洲第一区在线观看| 国产三级在线看| 久久国产精品免费视频| 黄频免费在线观看| 国产免费久久av| 91成人午夜| 视频一区视频二区视频三区视频四区国产| 99热在线成人| 国产性xxxx18免费观看视频| 久久精品99久久久| 久久久久久久无码| 中文字幕一区二区在线播放| 国产一级特黄毛片| 91福利资源站| 成人免费公开视频| 亚洲香蕉成视频在线观看| av免费看在线| 国产精品福利观看| 澳门精品久久国产| 性欧美大战久久久久久久免费观看| 欧美激情第8页| 黑森林精品导航| 成人aa视频在线观看| 中文字幕第69页| 狠狠久久五月精品中文字幕| 99精品在线看| 国产性猛交xxxx免费看久久| 第四色日韩影片| 成人免费在线视频网址| 免费视频亚洲| 精品国产一区三区| 国产一区二区三区免费播放| 在线观看国产精品一区| 亚洲国产综合91精品麻豆| 在线观看免费视频a| 亚洲欧美精品伊人久久| 国产蜜臀av在线播放| 91久久综合亚洲鲁鲁五月天| 国产精品羞羞答答在线观看| 天堂8在线天堂资源bt| 激情综合五月天| 99在线视频免费| 欧美日韩国产精品一区| 精品久久久免费视频| 少妇精69xxtheporn| 亚洲欧洲高清| 精品婷婷色一区二区三区蜜桃| 一区二区三区午夜探花| 亚洲精品20p| 国产女主播视频一区二区| 最新中文字幕一区| 日韩成人久久久| 国产不卡123| 国产精品一区二区三区不卡| 女人色偷偷aa久久天堂| 五月天视频在线观看| 国产精品系列在线| 中文字幕永久免费视频| 亚洲日本成人网| 欧美日韩国产v| 日本10禁啪啪无遮挡免费一区二区| 久久成人在线| 国产三级视频网站| 欧美色另类天堂2015| 午夜小视频免费| 日本精品一区二区三区在线 | 婷婷视频在线播放| 精彩视频一区二区三区| 一级免费黄色录像| 91.com视频| 超碰在线观看免费| wwwxx欧美| 在线成人国产| 午夜男人的天堂| 欧美视频中文在线看| 国际av在线| 国产欧美精品va在线观看| 日韩国产综合| 亚洲第一区第二区第三区| 亚洲乱码日产精品bd| 亚洲国产精彩视频| 国模吧一区二区| 亚洲欧洲色图| 一区二区成人网| 亚洲色图一区二区三区| 国产a级免费视频| 97在线免费观看视频| 米奇777超碰欧美日韩亚洲| 在线观看av日韩| 成人欧美一区二区三区| 成人免费视频国产| 91av免费观看91av精品在线| 精品久久视频| 五月天婷婷在线观看视频| 亚洲综合图片区| 日韩av地址| 成人午夜激情免费视频| 国内揄拍国内精品久久| 无码熟妇人妻av| 欧美日韩国产精品成人| 成人高潮aa毛片免费| 日本一区二区三区免费看| 精品一区二区三区免费观看| 国产在线一二区| 国产亚洲在线播放| 在线综合色站| 国产又大又黄又粗的视频| 亚洲激情五月婷婷| 日本在线视频1区| 91社区国产高清| 新67194成人永久网站| 中文字幕观看av| 亚洲国产99精品国自产| 国内自拍亚洲| 欧美精品自拍视频| 中文字幕不卡在线观看| 欧美特黄一级视频| 国产精品欧美久久久| 亚洲国产专区| 国产免费嫩草影院| 日韩精品免费看| 免费精品一区| 看欧美ab黄色大片视频免费| 亚洲五月六月丁香激情| 在线观看av的网站| 久久精品国产综合精品| 国产一区二区三区四区五区入口| 黄色片网站在线免费观看|