Unit Testing Libraries for C
The last time I did some unit testing on C, I used Novaprova. However, at least at the moment, this doesn’t run on non-Intel platforms (like the ARM based Pi).
I decided to make a quick survey of what tools there are. I focused mainly on the ones that are already available through Linux package managers.
Everyone loves Autotools
The leading approach seems to be to use autotools’ built-in test runner i.e. “make check”.
To choose two of my favourite projects at random, VLC and JSON-C, both follow this approach.
Using GCC’s built-in preprocessor and linker gets you some way to mocking and so on.
A lot of applications roll their own test runners using bash or Python scripts.
If you are using a big framework, you may have already installed testing utilities as part of it, for example GNOME’s Glib and Boost (which is C++) both come with their own testing tools.
Without further ado, onward to the tables. Currently, these are just in approximate alphabetical order.
C Only
Name | Apt Package | Projects Using It |
---|---|---|
Check | check | Expat, GStreamer |
cmocka | cmocka | libssh, OpenVPN |
CUnit | libcunit1 | OpenDataPlane |
GNU Autounit | libautounit-dev |
C and C++
Name | Apt Package | Projects Using It |
---|---|---|
API Sanity Checker | api-sanity-checker | |
CppUnit | libcppunit-dev | LibreOffice |
CppUTest | cpputest | |
Criterion | criterion-dev (ppa) | |
CTest (CMake) | cmake | Netflix, ZeroMQ, libpng, Poppler |
Cutter | cutter-testing-framework | libnfc, Groonga |
DejaGnu | dejagnu | GCC, Other GNU tools |
Google Test | googletest | Chromium, LLVM, OpenCV, Blender |
C++ Only
There are loads of C++ testing utilities such as Catch and CxxTest (and too many others to mention) that do not claim explicit support for C.
If you want to use one of those, you can just test your C code using a C++ compiler.
Some purists will object, as in this Stackoverflow comment:
I know C and C++ has a lot of overlap, but it doesn’t strike me as a good idea to use a C++ testing library when you’re producing code that will be ultimately compiled in a C compiler
Tell me your stories
I haven’t had the opportunity yet to go beyond listing them.
What are you using? What have I missed?
I’m especially keen to get more information to fill in the third column in the table above (i.e. what any testing tools vaguely well known open source projects use).