3.2.3. Suites de test

Los proyectos reales contienen normalmente muchas clases, por lo tanto necesita un modo para agrupar pruebas para que pueda simplemente pulsar un solo botón para probar el proyecto entero.[28] La clase Suite recoge pruebas en una unidad funcional. Añada objetos Test a Suite con la función addTest( ), o puede incluir una suite existente entera con addSuite( ). Para ilustrar, el siguiente ejemplo reúna los programas del Capítulo 3 que usa la clase Test en una sola suite. Fíjese que este fichero aparecerá en el subdirectorio del Capítulo 3:

//: C03:StringSuite.cpp
//{L} ../TestSuite/Test ../TestSuite/Suite
//{L} TrimTest
// Illustrates a test suite for code from Chapter 3
#include <iostream>
#include "../TestSuite/Suite.h"
#include "StringStorage.h"
#include "Sieve.h"
#include "Find.h"
#include "Rparse.h"
#include "TrimTest.h"
#include "CompStr.h"
using namespace std;
using namespace TestSuite;

int main() {
    Suite suite("String Tests");
    suite.addTest(new StringStorageTest);
    suite.addTest(new SieveTest);
    suite.addTest(new FindTest);
    suite.addTest(new RparseTest);
    suite.addTest(new TrimTest);
    suite.addTest(new CompStrTest);
    suite.run();
    long nFail = suite.report();
    suite.free();
    return nFail;
}
/* Output:
s1 = 62345
s2 = 12345
Suite "String Tests"
====================
Test "StringStorageTest":
   Passed: 2   Failed: 0
Test "SieveTest":
   Passed: 50  Failed: 0
Test "FindTest":
   Passed: 9   Failed: 0
Test "RparseTest":
   Passed: 8   Failed: 0
Test "TrimTest":
   Passed: 11  Failed: 0
Test "CompStrTest":
   Passed: 8   Failed: 0
*/ ///:~

Listado 3.7. C03/StringSuite.cpp


5 de los tests de más arriba están completamente contenidos en los ficheros de cabecera. TrimTest no lo está, porque contiene datos estáticos que deben estar definidos en un fichero de implementación. Las dos primeras líneas de salida son trazos de la prueba StringStorage. Debe dar a la suite un nombre como argumento del constructor. La función Suite::run( ) llama a Test::run( ) po cada una de las pruebas que tiene. Más de lo mismo pasa con Suite::report( ), excepto que puede enviar los informes de pruebas individuales a cadenas destinaciones diferentes mejor que el informe de la suite. Si la prueba pasa a addSuite( ) ya tiene un puntero de cadena asignado, que lo guarda. En otro caso, obtiene su cadena del objeto Suite. (Como con Test, hay un segundo argumento opcional para el constructor suite que no se presenta a std::cout.) El destructor para Suite no borra automáticamente los punteros contenidos en Test porque no necesitan residir en la pila; este es el trabajo de Suite::free( ).