2010-11-16 6 views
7

In diesen Tagen studiere ich Einheitstest. Fast Einheit Test Verwendung Rückgabewert oder Referenzwert als Erwartungswert im Testfall. Wenn es keinen Rückgabewert und Referenzwert in Funktion hat. Was ist der erwartete Wert?Wie Einheit Testfunktion schreiben auf stdout/std :: cout

exsample-

void unit_test() 
{ 
    cout << "Hello" << endl; 
} 

Sicher, unit_test Funktion sehr einfach. Also, diese Funktion scheint nicht zu Unit-Test zu müssen. Aber, das ist nur ein Beispiel. Glaubst du, unit_test Funktion hat einen Nebeneffekt.

Vielen Dank, alle und bitte verstehen, mein Narr Englisch.

Antwort

11

Wenn Sie eine Funktion schreiben, die Sie kennen sollte getestet werden, t Sie sollten es so gestalten, dass es in Ihrem Framework testbar ist. Wenn Ihre Tests auf Prozessebene durchgeführt werden, auf denen Sie die Prozessausgabe überprüfen können, ist das Schreiben in std :: cout hier in Ordnung. Ansonsten können Sie die Ausgabe an die Funktion einen Parameter machen streamen, wie in:

void unit_test(std::ostream& os = std::cout) 
{ 
    os << "Hello" << endl; 
} 

Dann können Sie es wie im Test:

std::ostringstream oss; 
unit_test(oss); 
assert(oss && oss.str() == "Hello"); 

Wie dies zeigt, was gut getestete Software erfordert ein bisschen Geben und Nehmen ... Testanforderungen fließen zurück in Design.

EDIT: Wenn Sie bereits vorhandenen Funktionen, ohne sie zu verändern testen müssen, dann betrachten:

#include <sstream> 
#include <iostream> 

void f() 
{ 
    std::cout << "hello world\n"; 
} 

int main() 
{ 
    std::ostringstream oss; 
    std::streambuf* p_cout_streambuf = std::cout.rdbuf(); 
    std::cout.rdbuf(oss.rdbuf()); 

    f(); 

    std::cout.rdbuf(p_cout_streambuf); // restore 

    // test your oss content... 
    assert(oss && oss.str() == "hello world\n"; 
    std::cout << oss.str(); 
} 
+0

Wie wäre es mit Assert (oss && oss.str() == "Hallo")? – Chubsdad

+0

Ich stimme Ihrer Meinung zu. Sie sagten TDD, alles klar? Aber ich habe schon einen Komponententest gestartet. und unser Programm hat die Entwicklung abgeschlossen. Leider hat unser Programm kein TDD.Es ist daher schwierig, einen Einheitentest durchzuführen, da unser Programm den Komponententest nicht berücksichtigt hat, als das Designniveau erreicht wurde. Dieses Problem Angriff in meinem Kopf !!!! (Wie auch immer, vielen Dank für Ihre Antwort! – cardbt

+0

@Chubsdad: fairer Anruf, danke :-). Werde Dich auf dem Laufenden halten. –

0

Das Gerät, das eine Funktion testet, die void zurückgibt, beinhaltet normalerweise das Senden von Eingaben und das Abfangen von Ausnahmen, die die Funktion auslösen kann, wenn ungültige Daten übergeben werden. Ihre Funktion nimmt keine Eingaben vor, daher scheint das Testen der Einheit unnötig zu sein, es sei denn, Sie möchten extreme Bedingungen testen, wie zum Beispiel, dass Sie beim Aufruf der Funktion keinen Speicher mehr haben.

+0

Dank für Ihre Antwort danken. Einen schönen Tag ~ – cardbt

0

Im Allgemeinen werden keine Testverfahren (d. H. Teile von Code wie dem, den Sie eingeben, der keine Eingaben erhält und keine Werte zurückgibt), unit. Versuchen Sie zunächst, etwas zu testen, das eine Funktion ist (nimmt einige Parameter und gibt einige Werte zurück).

Das heißt, Sie testen Nebenwirkungen - der einzige Nebeneffekt der von Ihnen bereitgestellten Funktion ist die Ausgabe der Zeichen an die Konsole, etwas, das wahrscheinlich nur selten getestet wird.

in diesem Primer Werfen Sie einen Blick:

oder diese:

+0

Sie sind herzlich willkommen, froh zu helfen! –