views:

1913

answers:

14

I use the Boost Test framework for my C++ code but there are two problems with it that are probably common to all C++ test frameworks:

  • There is no way to create automatic test stubs (by extracting public functions from selected classes for example).
  • You cannot run a single test - you have to run the entire 'suite' of tests (unless you create lots of different test projects I guess).

Does anyone know of a better testing framework or am I forever to be jealous of the test tools available to Java/.NET developers?

+2  A: 

Try WinUnit. It sounds excellent, and is recommended by John Robbins.

Steve Duitsman
A: 

http://groups.google.com/group/googletestframework, but it's pretty new

+4  A: 

I'm a big fan of UnitTest++, it's very lightweight, but does the job. You can run single tests there easily.

yrp
A: 

Eclipse/JUnit is a solid package for java, and there are C++ extensions/equivalents for both. It can do what you're talking about. Of course, you'd have to change IDEs...

Aaron
+3  A: 

Great question! A few years ago I looked around forever for something worth using and came up short. I was looking for something that was very lightweight and did not require me to link in some libraries... you know something I could get up and running in minutes.

However, I persisted and ended up running across cxxtest.

From the website:

  • Doesn't require RTTI
  • Doesn't require member template functions
  • Doesn't require exception handling
  • Doesn't require any external libraries (including memory management, file/console I/O, graphics libraries)
  • Is distributed entirely as a set of header files (and a python script).

Wow... super simple! Include a header file, derive from the Test class and you're off and running. We've been using this for the past four years and I've still yet to find anything that I'm more pleased with.

Scott Saad
A: 

I too am a fan of UnitTest++.

The snag is that the source distribution contains almost 40 seperate files. This is absurd. Managing the source control and build tasks for a simple project is dominated by looking after all these unit testing files.

I have modified UnitTest++ so that it can be integrated with a project by adding one .h and .cpp file. This I have dubbed "cutest". Details are at http://ravenspoint.com/blog/index.php?entry=entry080704-063557

It does not automatically generate test stubs, as asked for in the original question. I cannot help thinking that such a feature would be more trouble than it is worth, generating vast amounts of useless code "testing" accessor functions.

ravenspoint
A: 

I like the Boost unit test framework, principally because it is very lightweight.

  • I never heard of a unit-test framework that would generate stubs. I am generally quite unconvinced by code generation, if only because it gets obsolete very quickly. Maybe it becomes useful when you have a large number of classes?

  • A proponent of Test Driven Development would probably say that it is fundamental that you run the whole test suite every time, as to make sure that you have not introduced a regression. If running all the tests take too much time, maybe your tests are too big, or make too many calls to CPU intensive functions that should be mocked out? If it remains a problem, a thin wrapper around the boost unit-tests should allow you to pick your tests, and would probably be quicker than learn another framework and port all your tests.

small_duck
A: 

I would imagine automatically stubbing out test functions would be more of a function (of scripts for the framework or) the development environment in question. Supposedly CodeGear's C++Builder applications will quickly generate test code for user functions.

Kris Kumler
+5  A: 

Take a look at the Google C++ Testing Framework.

It's used by Google for all of their in-house C++ projects, so it must be pretty good.

http://googletesting.blogspot.com/2008/07/announcing-new-google-c-testing.html

http://code.google.com/p/googletest

Jeff Miller
+2  A: 

I just responded to a very similar question. I ended up using Noel Llopis' UnitTest++. I liked it more than boost::test because it didn't insist on implementing the main program of the test harness with a macro - it can plug into whatever executable you create. It does suffer from the same encumbrance of boost::test in that it requires a library to be linked in. I've used CxxTest, and it does come closer than anything else in C++-land to automatically generating tests (though it requires Perl to be part of your build system to do this). C++ just does not provide the reflection hooks that the .NET languages and Java do. The MsTest tools in Visual Studio Team System - Developer's Edition will auto-generate test stubs of unmanaged C++, but the methods have to be exported from a DLL to do this, so it does not work with static libraries. Other test frameworks in the .NET world may have this ability too, but I'm not familiar with any of those. So right now we use UnitTest++ for unmanaged C++ and I'm currently deciding between MsTest and NUnit for the managed libraries.

Brian Stewart
+2  A: 

I'm using tut-framework

A: 

Aeryn is another framework worth looking at

David Sykes
+3  A: 

Boost.Test does allow to run test case by name. Or test suite. Or several of them.

Boost.Test does NOT insists on implementing main, though it does make it easy to do so.

Boost.Test is NOT necessary to use as a library. It has single header variant.

A: 

CppUnit was the original homage to JUnit.

duffymo