C 语言的单元测试框架,上 WikiPedia 可以查到很多。经过一番比较之后,选定 check 作为 c 语言的单元测试框架。Check 最主要的优点是对于每一个测试用例的运行都 fork 一个子进程,这么做的原因是因为 C 语言的独特性:
* 其它语言如 Java,Python,Ruby等,单元测试出错最多不过是抛出异常
* C 语言如果指针操作错误,乱指一气,可是会 coredump的。测试框架因此直接退出,用户是看不到任何返回的,只有郁闷的 coredump
* Check 的单元测试运行在 fork 的子进程中,可以避免测试框架由于 coredump 而崩溃,优点显而易见
但是在 Debian 上安装 check,示例代码竟然没有办法编译通过,陷入忙等待,显然是陷入了一个死循环。
Debian 上安装 check,部署了下列文件(只列出主要文件):
$ dpkg -L check
/usr/include/check.h
/usr/share/aclocal/check.m4
/usr/share/doc/check/examples/README
/usr/share/doc/check/examples/Makefile.am
/usr/share/doc/check/examples/configure.ac
/usr/share/doc/check/examples/tests/check_money.c
/usr/share/doc/check/examples/tests/Makefile.am
/usr/share/doc/check/examples/src/money.c
/usr/share/doc/check/examples/src/Makefile.am
/usr/share/doc/check/examples/src/money.h
/usr/share/doc/check/examples/src/main.c
... 将示例拷贝到工作目录,运行,陷入可怕的死循环! CPU 占用 100%:
$ cp -a /usr/share/doc/check/examples examples
$ cd examples
$ autoreconf --install -v
autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal
我们在运行 autoreconf 时间使用了 -v 参数,看到发生死循环是在运行 aclocal 命令时。怎么办呢?
着急的用户,看这里:
将 configure.ac 中的如下内容
# CHECK_LIBS accordingly.
# AM_PATH_CHECK([MINIMUM-VERSION,
# [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
AM_PATH_CHECK() 修改为:
PKG_CHECK_MODULES([CHECK], [check >= 0.9.4])
之后再参照 README 中的说明执行就可以了:
$ autoreconf --install
$ ./configure
$ make
$ make check
31/3123>