If you haven’t put your hands on the recent James Grenning’s book “Test-Driven Development for Embedded C” yet, I highly recommend you do. Here is why.
TDD Is NOT About Testing!
First, you need to realize that TDD is not really about testing–it is about software development (Test-Driven Development). Testing is just a means to an end. The central idea behind TDD is that software, as any complex system in nature, has to evolve gradually and has to keep working throughout all the development stages.
Universal Origin of Complex Systems
This idea is of course not new and goes back all the way to the Darwin’s “On the Origin of Species by Means of Natural Selection, or the Preservation of Favoured Races in the Struggle for Life”.
More recently, in his 1977 book “Systemantics: How Systems Work and Especially How They Fail” John Gall wrote:
“A complex system that works is invariably found to have evolved from a simple system that worked…. A complex system designed from scratch never works and cannot be patched up to make it work. You have to start over, beginning with a working simple system”.
Code Needs to Struggle for Existence
The key point of TDD is to subject the software to constant “struggle for existence” to actually see if it indeed is still working and in the process weed out any undesired “mutations”. We do this by constantly subjecting the software to the tests.
Shortening Evolutionary Time
Of course, in developing software we don’t have the deep evolutionary time, so we need to accelerate the pace of software evolution. We do this by automating the testing.
For embedded development this means avoiding the target system bottleneck (James calls it DOH!-Development On Hardware). The embedded TDD strategy is to develop embedded software on the desktop and only occasionally check it on the real embedded hardware. This means that the C/C++ compilers and tools for the desktop (such as Visual C++, MinGW, or Cygwin for Windows and GCC for Linux and macOS) are important for us.
TDD on Windows
The TDD book comes with testing frameworks (Unity and CppUTest) and plenty of example code. The code works right of the box on Linux, but I had some issues running it on Windows. In the process of learning the tools, I’ve prepared a small template for Visual C++ 2008, which is available for download from:
This demo assumes that you download and install the CppUTest framework (https://sourceforge.net/projects/cpputest/) and that you define the environment variable CPP_U_TEST to point to the directory where you installed CppUTest. The Visual Studio solution AllTest.sln is located in the blinky\tests directory.
I’d love to hear about your experiences with TDD in embedded programming. I’m sure I will blog more about it in the future.