Modulo [B]asico para prueba [unit]aria de programas:
|
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í:
BUnit
está contenida en el archivo de encabezado BUnit.h
, por lo que para hacer pruebas basta poner esta directiva:BUnit_TEST()
que registra el nombre del archivo FILE
y el renglón LINE
de la prueba.
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".
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()
.TestCase::errorCount()
siempre retorna cero 0
. // Falla vs Error en JUnit public void test_Error() { try { new ArrayList(10).get( 11 ); fail("Error si no tira IndexOutOfBoundsException" ); // error } catch (IndexOutOfBoundsException success) { } // Ok } public void test_Failure() { assertTrue( 1 == 2 ); // falla }
BUnit.h
no se hace diferencia entre "fallas" y "errores".JUnit
un "error" se produce cuando no se levanta la excepción adecuada.JUnit
una "falla" se produce cuando una aserción resulta falsa.assertTrue()
.{{ // test::Allison() // Stack class for letter -- very simple (<em>Last In First Out</em>). // - Throws \c std::logic_error on invalid operations. // - Example inspired in Chuck Allison' work. // - http://search.yahoo.com/search?n=100&p=Simplest+Unit+Test+Allison class Stack { public: enum { N = 5 /* Max Capacity for the stack */ }; // Constructor for a stack that can hold up to \c "Stack::N" values. Stack() : m_top(0) { m_vec[m_top] = 0; } // Stoes a copy of "v" at the top of the stack. void push(const char& v) { if ( m_top != N ) { m_vec[m_top] = v; m_top++; } else { throw std::out_of_range("Stack::push()"); } } // Removes the topmost value from the stack. void pop() { if ( m_top>0 ) { m_top--; } else { throw std::out_of_range("Stack::pop()"); } } // Reference to topmost value in the stack. char& top() { if ( m_top>0 ) { return m_vec[m_top-1]; } else { throw std::out_of_range("Stack::top()"); } } // Number of values stored in the stack. unsigned size() const { return m_top; } private: char m_vec[N+1] ; // Vector to hold stored values. int m_top; // Next available vector entry. }; // Stack class MyTest : public TestCase { public: bool run() { Stack S; // the stack try { // empty stack S.pop(); fail_Msg("! S.pop()"); } catch ( std::out_of_range & ex ) { assertTrue( 0 == strcmp( ex.what() , "Stack::pop()" ) ); // Ok: empty stack } catch (...) { fail_Msg("! ( std::out_of_range & )"); } try { // Pila llena 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()" ) ); // Ok: full stack } catch (...) { fail_Msg("! ( std::out_of_range & )"); } try { // Vacea la pila 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()" ) ); // Ok: empty stack } catch (...) { fail_Msg("! ( std::out_of_range & )"); } return wasSuccessful(); } }; // MyTest MyTest thisTest; thisTest.run(); // 0 failures assertTrue( thisTest.wasSuccessful() ); }}