How do I run a single test with UnitTest++ ?
I am running UnitTest++ out of the box as is. My main
function looks like:
int main()
{
printf("diamond test v0.1 %s\n\n",TIMESTAMP);
diamond::startup();
UnitTest::RunAllTests();
diamond::shutdown();
printf("press any key to continue...");
getc(stdin);
}
For debugging I would like to write something like UnitTest::RunSingleTests("MyNewUnitTest");
instead of UnitTest::RunAllTests();
. Does UnitTest++ provide such a function and if so, what is the syntax?
try this as your main() for unittest (I actually put this in a file and added that to the unittest library, so that when linking to the library the executable automatically uses this main(). very convenient.)
int main( int argc, char** argv )
{
if( argc > 1 )
{
//if first arg is "suite", we search for suite names instead of test names
const bool bSuite = strcmp( "suite", argv[ 1 ] ) == 0;
//walk list of all tests, add those with a name that
//matches one of the arguments to a new TestList
const TestList& allTests( Test::GetTestList() );
TestList selectedTests;
Test* p = allTests.GetHead();
while( p )
{
for( int i = 1 ; i < argc ; ++i )
if( strcmp( bSuite ? p->m_details.suiteName
: p->m_details.testName, argv[ i ] ) == 0 )
selectedTests.Add( p );
p = p->next;
}
//run selected test(s) only
TestReporterStdout reporter;
TestRunner runner( reporter );
return runner.RunTestsIf( selectedTests, 0, True(), 0 );
}
else
{
return RunAllTests();
}
}
invoke with arguments to run a single test:
> myexe MyTestName
or single suite
> myexe suite MySuite
RunTestsIf can only run one suite if you tell it the name.
class MyTrue
{
public:
MyTrue(const std::string & suiteName, const std::string & testName)
: suite(suiteName), test(testName) {}
bool operator()(const UnitTest::Test* const testCase) const
{
return suite.compare(testCase->m_details.suiteName) == 0 &&
test.compare(testCase->m_details.testName) == 0;
}
private:
std::string suite;
std::string test;
};
int main (...) {
bool isSuite = false;
std::string suiteName = "suite01";
std::string testName = "test01";
UnitTest::TestReporterStdout reporter;
UnitTest::TestRunner runner(reporter);
if (isSuite) {
runner.RunTestsIf(UnitTest::Test::GetTestList(),
NULL, MyTrue(suiteName, testName), 0);
} else {
runner.RunTestsIf(UnitTest::Test::GetTestList(),
NULL, UnitTest::True(), 0);
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With