|
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() );
}}
1.8.0