When I was getting started using CppUnit on Linux, the tutorials were
great--except that their code didn't compile. They just needed a couple
of tweaks, of course. And of course since I was just getting started,
it took forever to figure out which tweaks they needed. OK, I was pretty
sure that include <stdafx.h>
wasn't going to work on
my Linux box, but the other stuff took longer to untangle. Anyhow,
As of December 2007, here's a minimal example that worked/ran on my
Ubuntu box.
Setup: don't forget to sudo aptitude install libcppunit-dev libcppunit-doc (but you probably already did that).
Compile: You can set things up with a Makefile, Automake file, etc. However you set things up, remember that you need to link cppunit. Here's a plain ol' command-line:
$ g++ -g CritterTest.cpp main.cc -lcppunit $
Run: Let's take this thing out for a spin...
$ ./a.out .F CritterTest.cpp:11:Assertion Test name: CritterTest::TestMemorySmoke assertion failed - Expression: m.AssociatedP(3) Failures !!! Run: 1 Failure total: 1 Failures: 1 Errors: 0
Hey, cool, looks like we found a bug.
Critter.h is where my code lives. Except right now there's almost no real code. Soon there will be a Critter.cpp.
#ifndef CRITTER_H #define CRITTER_H typedef unsigned char CritterID; // A critter's Memory of one other Critter class Memory { public: // Is this who I'm thinking of? bool AssociatedP(CritterID otherID) { return otherID == this->otherID; } // Constructors are awesome Memory(): otherID(0) {} private: CritterID otherID; // Who I'm thinking of }; #endif /* CRITTER_H */
CritterTest.h is where I define my tests for things in Critter.h:
#ifndef CRITTERTEST_H #define CRITTERTEST_H #include <cppunit/TestFixture.h> #include <cppunit/extensions/HelperMacros.h> class CritterTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE( CritterTest ); CPPUNIT_TEST( TestMemorySmoke ); CPPUNIT_TEST_SUITE_END(); public: void setUp(void) {} // I don't use setUp or tearDown yet, but let's void tearDown(void) {} // leave them in so I remember their names void TestMemorySmoke(void); }; #endif /* CRITTERTEST_H */
CritterTest.cpp does a couple of things: implements my memory smoke test and registers this set of tests.
#include <cppunit/extensions/HelperMacros.h> #include "Critter.h" #include "CritterTest.h" CPPUNIT_TEST_SUITE_REGISTRATION( CritterTest ); void CritterTest::TestMemorySmoke(void) { Memory m; CPPUNIT_ASSERT( m.AssociatedP(0) ); CPPUNIT_ASSERT(! m.AssociatedP(42) ); CPPUNIT_ASSERT( m.AssociatedP(3) ); /* this should fail */ }
main.cc Has my main function. Right now, my program doesn't do anything other than run its tests. Someday, maybe I'll set up a separate testing version, but for now this is just fine. This is mostly stolen from the official tutorial, but doesn't try to use a nonexistent TestRunner.
#include "Critter.h" #include "CritterTest.h" #include <cppunit/CompilerOutputter.h> #include <cppunit/extensions/TestFactoryRegistry.h> // #include <cppunit/ui/text/TestRunner.h> /* deprecated argh */ #include <cppunit/ui/text/TextTestRunner.h> int RunTests(void) { // Get the top level suite from the registry CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest(); // Adds the test to the list of test to run // CppUnit::TextUi::TestRunner runner; CppUnit::TextTestRunner runner; runner.addTest( suite ); // Change the default outputter to a compiler error format outputter runner.setOutputter( new CppUnit::CompilerOutputter( &runner.result(), std::cerr ) ); // Run the tests. bool wasSucessful = runner.run(); // Return error code 1 if the one of test failed. return wasSucessful ? 0 : 1; } int main(void) { return RunTests(); }
This worked for me. I hope it works for you.