|
Packit |
8c9aa0 |
#ifndef CPPUNIT_TESTLISTENER_H // -*- C++ -*-
|
|
Packit |
8c9aa0 |
#define CPPUNIT_TESTLISTENER_H
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
#include <cppunit/Portability.h>
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
CPPUNIT_NS_BEGIN
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
class Exception;
|
|
Packit |
8c9aa0 |
class Test;
|
|
Packit |
8c9aa0 |
class TestFailure;
|
|
Packit |
8c9aa0 |
class TestResult;
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
/*! \brief Listener for test progress and result.
|
|
Packit |
8c9aa0 |
* \ingroup TrackingTestExecution
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* Implementing the Observer pattern a TestListener may be registered
|
|
Packit |
8c9aa0 |
* to a TestResult to obtain information on the testing progress. Use
|
|
Packit |
8c9aa0 |
* specialized sub classes of TestListener for text output
|
|
Packit |
8c9aa0 |
* (TextTestProgressListener). Do not use the Listener for the test
|
|
Packit |
8c9aa0 |
* result output, use a subclass of Outputter instead.
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* The test framework distinguishes between failures and errors.
|
|
Packit |
8c9aa0 |
* A failure is anticipated and checked for with assertions. Errors are
|
|
Packit |
8c9aa0 |
* unanticipated problems signified by exceptions that are not generated
|
|
Packit |
8c9aa0 |
* by the framework.
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* Here is an example to track test time:
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* \code
|
|
Packit |
8c9aa0 |
* #include <cppunit/TestListener.h>
|
|
Packit |
8c9aa0 |
* #include <cppunit/Test.h>
|
|
Packit |
8c9aa0 |
* #include <time.h> // for clock()
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* class TimingListener : public CppUnit::TestListener
|
|
Packit |
8c9aa0 |
* {
|
|
Packit |
8c9aa0 |
* public:
|
|
Packit |
8c9aa0 |
* void startTest( CppUnit::Test *test )
|
|
Packit |
8c9aa0 |
* {
|
|
Packit |
8c9aa0 |
* _chronometer.start();
|
|
Packit |
8c9aa0 |
* }
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* void endTest( CppUnit::Test *test )
|
|
Packit |
8c9aa0 |
* {
|
|
Packit |
8c9aa0 |
* _chronometer.end();
|
|
Packit |
8c9aa0 |
* addTest( test, _chronometer.elapsedTime() );
|
|
Packit |
8c9aa0 |
* }
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* // ... (interface to add/read test timing result)
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* private:
|
|
Packit |
8c9aa0 |
* Clock _chronometer;
|
|
Packit |
8c9aa0 |
* };
|
|
Packit |
8c9aa0 |
* \endcode
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* And another example that track failure/success at test suite level and captures
|
|
Packit |
8c9aa0 |
* the TestPath of each suite:
|
|
Packit |
8c9aa0 |
* \code
|
|
Packit |
8c9aa0 |
* class SuiteTracker : public CppUnit::TestListener
|
|
Packit |
8c9aa0 |
* {
|
|
Packit |
8c9aa0 |
* public:
|
|
Packit |
8c9aa0 |
* void startSuite( CppUnit::Test *suite )
|
|
Packit |
8c9aa0 |
* {
|
|
Packit |
8c9aa0 |
* m_currentPath.add( suite );
|
|
Packit |
8c9aa0 |
* }
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* void addFailure( const TestFailure &failure )
|
|
Packit |
8c9aa0 |
* {
|
|
Packit |
8c9aa0 |
* m_suiteFailure.top() = false;
|
|
Packit |
8c9aa0 |
* }
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* void endSuite( CppUnit::Test *suite )
|
|
Packit |
8c9aa0 |
* {
|
|
Packit |
8c9aa0 |
* m_suiteStatus.insert( std::make_pair( suite, m_suiteFailure.top() ) );
|
|
Packit |
8c9aa0 |
* m_suitePaths.insert( std::make_pair( suite, m_currentPath ) );
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* m_currentPath.up();
|
|
Packit |
8c9aa0 |
* m_suiteFailure.pop();
|
|
Packit |
8c9aa0 |
* }
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* private:
|
|
Packit |
8c9aa0 |
* std::stack<bool> m_suiteFailure;
|
|
Packit |
8c9aa0 |
* CppUnit::TestPath m_currentPath;
|
|
Packit |
8c9aa0 |
* std::map<CppUnit::Test *, bool> m_suiteStatus;
|
|
Packit |
8c9aa0 |
* std::map<CppUnit::Test *, CppUnit::TestPath> m_suitePaths;
|
|
Packit |
8c9aa0 |
* };
|
|
Packit |
8c9aa0 |
* \endcode
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* \see TestResult
|
|
Packit |
8c9aa0 |
*/
|
|
Packit |
8c9aa0 |
class CPPUNIT_API TestListener
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
public:
|
|
Packit |
8c9aa0 |
virtual ~TestListener() {}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
/// Called when just before a TestCase is run.
|
|
Packit |
8c9aa0 |
virtual void startTest( Test * /*test*/ ) {}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
/*! \brief Called when a failure occurs while running a test.
|
|
Packit |
8c9aa0 |
* \see TestFailure.
|
|
Packit |
8c9aa0 |
* \warning \a failure is a temporary object that is destroyed after the
|
|
Packit |
8c9aa0 |
* method call. Use TestFailure::clone() to create a duplicate.
|
|
Packit |
8c9aa0 |
*/
|
|
Packit |
8c9aa0 |
virtual void addFailure( const TestFailure & /*failure*/ ) {}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
/// Called just after a TestCase was run (even if a failure occured).
|
|
Packit |
8c9aa0 |
virtual void endTest( Test * /*test*/ ) {}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
/*! \brief Called by a TestComposite just before running its child tests.
|
|
Packit |
8c9aa0 |
*/
|
|
Packit |
8c9aa0 |
virtual void startSuite( Test * /*suite*/ ) {}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
/*! \brief Called by a TestComposite after running its child tests.
|
|
Packit |
8c9aa0 |
*/
|
|
Packit |
8c9aa0 |
virtual void endSuite( Test * /*suite*/ ) {}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
/*! \brief Called by a TestRunner before running the test.
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* You can use this to do some global initialisation. A listener
|
|
Packit |
8c9aa0 |
* could also use to output a 'prolog' to the test run.
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* \param test Test that is going to be run.
|
|
Packit |
8c9aa0 |
* \param eventManager Event manager used for the test run.
|
|
Packit |
8c9aa0 |
*/
|
|
Packit |
8c9aa0 |
virtual void startTestRun( Test * /*test*/,
|
|
Packit |
8c9aa0 |
TestResult * /*eventManager*/ ) {}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
/*! \brief Called by a TestRunner after running the test.
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* TextTestProgressListener use this to emit a line break. You can also use this
|
|
Packit |
8c9aa0 |
* to do some global uninitialisation.
|
|
Packit |
8c9aa0 |
*
|
|
Packit |
8c9aa0 |
* \param test Test that was run.
|
|
Packit |
8c9aa0 |
* \param eventManager Event manager used for the test run.
|
|
Packit |
8c9aa0 |
*/
|
|
Packit |
8c9aa0 |
virtual void endTestRun( Test * /*test*/,
|
|
Packit |
8c9aa0 |
TestResult * /*eventManager*/ ) {}
|
|
Packit |
8c9aa0 |
};
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
CPPUNIT_NS_END
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
#endif // CPPUNIT_TESTLISTENER_H
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|