C++ unit testing framework

C++Unit Testing

C++ Problem Overview


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?

C++ Solutions


Solution 1 - C++

I've just pushed my own framework, CATCH, out there. It's still under development but I believe it already surpasses most other frameworks. Different people have different criteria but I've tried to cover most ground without too many trade-offs. Take a look at my linked blog entry for a taster. My top five features are:

  • Header only
  • Auto registration of function and method based tests
  • Decomposes standard C++ expressions into LHS and RHS (so you don't need a whole family of assert macros).
  • Support for nested sections within a function based fixture
  • Name tests using natural language - function/ method names are generated

It doesn't do generation of stubs - but that's a fairly specialised area. I think Isolator++ is the first tool to truly pull that off. Note that Mocking/ stubbing frameworks are usually independent of unit testing frameworks. CATCH works particularly well with mock objects as test state is not passed around by context.

It also has Objective-C bindings.

[update]

Just happened back across this answer of mine from a few years ago. Thanks for all the great comments! Obviously Catch has developed on a lot in that time. It now has support for BDD style testing (given/ when/ then), tags, now in a single header, and loads of internal improvements and refinements (e.g. richer command line, clear and expressive output etc). A more up-to-date blog post is here.

Solution 2 - C++

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>

Solution 3 - C++

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.

Solution 4 - C++

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.

Solution 5 - C++

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

Solution 6 - C++

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.

Solution 7 - C++

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

Solution 8 - C++

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.

Solution 9 - C++

Solution 10 - C++

I'm using tut-framework

Solution 11 - C++

Aeryn is another framework worth looking at

Solution 12 - C++

Visual Studio has a built-in unit testing framework, this is a great link to setting up a test project for win32 console application:

http://codeketchup.blogspot.ie/2012/12/unit-test-for-unmanaged-c-in-visual.html

If you are working on a static DLL project it is much easier to set up as other have pointed out external tesing frameworks like GTest and Boost have extra features.

Solution 13 - C++

CppUnit was the original homage to JUnit.

Solution 14 - C++

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...

Solution 15 - C++

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.

Solution 16 - C++

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.

Solution 17 - C++

Andrew Marlow's Fructose library's worth checking out... http://fructose.sourceforge.net/

I recall his documents containing a fairly detailed analysis and comparison of other offering at the time he wrote Fructose, but can't find a URL direct to that document.

Solution 18 - C++

I'm trying out Igloo, also a header only C++ test suite, even it's two included dependencies are header only.

So, it's pretty straightforward and simple. Besides the included example on github, there's examples and more details at the main site, igloo-testing.org. I'll update this later as I get more experience with it and other frameworks.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRobView Question on Stackoverflow
Solution 1 - C++philsquaredView Answer on Stackoverflow
Solution 2 - C++J MillerView Answer on Stackoverflow
Solution 3 - C++user49248View Answer on Stackoverflow
Solution 4 - C++Brian StewartView Answer on Stackoverflow
Solution 5 - C++yrpView Answer on Stackoverflow
Solution 6 - C++Scott SaadView Answer on Stackoverflow
Solution 7 - C++Steve DuitsmanView Answer on Stackoverflow
Solution 8 - C++small_duckView Answer on Stackoverflow
Solution 9 - C++Ray TayekView Answer on Stackoverflow
Solution 10 - C++gtjthmView Answer on Stackoverflow
Solution 11 - C++David SykesView Answer on Stackoverflow
Solution 12 - C++CDVNView Answer on Stackoverflow
Solution 13 - C++duffymoView Answer on Stackoverflow
Solution 14 - C++AaronView Answer on Stackoverflow
Solution 15 - C++ravenspointView Answer on Stackoverflow
Solution 16 - C++Kris KumlerView Answer on Stackoverflow
Solution 17 - C++Tony DelroyView Answer on Stackoverflow
Solution 18 - C++leetNightshadeView Answer on Stackoverflow