/ctdd

C test-driven development framework implemented in Python. pip install ctdd.

Primary LanguagePythonMIT LicenseMIT

ctdd

tl:dr

C test-driven development framework implemented in Python.

Info

The testing framework is Python's native unittest, with a few extra asserts ans stuff provided by John. The tester looks for a .c and .h pair with the same name as the .py test file. It builds them into a Python extension using Crelm (which in turn uses cffi) and runs the Python tests as if it were testing Python code. C callbacks are mocked in Python (demo to follow..), meaning that there is exactly zero C code involved in the testing.

Example

There is a demo of a TDD'd add3 function in __main__.py, __main__.c and __main__.h in the root of the repo, run with python3 .. The silly filenames are to suit the Python auto-run mechanism.

The files are reproduced here (possibly out of date) with original filenames:

add3.py

from ctdd import Tester

class Add3Tests(Tester):

    def test_sut_compiles(self):
        with self.assertDoesNotRaise():
            self.sut

    def test_takes_three_f(self):
        with self.assertDoesNotRaise():
            self.sut.add3(0, 0, 0)

    def test_return_zero_for_zeros(self):
        expected = 0

        actual = self.sut.add3(0, 0, 0)

        self.assertEqual(expected, actual)

    def test_returns_sum(self):
        expected = 14

        actual = self.sut.add3(1, 4, 9)

        self.assertEqual(expected, actual)

Tester.go()

add3.h

#pragma once

int add3(int a, int b, int c);

add3.c

#include "__main__.h"

int add3(int a, int b, int c)
{
    return a + b + c;
}

To use this in real life install the package with pip install ctdd (in a virtualenv if you prefer), and run python add3.py after each add test or add code iteration.

Test output is exactly what unittest said (with distutils deprecation warning removed):

...........
----------------------------------------------------------------------
Ran 11 tests in 2.104s

OK