unitc is a simple to use C unit testing library.
unitc is documented with Doxygen. API documentation is available here.
unitc has only been tested on Linux, but should work on POSIX systems.
- make
 - C compiler (only tested with gcc)
 - pkg-config
 - GLib (2) (also a runtime dependency)
 
- 
Grab the source.
 - 
Build the shared object:
make build - 
Copy the shared object
libunitc.soto some place in the library path. - 
Copy the header file
unitc.hto some place in the include path. 
unitc is tested using itself and Valgrind's memcheck.
As per Installation dependencies as well as
- unitc
 - GNU Binutils and Core Utilities
 - Valgrind (memcheck)
 - less
 
Grab the source and
make test
This produces an executable of unitc's tests (unitc_test from unitc_test.c),
and runs unitc's unit tests and unitc_memcheck.sh (wrapper on memcheck).
Unit test results are output as a standard report. unitc_memcheck.sh
reports success, or shows memcheck's output (in less) on failure.
The following tests an implementation of some C string functions:
/* example.c */
#include <stdlib.h>
#include <stdio.h>
#include <unitc.h>
size_t my_strlen(const char *s) {
        size_t len;
        for (len = 0; s[len] != '\0'; ++len);
        return len;
}
size_t my_strnlen(const char *s, size_t maxlen) {
        /* To demonstrate failure. */
        return my_strlen(s);
}
void test_my_strlen(uc_suite suite) {
        uc_check(suite, my_strlen("") == 0, "Check \"\".");
        uc_check(suite, my_strlen("ABC") == 3, "Check \"ABC\".");
        uc_check(suite, my_strlen("A") == 1, "Check \"A\".");
}
void test_my_strnlen(uc_suite suite) {
        uc_check(suite, my_strnlen("", 0) == 0, "Check \"\" with 0.");
        uc_check(suite, my_strnlen("ABC", 3) == 3, "Check \"ABC\" with 3.");
        /* Failure with no comment. */
        uc_check(suite, my_strnlen("ABC", 2) == 2, NULL);
        uc_check(suite, my_strnlen("ABCD", 9) == 4, "Check \"ABCD\" with 9.");
        uc_check(suite, my_strnlen("string", 3) == 3,
                 "Check \"string\" with 3.");
        uc_check(suite, my_strnlen("TEST!", 4) == 4, "Check \"TEST!\" with 4.");
}
int main(void) {
        uc_suite suite;
        suite = uc_init(UC_OPT_NONE, "my_str tests",
                        "Tests for my implementation of strlen and strnlen");
        if (suite == NULL) {
                fputs("Cannot create suite.\n", stderr);
                return EXIT_FAILURE;
        }
        uc_add_test(suite, test_my_strlen, "my_strlen tests", NULL);
        uc_add_test(suite, test_my_strnlen, "my_strnlen tests",
                    "Might see some failures...");
        uc_run_tests(suite);
        uc_report_standard(suite);
        uc_free(suite);
        return EXIT_SUCCESS;
}Compiling with
gcc -Wall -Werror -lunitc -o example example.c
then running with
./example
produces the following output:
my_str tests
Tests for my implementation of strlen and strnlen
Total successful checks: 6/9.
    Successful checks: 0/0.
    my_strlen tests
        Successful checks: 3/3.
    my_strnlen tests
    Might see some failures...
        Successful checks: 3/6.
        Check failed: Check #3.
        Check failed: Check "string" with 3.
        Check failed: Check "TEST!" with 4.
A larger example would be unitc's own tests residing in unitc_test.c.