[B]asic module for [unit] program testing:
|
Every test case is an instance derived from this abstract class. More...
#include <BUnit.h>
Public Member Functions | |
TestCase (const char *name=0) | |
Constructor. | |
virtual | ~TestCase () |
Destructor. | |
virtual bool | run ()=0 |
[virtual] ==> Executes test and returns "false" if not successful. | |
void | runBare () |
Excecutes the test run setUp(); run(); tearDown(); . | |
bool | Run () |
Synonym for run() . | |
bool | runTest () |
Synonym for run() . | |
virtual void | setUp () |
Sets the environment for the test run. | |
virtual void | tearDown () |
Destroys the test environment. | |
int | countTestCases () const |
1 == Number of test cases. | |
int | runCount () const |
Number of test runs. | |
virtual int | failureCount () const |
Number of test runs that failed. | |
int | errorCount () const |
Always returns 0 (cero): "Number of errors". | |
virtual int | successCount () const |
Number of successful test runs. | |
bool | wasSuccessful () const |
Returns "true" when all test runs where successful. | |
virtual void | reset () |
Discards all test runs. | |
std::string | getName () const |
Gets the test case name. | |
void | setName (const char *name=0) |
Sets the test case name to "name" . | |
virtual const std::string | toString () const |
Huuuge string that holds a copy of non successfull test, separated by "\n" . | |
virtual const std::string | summary () const |
Returns a string with the name, number of successes and failures. | |
virtual const std::string | toXML () const |
XML string that holds a copy of all unsuccessful tests. | |
const std::string | report () const |
Returns string summary() followed by toString() . | |
const std::string | failureString () const |
Synonym for toString() . | |
Static Public Member Functions | |
template<class T > | |
static std::string | toString (const T &val) |
Returns a std::string constructed form value val . | |
Protected Member Functions | |
void | recordSuccess () |
Records the test run as a success. | |
void | recordFailure (const char *label, const char *fname, int lineno, bool must_copy=false) |
Records that the test run did not succeed. | |
void | recordFailure (const std::string &label, const char *fname, int lineno) |
Records that the test did not succeed. | |
void | testThis (bool cond, const char *label, const char *fname, long lineno, bool must_copy=false) |
Executes the test and records its result. | |
void | testThis (bool cond, const std::string &label, const char *fname, long lineno) |
Synonym for testThis() . | |
int | nPass () const |
Synonym for successCount() [OBSOLETE]. | |
int | nError () const |
Synonym for failureCount() [OBSOLETE]. | |
Protected Attributes | |
int | m_pass |
Number of successful tests. | |
int | m_failure |
Number of test that produced failed. | |
const char * | m_name |
Test case name. | |
bool | m_test_suite_destroy |
Holds "true" if the test case is stored in dynamic memory. | |
std::list< TestCaseFailure > | m_failureList |
Container where test cases that produced failures are stored. | |
Private Member Functions | |
virtual bool | iAmTestSuite () const |
Returns false for TestCase . | |
TestCase (const TestCase &) | |
This "private" declaration forbids test case copying. | |
TestCase & | operator= (const TestCase &) |
This "private" declaration forbids test case copying. | |
Friends | |
class | TestSuite |
Colección de pruebas. | |
class | test_BUnit |
Test case class for BUnit.h . | |
template<class TestCase > | |
void | do_toXML (const TestCase *tc, std::basic_ostringstream< char > &ost) |
Adds to ost the string of al unsuccessful test from *tc in XML format. | |
template<class TestCase > | |
void | do_toString (const TestCase *tc, std::basic_ostringstream< char > &ost) |
Adds to ost the string of al unsuccessful test from *tc . |
Every test case is an instance derived from this abstract class.
TestCase::run()
. TestCase::TestCase | ( | const char * | name = 0 | ) | [inline] |
Constructor.
If no name is given to this constructor in "name"
, later the name will be obtained invoking typeid(*this).name()
.
{{ // test::constructor() test_BUnit thisTest; assertTrue( string::npos != thisTest.getName().find( "test_BUnit" ) ); assertTrue( thisTest.failureCount() == 0 ); assertTrue( thisTest.countTestCases() == 1 ); assertTrue( thisTest.successCount() == 0 ); assertTrue( thisTest.runCount() == 0 ); assertTrue( thisTest.failureString() == "" ); }}
TestCase::~TestCase | ( | ) | [inline, virtual] |
TestCase::TestCase | ( | const TestCase & | ) | [private] |
This "private"
declaration forbids test case copying.
bool TestCase::run | ( | ) | [pure virtual] |
[virtual] ==> Executes test and returns "false"
if not successful.
[***] It is always mandatory to redefine method run()
.
Implemented in TestSuite< TestCase >, test_rational< INT >, ADH::test_Graph, test1, test_BUnit, and test0.
void TestCase::runBare | ( | ) | [inline] |
Excecutes the test run setUp(); run(); tearDown();
.
run()
, this method will setup the environment for the test run invoking setUp()
and tearDown()
before and after the test. {{ // test::run() class MyTest : public TestCase { int m_val; public: MyTest() : m_val(0) {} // init: m_val == 0; void setUp() { m_val = 1; } void tearDown() { m_val = 2; } bool run() { assertTrue( m_val == 1 ); return wasSuccessful(); } }; // MyTest TestSuite<TestCase> SSS; SSS.addTest( new MyTest ); SSS.addTest( new MyTest ); assertTrue( 2 == SSS.countTestCases() ); assertTrue( "" == SSS.failureString() ); SSS.runBare(); // Ok ==> setUp() sets [m_val == 1] assertTrue( "" == SSS.toXML() ); SSS.run(); // Failure: [m_val == 2] ==> value set by tearDown() std::string sssXML = SSS.toXML(); assertTrue( "" != sssXML ); // SSS contains failures. assertTrue( sssXML.find("m_val") != string::npos ); assertTrue( SSS.runCount() == 2+2 ); }}
Reimplemented in TestSuite< TestCase >.
bool TestCase::Run | ( | ) | [inline] |
bool TestCase::runTest | ( | ) | [inline] |
void TestCase::setUp | ( | ) | [inline, virtual] |
Sets the environment for the test run.
TestCase::run()
is an abstract method, to facilitate programming it is usual for the programmer not to invoke TestCase::setUp()
and TestCase::tearDown()
because it is easier to have TestSuite<TestCase>::runBare()
do it.TestCase::runBare()
, method TestCase::run()
will not establish the test environment because it does not invoke neither TestCase::setUp()
before the test run nor TestCase::tearDown()
after the test run.TestSuite<TestCase>::runBare()
invokes methods TestCase::setUp()
and TestCase::tearDown()
when the test run is executed.TestSuite
and execute all of them invoking TestSuite<TestCase>::runBare()
. Reimplemented in test_rational< INT >, ADH::test_Graph, and test1.
void TestCase::tearDown | ( | ) | [inline, virtual] |
int TestCase::countTestCases | ( | ) | const [inline] |
1 == Number of test cases.
The value returned always is one 1
because class TestCase
represents a single test case. For the container TestSuite<>
the value returned can be bigger than 1
.
TestCase
."assert()"
macro, as assertTrue()
, fail_Msg()
, assertEquals_Delta()
, or others like BUnit_SUCCESS()
or BUnit_TEST()
.TestSuite<>
. Reimplemented in TestSuite< TestCase >.
int TestCase::runCount | ( | ) | const [inline] |
Number of test runs.
successCount()+failureCount()+errorCount()
. int TestCase::failureCount | ( | ) | const [inline, virtual] |
int TestCase::errorCount | ( | ) | const [inline] |
Always returns 0
(cero): "Number of errors".
int TestCase::successCount | ( | ) | const [inline, virtual] |
bool TestCase::wasSuccessful | ( | ) | const [inline] |
Returns "true"
when all test runs where successful.
(successCount() == runCount())
void TestCase::reset | ( | ) | [inline, virtual] |
Discards all test runs.
{{ // test::reset() class MyTest : public TestCase { public: bool run() { assertTrue( 1 == 2 ); // Failure !!! assertTrue( 1 == 1 ); // Ok assertTrue( 2 == 2 ); // Ok return wasSuccessful(); } }; // MyTest MyTest thisTest; for ( int i=0; i<11; ++i ) { thisTest.run(); // runs the same test 11 times } assertTrue( 11 == thisTest.failureCount() ); // ( 1 == 2 ) x 11 assertTrue( 22 == thisTest.successCount() ); // ( 1 == 1 ) && ( 2 == 2 ) assertTrue( 33 == thisTest.runCount() ); // 33 == 11+22 assertTrue( "" != thisTest.failureString() ); // 11 recorded failures std::string remember = thisTest.getName(); thisTest.reset(); // Anula los contadores assertTrue( 0 == thisTest.failureCount() ); assertTrue( 0 == thisTest.successCount() ); assertTrue( 0 == thisTest.runCount() ); assertTrue( "" == thisTest.failureString() ); assertTrue( remember == thisTest.getName() ); // reset() won´t change the name }}
Reimplemented in TestSuite< TestCase >.
std::string TestCase::getName | ( | ) | const [inline] |
void TestCase::setName | ( | const char * | name = 0 | ) | [inline] |
Sets the test case name to "name"
.
"name"
is a null string or pointer, later typeid(*this).name()
will be invoked to get the test´s name. {{ // test::setName() class MyTest : public TestCase { public: bool run() { assertTrue( 2 == 2 ); return wasSuccessful(); } }; // MyTest MyTest thisTest; assertTrue( "chorlito" != thisTest.getName() ); thisTest.setName( "chorlito" ); assertTrue( "chorlito" == thisTest.getName() ); { // thisTest.setName( std::string("chorlito") ); // won´t compile thisTest.setName( std::string("chorlito").c_str() ); // bad practice std::string V("boom!"); assertTrue( 0==strcmp( V.c_str() , "boom!") ); assertTrue( "chorlito" != thisTest.getName() ); // c_str() uses assertTrue( "boom!" == thisTest.getName() ); // static data } }}
const std::string TestCase::toString | ( | ) | const [inline, virtual] |
Huuuge string that holds a copy of non successfull test, separated by "\n"
.
=_fail: 1 == 0 =/ (125) X:/DIR/SubDir/test_BUnit.cpp =_fail: 4 == 0 =/ (128) X:/DIR/SubDir/test_BUnit.cpp
Reimplemented in TestSuite< TestCase >.
const std::string TestCase::summary | ( | ) | const [inline, virtual] |
Returns a string with the name, number of successes and failures.
Reimplemented in TestSuite< TestCase >.
const std::string TestCase::toXML | ( | ) | const [inline, virtual] |
XML string that holds a copy of all unsuccessful tests.
<fail file="X:/DIR/SubDir/test_BUnit.cpp" line="125" message="1 == 0"/> <fail file="X:/DIR/SubDir/test_BUnit.cpp" line="128" message="4 == 0"/>
Reimplemented in TestSuite< TestCase >.
const std::string TestCase::report | ( | ) | const [inline] |
Returns string summary()
followed by toString()
.
const std::string TestCase::failureString | ( | ) | const [inline] |
Synonym for toString()
.
std::string TestCase::toString | ( | const T & | val | ) | [static] |
Returns a std::string
constructed form value val
.
toString()
with standard C++ void TestCase::recordSuccess | ( | ) | [inline, protected] |
void TestCase::recordFailure | ( | const char * | label, |
const char * | fname, | ||
int | lineno, | ||
bool | must_copy = false |
||
) | [inline, protected] |
Records that the test run did not succeed.
"fname"
and "lineno"
indicate the file and line where the test run is executed."fname"
and "lineno"
are usuallly obtained invoking global macros "__FILE__"
and "__LINE__"
."must_copy"
forces a copy of string label to be created in dynamic memory. This dynamic memory will be destroyed when the test case gets destroyed or when method TestCase::reset()
gets invoked."label"
is a constant string generated by the preprocessor macro using #cond
; this string constant is not stored in dynamic memory and it must not be destroyed.This method is invoked using macro BUnit_FAILURE()
.
void TestCase::recordFailure | ( | const std::string & | label, |
const char * | fname, | ||
int | lineno | ||
) | [inline, protected] |
void TestCase::testThis | ( | bool | cond, |
const char * | label, | ||
const char * | fname, | ||
long | lineno, | ||
bool | must_copy = false |
||
) | [inline, protected] |
Executes the test and records its result.
successCount()
.toString()
this fact."cond"
."fname"
and "lineno"
show the file and line of the executed test."fname"
and "lineno"
are values obtained with global macros "__FILE__"
and "__LINE__"
."must_copy"
indicates whether it is necessary to make a copy of string "label"
; this copy will be destroyed when the record of not successful test is deleted."label"
is a constant genertated by the preprocessor when using macro #cond
its memory must not be returned. This method is invoked using macro BUnit_TEST()
. {{ // test::testThis() class MyTest : public TestCase { public: bool run() { bool dont_copy = false; testThis( 2 == 2, "2 is 2", __FILE__, __LINE__, dont_copy ); // Ok testThis( 1 == 2, "1 is 2", __FILE__, __LINE__, dont_copy ); // failure #1 testThis( 2 == 1, "2 is 1", __FILE__, __LINE__, dont_copy ); // failure #2 return wasSuccessful(); } }; // MyTest MyTest thisTest; assertTrue( thisTest.wasSuccessful() ); // run() has not been executed thisTest.run(); // 2 failures assertTrue( thisTest.failureCount() == 2 ); assertTrue( ! thisTest.wasSuccessful() ); }}
void TestCase::testThis | ( | bool | cond, |
const std::string & | label, | ||
const char * | fname, | ||
long | lineno | ||
) | [inline, protected] |
Synonym for testThis()
.
int TestCase::nPass | ( | ) | const [inline, protected] |
int TestCase::nError | ( | ) | const [inline, protected] |
bool TestCase::iAmTestSuite | ( | ) | const [inline, private, virtual] |
Returns false
for TestCase
.
Reimplemented in TestSuite< TestCase >.
This "private"
declaration forbids test case copying.
friend class test_BUnit [friend] |
void do_toString | ( | const TestCase * | tc, |
std::basic_ostringstream< char > & | ost | ||
) | [friend] |
int TestCase::m_pass [protected] |
int TestCase::m_failure [protected] |
const char * TestCase::m_name [protected] |
bool TestCase::m_test_suite_destroy [protected] |
std::list< TestCaseFailure > TestCase::m_failureList [protected] |