Writing programs in good old C can be quite refreshing if you use some modern utility library like GLib. It offers a comprehensive set of tools you expect from a modern programming environment like collections, logging, plugin support, thread abstractions, string and date utilities, different parsers, i18n and a lot more. One essential part, especially for agile teams, is onboard too: the unit test framework gtest.
Because of the statically compiled nature of C testing involves a bit more work than in Java or modern scripting environments. Usually you have to perform these steps:
- Write a main program for running the tests. Here you initialize the framework, register the test functions and execute the tests. You may want to build different test programs for larger projects.
- Add the test executable to your build system, so that you can compile, link and run it automatically.
- Execute the gtester test runner to generate the test results and eventually a XML-file to you in your continuous integration (CI) infrastructure. You may need to convert the XML ouput if you are using Jenkins for example.
A basic test looks quite simple, see the code below:
#include <glib.h> #include "computations.h" void computationTest(void) { g_assert_cmpint(1234, ==, compute(1, 1)); } int main(int argc, char** argv) { g_test_init(&argc, &argv, NULL); g_test_add_func("/package_name/unit", computationTest); return g_test_run(); }
To run the test and produce the xml-output you simply execute the test runner gtester like so:
gtester build_dir/computation_tests --keep-going -o=testresults.xml
GTester unfortunately produces a result file which is incompatible with Jenkins’ test result reporting. Fortunately R. Tyler Croy has put together an XSL script that you can use to convert the results using
xsltproc -o junit-testresults.xml tools/gtester.xsl testresults.xml
That way you get relatively easy to use unit tests working on your code and nice some CI integration for your modern C language projects.
Update:
Recent gtester
run the test binary multiple times if there are failing tests. To get a report of all (passing and failing) tests you may want to use my modified gtester.xsl script.