Modulo [B]asico para prueba [unit]aria de programas: Documentación
El archivo de encabezado
BUnit.h apoya la escritura de módulos de prueba de unitaria programas. El modelo que se usa para esta implementación es similar al expuesto en este artículo "The Simplest Automated Unit Test Framework That Could Possibly Work" de Chuck Allison, que se puede obtener aquí:
- Para simplificar al mínimo la tarea de programar los casos de prueba, la implementación completa de
BUnit está contenida en el archivo de encabezado BUnit.h, por lo que para hacer pruebas basta poner esta directiva:
- Este marco de pruebas es similar a JUnit, pues se presume que en el futuro los estudiantes usarán Java como su lenguaje principal para desarrollo de programas (pues usan C++ sólo para adiestrarse profundamente en técnicas de programación).
- Ver también:
- http://search.yahoo.com/search?n=100&p=JUnit+Java
- Como el lenguaje C++ no tiene un mecanismo similar al de "reflexión" de Java, en cada prueba fallida se registra la condición de prueba exacta, obtenida a través de una invocación de la macro
BUnit_TEST() que registra el nombre del archivo __FILE__ y el renglón __LINE__ de la prueba. - Ver también:
- http://search.yahoo.com/search?n=100&p=reflection+Java
- En JUnit la clase
TestCase es una subclase de Assert; en BUnit no existe la clase Assert pero para mantener compatibilidad con JUnit sí se provée funcionalidad similar usando macros cuyos nombres comienzan con "assert". - Ver también:
- http://search.yahoo.com/search?n=100&p=JUnit+Java+Assert+method
- Para simplificar este marco de pruebas no se usa la clase
TestResult que sirve para acumular resultados de las pruebas. En su lugar, se puede obtener una hilera enorme std::string que contiene el registro de todas las pruebas que no tuvieron éxito invocando el método TestCase::toString() o TestCase::toXML(). - Para simplificar esta plataforma de pruebas no se hace diferencia entre un caso de prueba de prueba no existoso y uno que no tiene éxito porque no se ha levantado la excepción adecuada. Esto contrasta con JUnit, que llama "error" a un caso de prueba que ha levantado la excepción equivocada. Por eso
TestCase::errorCount() siempre retorna cero 0.
public void test_Error() {
try {
new ArrayList(10).get( 11 );
fail("Error si no tira IndexOutOfBoundsException" );
}
catch (IndexOutOfBoundsException success) { }
}
public void test_Failure() {
assertTrue( 1 == 2 );
}
- En
BUnit.h no se hace diferencia entre "fallas" y "errores".
- In JUnit, ¿cuál es la diferencia entre fallas y errores?
- Las aseveraciones son usadas para verificar si existen fallas, y por eso las fallas son previstas con invocaciones similares a
assertTrue(). - Los errores son problemas no previstos que resultan de excepciones no captadas por los método de prueba JUnit.
- Ver también:
- http://www.cs.waikato.ac.nz/~bernhard/314/junit3.8.1/doc/faq/faq.htm#tests_9
- Ver también:
- http://www.cs.wm.edu/~noonan/junit/doc/faq/faq.htm#tests_9
{{
class Stack {
public:
enum { N = 5 };
Stack() : m_top(0) { m_vec[m_top] = 0; }
void push(const char& v) {
if ( m_top != N ) { m_vec[m_top] = v; m_top++; }
else { throw std::out_of_range("Stack::push()"); }
}
void pop() {
if ( m_top>0 ) { m_top--; }
else { throw std::out_of_range("Stack::pop()"); }
}
char& top() {
if ( m_top>0 ) { return m_vec[m_top-1]; }
else { throw std::out_of_range("Stack::top()"); }
}
unsigned size() const { return m_top; }
private:
char m_vec[N+1] ;
int m_top;
};
class MyTest : public TestCase {
public:
bool run() {
Stack S;
try {
S.pop();
fail_Msg("! S.pop()");
}
catch ( std::out_of_range & ex ) {
assertTrue( 0 == strcmp( ex.what() , "Stack::pop()" ) );
}
catch (...) {
fail_Msg("! ( std::out_of_range & )");
}
try {
for (int i=0; true; ++i) {
S.push('0'+i);
assertTrue( S.top() == '0'+i );
}
fail_Msg("! S.push()");
}
catch ( std::out_of_range & ex ) {
assertTrue( 0 == strcmp( ex.what() , "Stack::push()" ) );
}
catch (...) {
fail_Msg("! ( std::out_of_range & )");
}
try {
for (int i=Stack::N-1; true; --i) {
assertTrue( S.top() == '0'+i );
S.pop();
}
fail_Msg("! S.pop()");
}
catch ( std::out_of_range & ex ) {
assertTrue( 0 == strcmp( ex.what() , "Stack::top()" ) );
}
catch (...) {
fail_Msg("! ( std::out_of_range & )");
}
return wasSuccessful();
}
};
MyTest thisTest;
thisTest.run();
assertTrue( thisTest.wasSuccessful() );
}}
- Ver también:
- test_BUnit::test_Allison()