Skip to main content

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

Release files for ctdd 0.0.7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ctdd 0.0.7
File Size Uploaded
ctdd-0.0.7.tar.gz 7.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ctdd 0.0.7
File Interpreter ABI Platform
ctdd-0.0.7-py3-none-any.whl Python 3 none any Details

Total release size: 15.5 kB

Release files / ctdd-0.0.7.tar.gz

Download URL ctdd-0.0.7.tar.gz
Size 7.4 kB
Tags Source
SHA-256 checksum
How to use checksums
93545ca98251075ba86287ff0dc5cf55ac580797a8f1468290893683de608b0d
BLAKE2b-256 checksum
How to use checksums
8cf385cf2a306deb9cd4ee300c139921127e8ff932f957b0627fbf339ec7ac56
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.4.2 CPython/3.10.7 Linux/5.19.0-1028-lowlatency

Release files / ctdd-0.0.7-py3-none-any.whl

Download URL ctdd-0.0.7-py3-none-any.whl
Size 8.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
848aa73f1f2f2deb270386a08edb7632183ac4152a1b50dc9347d0abaaf4d458
BLAKE2b-256 checksum
How to use checksums
2dc37cfd922f3d43afb26409b8030660c05371bc510e192c73371f97012d7d7d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.4.2 CPython/3.10.7 Linux/5.19.0-1028-lowlatency
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page