2012-12-25 126 views
8

我面臨將單元測試寫入涉及IO操作的C函數的問題。例如,下面是我寫的從控制檯獲取用戶輸入字符串的代碼。我不知道如何使用getchar()函數自動測試用戶輸入。如何對涉及IO的c函數進行單元測試?

char * GetStringFromConsole() 
{ 

    char *strToReturn = NULL; 
    int len = 128; 

    strToReturn = (char*)malloc(len); 
    if (strToReturn) 
    { 
     int ch; 
     char *ptr = strToReturn; 
     int counter = 0; 
     for (; ;) 
     { 
      ch = getchar(); 
      counter++; 

      if (counter == len) 
      { 
       strToReturn = realloc(strToReturn, len*=2); 
       ptr = strToReturn + counter-1; 
      } 

      if ((ch != EOF) && (ch != '\n') && (counter < len)) 
      { 
       *ptr++ = ch; 
      } 
      else 
      { 
       break; 
      } 

     } 
     *ptr = '\0'; 
    } 
    return strToReturn; 
} 
+3

您可以創建一個shell腳本來運行您的程序並將其輸出與某些預期內容進行比較。 –

回答

4

莫克getchar

  1. 利用預處理器,例如在你的測試文件中。鏈接器(硬,在我的意見),例如

    #define getchar mock_getchar 
    #include "GetStringFromConsole.h" 
    ... 
    const char* mock_getchar_data_ptr; 
    char mock_getchar() 
    { 
        return *mock_getchar_data_ptr++; 
    } 
    ... 
    // in test function 
    mock_getchar_data_ptr = "hello!\n"; 
    YourAssertEquals("hello", GetStringFromConsole()); 
    
  2. 替補的符號定義你自己的getchar某處源.c文件,而不是鏈接到STDLIB(如MSVCRT在Windows上)

  3. 下測試修改函數接受一個函數返回char,最佳選擇(恕我直言) - 沒有與衝突stdlib。並且通過在測試代碼中傳遞來自點的mock_getchar這樣的東西來設置測試。

    typedef char (*getchartype)(); 
    char * GetStringFromConsole(getchartype mygetchar) 
    { 
        ... 
        c = mygetchar() 
    

對於點和我會建議使用自己的功能,而不是getchar(如mygetchar) - 這種方式,你可以嘲笑/替代它沒有衝突性病面臨包括/庫。

+0

cmocka單元測試框架支持模擬對象並顯示如何用模擬函數覆蓋原始函數。點擊http://cmocka.org/上的瞭解更多信息 – asn

相關問題