2012-12-25 4 views
8

Ich habe Probleme beim Schreiben von Komponententests auf C-Funktionen, die den IO-Betrieb betreffen. Zum Beispiel ist unten der Code, den ich geschrieben habe, um eine Eingabezeichenfolge vom Benutzer von der Konsole zu erhalten. Ich weiß nicht, wie man Benutzereingaben mit getchar() automatisiert testet.Wie testet man die c-Funktionen mit 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

Sie könnten ein Shell-Skript erstellen, um Ihr Programm auszuführen und seine Ausgabe mit einem erwarteten Inhalt zu vergleichen. –

Antwort

4

Mock getchar:

  1. Verwendung Präprozessor, z.B. in Ihrer Testdatei.

    #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. Ersatzsymbol für den Linker (härter, meiner Meinung nach), z.B. definieren Sie Ihre eigenen getchar irgendwo in Ihrer Quelle .c Dateien statt (zB msvcrt auf Windows) auf einen stdlib Verknüpfung

  3. Änderungsfunktion im Test eine Funktion zu übernehmen char Rückkehr beste Wahl (IMHO) - keine Konflikte mit stdlib. Und richten Sie einen Test ein, indem Sie ein Ding wie mock_getchar von Punkt in Prüfcode übergeben.

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

Für Punkte und Ich schlage vor, würde eine eigene Funktion zu verwenden, anstatt getchar (zB mygetchar) - auf diese Weise Sie verspotten könnte/ersetzen es ohne Konflikte mit std zugewandt enthält/libs.

+0

Das Framework zum Testen von Cmocka-Einheiten bietet Unterstützung für Mock-Objekte und zeigt, wie die ursprüngliche Funktion mit den Mock-Funktionen überschrieben wird. Klicken Sie auf Weitere Informationen auf http://cmocka.org/ – asn