2012-12-25 10 views
8

Mi trovo ad affrontare problemi nella scrittura dei test di unità alle funzioni C che coinvolgono il funzionamento IO. Ad esempio, di seguito è riportato il codice che ho scritto per ottenere una stringa di input dall'utente dalla console. Non so come automatizzare il test dell'input dell'utente usando la funzione getchar().Come testare le funzioni c che coinvolgono IO?

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

È possibile creare uno script di shell per eseguire il programma e confrontare l'output con il contenuto previsto. –

risposta

4

Mock getchar:

  1. Utilizzando preprocessore, per esempio nel tuo file di test.

    #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. simbolo sostitutivo per il linker (più difficile, a mio parere), ad esempio, definire il proprio getchar da qualche parte nei file .c di origine invece di collegamento a uno stdlib (ad esempio MSVCRT sulle finestre)

  3. funzione Modifica in prova per accettare una funzione che restituisce char, la scelta migliore (IMHO) - conflitti con stdlib. E impostare un test passando un oggetto come mock_getchar dal punto nel codice di prova.

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

Per i punti 1 e avrei propongo di usare la propria funzione, invece di getchar (ad es mygetchar) - in questo modo si potrebbe deridere/sostituirlo senza affrontare i conflitti con std include/libs.

+0

Il framework di test dell'unità cmocka supporta gli oggetti mock e mostra come sovrascrivere la funzione originale con le funzioni di simulazione. Fai clic su Ulteriori informazioni su http://cmocka.org/ – asn

Problemi correlati