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

欧美猛男超大videosgay| 91亚洲精品视频在线观看| 国产精品一区久久久久| 久久久久久久久久久国产| 超碰在线免费av| 大胆av不用播放器在线播放 | 狠狠色丁香婷综合久久| 综合国产在线观看| 男女视频在线看| 91看片在线观看| youjizz久久| 国产精品美女主播| 久久久久无码国产精品不卡| 欧美**字幕| 欧美色图一区二区三区| 欧妇女乱妇女乱视频| 美女毛片在线看| 久热精品在线| 欧美激情va永久在线播放| 亚洲av成人无码久久精品| 综合成人在线| 色婷婷精品大在线视频| 在线免费观看成人| 欧洲一区av| 成人深夜在线观看| 国产精品自产拍在线观看| 中日韩精品视频在线观看| 99久久精品费精品国产| 亚洲欧美激情一区| 日日夜夜精品视频免费观看| 欧美xxx网站| 一区二区三区波多野结衣在线观看 | 麻豆亚洲av熟女国产一区二| 欧美亚洲国产一区| 精品视频久久久久久| 久久国产免费视频| 欧美日韩不卡| 黑人巨大精品欧美一区二区免费| 日本天堂免费a| 思思99re6国产在线播放| 久久亚洲精品小早川怜子| 国产精品久久国产精品| 一级视频在线播放| 日韩精品一卡二卡三卡四卡无卡| 久久久久久久久久国产精品| 成人免费视频国产免费观看| 国产精品成人av| 国产一区二区三区在线观看网站 | 国产一区二区三区四区大秀| 亚洲成人免费在线视频| 自拍偷拍激情视频| 欧美三级网站| 五月综合激情婷婷六月色窝| 欧洲精品在线播放| 羞羞视频在线观看免费| 国产日韩欧美a| 欧美精品v日韩精品v国产精品| 亚洲乱码在线观看| 国产高清成人在线| 国产精品久久久久久久久久99| 国产一级片免费在线观看| 天堂精品中文字幕在线| 91精品国产91久久久久久| 精品成人免费视频| 亚洲狠狠婷婷| 2019中文字幕在线观看| 六月丁香婷婷综合| 视频一区二区三区中文字幕| 日本精品中文字幕| 免费黄色一级大片| 石原莉奈在线亚洲二区| 国产情人节一区| 国产ts人妖调教重口男| 成人午夜电影网站| 免费中文日韩| 91短视频版在线观看www免费| 国产精品乱码久久久久久| 中文字幕一区二区三区精彩视频| 精品国产丝袜高跟鞋| 亚洲精品国产成人久久av盗摄| 蜜臀精品一区二区| 自拍网站在线观看| 欧美三级电影网| 又黄又爽又色的视频| 久久草在线视频| 国产一区二区三区三区在线观看| 四虎精品免费视频| 亚洲久久一区| 国产精品一区二区久久久久| 国产麻豆免费观看| 国产真实乱偷精品视频免| 国产高清在线精品一区二区三区| 亚洲欧美日韩免费| 中文字幕成人在线观看| 奇米777四色影视在线看| 亚洲女同av| 欧美三级中文字幕在线观看| 成年人三级黄色片| 欧美激情久久久久久久久久久| 中文国产成人精品久久一| 午夜69成人做爰视频| 亚洲欧美清纯在线制服| 成人天堂噜噜噜| 欧洲成人一区二区三区| 中文字幕精品综合| 日本大片免费看| 黄色精品视频| 欧美日韩国产首页| 精品夜夜澡人妻无码av| 午夜久久免费观看| 日本精品一区二区三区在线| 亚洲国产精品二区| 中文字幕久久午夜不卡| 久久美女福利视频| 视频一区在线| 中文字幕综合一区| 国产 欧美 日韩 在线| 免费欧美在线视频| 91亚洲国产成人精品性色| 国产一级网站视频在线| 亚洲va在线va天堂| 91 视频免费观看| 精品五月天堂| 欧美乱大交xxxxx| 一级久久久久久久| 久久九九久久九九| www国产精品内射老熟女| 日韩av黄色| 中文字幕精品一区二区精品| 国产精品人人人人| 国产在线日韩欧美| 亚洲精品在线观看免费| 欧美色片在线观看| 日韩成人在线视频观看| 久久精品亚洲无码| 国产一区二区福利视频| 影音先锋欧美在线| abab456成人免费网址| 亚洲人高潮女人毛茸茸| 日韩中文字幕在线观看视频| 91一区在线观看| 无码中文字幕色专区| 日韩亚洲国产免费| 精品国内亚洲在观看18黄| 岳乳丰满一区二区三区| 中文av一区特黄| 污片在线免费看| 国产91精品对白在线播放| 日韩免费精品视频| 免费福利在线观看| 岛国视频午夜一区免费在线观看| 亚洲国产综合视频| 国产农村妇女精品一二区| 久久99导航| 亚洲美女炮图| 国产一区二区精品丝袜| 夜夜骚av一区二区三区| 中文字幕一区二区视频| 日本美女久久久| 我不卡影院28| 91传媒免费看| 97在线超碰| 亚洲男人天堂2023| 亚洲精品中文字幕乱码三区91| 国产麻豆精品一区二区| 亚洲国产精品123| 欧美13videosex性极品| 亚洲免费小视频| 波多野结衣不卡| 中文av一区特黄| 亚洲一区二区福利视频| 欧美jjzz| 精品国产乱码久久久久久88av| 亚洲精品福利电影| 日韩视频中文字幕| 性欧美一区二区三区| 精品国产999| 欧美亚洲色综久久精品国产| 国产一区二区不卡| 91精品国产91久久久久久最新 | 亚洲激情图片一区| 国产一区免费| 亚洲国产果冻传媒av在线观看| 日韩午夜免费视频| 精品国产免费一区二区三区 | 日韩av不卡在线| 色播色播色播色播色播在线| 在线观看精品一区| www深夜成人a√在线| 不卡高清视频专区| 手机在线成人免费视频| 激情久久久久久| 视频一区视频二区视频三区视频四区国产 | 久久亚洲国产精品一区二区| 欧美亚洲免费在线| 精品一区二区三区中文字幕在线| 国产91成人在在线播放| 成人xvideos免费视频| 国产网址在线观看| 91免费国产在线| 中文字幕av专区| 亚洲婷婷免费| 日本一区视频在线观看| 天堂va欧美ⅴa亚洲va一国产| 日本一区二区三区在线播放| 99热国产在线| 伊人久久男人天堂| 蜜桃视频久久一区免费观看入口| 欧美三级视频在线| 久久久久成人网站| 国产欧美日本一区二区三区| 69亚洲乱人伦| 国产一区二区毛片| 99视频在线免费| 欧美fxxxxxx另类| 亚洲一区二区免费视频软件合集| 噜噜噜天天躁狠狠躁夜夜精品 | jizz欧美| 欧洲一区二区视频| 国产在线xxx| 久久综合九色九九| 成人在线观看黄色| 亚洲欧美国产高清va在线播| 男人的天堂a在线| 欧美撒尿777hd撒尿| 免费污污视频在线观看| 亚洲综合色网站| 日韩成人短视频| 中文字幕制服丝袜一区二区三区| 欧美一区二区在线| 国产999精品在线观看| 国产精品第二页| 天堂在线中文网官网| 久久人人看视频| 免费超碰在线| 中文字幕久久久| 国产尤物视频在线| 亚洲欧洲国产一区| 日韩a在线观看| 精品亚洲一区二区三区在线观看| 人妻视频一区二区三区| 日韩一区二区电影网| 国产精品爽爽久久| 91精品国产色综合久久不卡电影| 久久这里只有精品9| 色狠狠色噜噜噜综合网| 无码人妻丰满熟妇区bbbbxxxx| 欧美日韩中文字幕在线| 麻豆久久久久久久久久| 男人添女荫道口女人有什么感觉| 日韩电影免费网址| 日韩av一级大片| 欧美人与动xxxxz0oz| 久久精品国产综合精品| 亚洲人成精品久久久| 久久久久久久久久久久久久一区| swag国产精品一区二区| 国产精品一 二 三| 人人网欧美视频| 欧美美乳视频网站在线观看| 黑人操亚洲人| 一区二区三区四区国产| 一区二区国产在线| 国产 欧美 日韩 一区| 亚洲午夜一区| 成人在线国产视频| 国产精品日本| 无需播放器的av| 国产一二三精品| 欧美一区二区免费在线观看| 久久久久久久电影| 久久久久久久久久97| 亚洲乱码精品一二三四区日韩在线| 麻豆亚洲av成人无码久久精品| 亚洲福利视频一区二区| 中文字幕在线天堂| 欧美日韩dvd在线观看| 丰满人妻一区二区| 亚洲欧美在线免费| 黄色免费网站在线| 欧美激情影音先锋| 日韩欧美一区二区三区免费观看| 国产精欧美一区二区三区| 国产精品va视频| 国产麻豆日韩| 亚洲理论电影| 天堂一区二区三区| 欧美91大片| 国产免费观看高清视频| 三级影片在线观看欧美日韩一区二区| 中文字幕国内自拍| 精品一区二区日韩| av2014天堂网| 18成人在线视频| 91在线视频在线观看| 日韩一区二区在线观看视频播放| 日本午夜在线视频| 九九精品在线视频| 24小时免费看片在线观看| 国产ts一区二区| 日韩中文一区二区| 天天综合狠狠精品| 日韩午夜av在线| 在线观看网站黄| 日本久久久久久久久久| 国产精品久久久久毛片软件| 1级黄色大片儿| 日韩亚洲欧美高清| 97电影在线| 欧洲成人免费视频| 欧美xxxx性| 欧美日韩综合网| 91久久综合| 天天色天天综合网| 不卡的av在线播放| 青青草精品在线视频| 欧美无人高清视频在线观看| 亚洲成人第一区| 一级做a爰片久久毛片美女图片| sm捆绑调教国产免费网站在线观看 | 色婷婷免费视频| 亚洲男人天堂av网| 欧美日韩在线视频播放| 日韩精品视频在线观看免费| 在线三级电影| 亚洲在线观看视频| 99久久夜色精品国产亚洲96| 午夜免费一区二区| 2023国产一二三区日本精品2022| 国产午夜小视频| 欧美日韩亚洲综合在线| 成人福利在线| 国产精品劲爆视频| 天堂网av成人| 国产极品尤物在线| a亚洲天堂av| 亚洲国产精品午夜在线观看| 日韩精品专区在线影院重磅| 麻豆传媒视频在线观看| 国产精品一区二区电影| 日韩av久操| 免费毛片网站在线观看| 国产 日韩 欧美大片| 日韩欧美在线视频播放| 欧美亚洲丝袜传媒另类| 99re在线视频| 国产精品久久久久久久9999| 日韩成人a**站| 亚洲一级片网站| 日韩理论片在线| 国产又粗又黄视频| 欧美成年人视频| 亚洲网一区二区三区| 妞干网在线观看视频| 99久久99精品久久久久久| 人妻 日韩精品 中文字幕| 亚洲欧美成人精品| 欧美天堂一区二区| 色乱码一区二区三区熟女| 久久精品99国产精品| 极品魔鬼身材女神啪啪精品| 欧美天堂亚洲电影院在线播放| 欧美成人精品一区二区男人看| 国产视频观看一区| 欧美片第1页综合| 91精品又粗又猛又爽| 色哟哟国产精品| 青青草在线免费观看| 国产精品亚洲第一区| 91精品啪在线观看国产18| 老熟女高潮一区二区三区| 午夜欧美视频在线观看| 精品国产av鲁一鲁一区| 欧美性受xxx| 欧美丰满老妇| 麻豆精品国产传媒av| 欧美亚洲国产一区在线观看网站| 日本a在线播放| 国产一区二区精品在线| 日韩电影在线一区二区| 国产性xxxx| 亚洲乱亚洲乱妇无码| 中文字幕成人| 亚洲中文字幕无码专区| 成人免费短视频| 欧美日韩在线不卡一区| 亚洲综合电影一区二区三区| 国产三级av在线播放| 日本福利一区二区| 色网站在线看| 99久久精品久久久久久ai换脸| 免费看的黄色欧美网站| 疯狂试爱三2浴室激情视频| 精品亚洲一区二区三区| 九九热这里有精品| 日本福利视频网站| 久久九九国产精品| 囯产精品一品二区三区| 欧洲日韩成人av| 激情欧美国产欧美|