2010-11-16 6 views
7

Estos días, estoy estudiando la prueba unitaria. La prueba casi unitaria utiliza el valor de retorno o el valor de referencia como valor esperado en el caso de prueba. Si no tiene valor de retorno y valor de referencia en la función. ¿Cuál es el valor esperado?Cómo unificar la escritura de la función de prueba a stdout/std :: cout

exsample-

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

Claro, unit_test función es muy simple. Entonces, esta función no parece necesitar una prueba unitaria. Pero, esto es solo muestra. ¿Crees que la función unit_test tiene un efecto secundario?

Gracias, a todos y por favor, entiendan mi inglés tonto.

Respuesta

11

Si está escribiendo una función que sabes debe ser probado, t Cuando debe diseñarlo para que sea comprobable en su marco. Aquí, si su prueba se realiza en un nivel de proceso donde puede verificar la salida del proceso, escribir a std :: cout está bien. De lo contrario, es posible que desee hacer que el flujo de salida de un parámetro a la función, como en:

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

A continuación, puede probarlo como en:

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

Como esto ilustra, la fabricación de software bien probado requiere un poco de dar y recibir ... los requisitos de prueba retroalimentan en el diseño.

EDIT: si tiene que probar las funciones preexistentes sin cambiarlas, y luego considerar:

#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

¿Qué tal assert (oss && oss.str() == "Hola")? – Chubsdad

+0

Estoy de acuerdo con su opinión. Dijiste TDD, ¿de acuerdo? Pero, ya comencé la prueba unitaria. y nuestro programa ya terminó el desarrollo. desafortunadamente nuestro programa no TDD.Por lo tanto, es difícil probar la unidad porque nuestro programa no consideró la prueba unitaria cuando el nivel de diseño. Este problema ataque en mi cabeza !!!! ; (De todos modos, ¡gracias por su respuesta! – cardbt

+0

@Chubsdad: llamada justa, gracias :-). Actualizará. –

0

La prueba de la unidad de una función que devuelve void generalmente implica el envío de entradas y la captura de cualquier excepción que la función pueda arrojar cuando se pasen datos incorrectos. Su función no toma ninguna entrada, por lo que la prueba unitaria parece innecesaria a menos que desee probar condiciones extremas como quedarse sin memoria cuando llame a la función.

+0

gracias por su respuesta. Que tengas un buen día ~ – cardbt

0

En general, no se realizan procedimientos de prueba unitarios (es decir, fragmentos de código como el que se pone que no toma ninguna entrada y no devuelve ningún valor). Para empezar, intente probar algo que sea una función (toma algunos parámetros y devuelve algunos valores).

Es decir, prueba los efectos secundarios: el único efecto secundario de la función que proporcionó es que los caracteres se envían a la consola, algo que probablemente rara vez se pruebe.

Echa un vistazo a este guía:

o esta otra:

+0

¡De nada, me alegra ayudarte! –

Cuestiones relacionadas