如何使用autotools正确设置GLib测试框架

时间:2013-11-13 16:16:02

标签: c unit-testing testing autotools glib

如何使用autotools正确设置GLib测试套件?我的项目已经使用了GLib。设置测试套件必须做的最小修改是什么?是否包含一些m4文件?那么如何启动测试?

谢谢

1 个答案:

答案 0 :(得分:14)

自GLib 2.38以来,将GLib测试套件与autotools构建系统集成的推荐方法是依靠autotools本身内部的TAP(Test Anything Protocol)驱动程序。在2.38之前,测试套件基于特定品牌的肮脏,具有一组自定义的make规则,以及运行和合并结果的python脚本。它仍然可以使用,并且以下大部分内容都适用,但我的建议是使用TAP驱动程序支持,因为这是从现在开始支持的内容。

GLib提供这三个文件:

这些文件需要从GLib存储库复制到您自己的文件中,因为它们仍然适度新 - 但将来它们将安装在与GLib相同的$prefix中,因此项目将能够依赖关于它们的存在,就像它们已经为内省生成宏所做的那样。

我将假设您的configure.ac有两个指令来设置宏和辅助目录:

AC_CONFIG_MACRO_DIR([build])

因此您必须将glibtests.m4放在$top_srcdir/build目录中; glib-tap.mk文件可以在$top_srcdir中,但我更喜欢将所有与autotools相关的文件放在同一目录中;最后,tap-test启动器需要位于$top_srcdir,但您可以通过修改LOG_COMPILER内的glib-tap.mk变量来更改其位置。

您需要在GLIB_TESTS中添加configure.ac指令。该指令将添加configure选项以启用安装测试,以及在构建项目的其余部分时始终构建测试套件的选项,而不是仅在运行make check时构建它。两个选项的默认值均已禁用。

我还假设您的测试套件将位于$top_srcdir/tests下,因此在$top_srcdir/tests/Makefile.am中,您需要包含glib-tap.mk正确的路径:

include $(top_srcdir)/build/glib-tap.mk

然后您需要使用glib-tap.mk中定义的变量来添加测试二进制文件和数据。例如,如果您有以下测试单元文件:

foo.c
bar.c
baz.c
blah.c

分布式tarball附带的一些测试数据:

foo.data.txt
bar.data.txt

以及每次构建测试套件时应该重建的一些自动生成的数据:

blah.data.txt

您需要声明:

# test binaries
test_programs = \
    foo \
    bar \
    baz \
    blah

# data distributed in the tarball
dist_test_data = \
    foo.data.txt \
    bar.data.txt

# data not distributed in the tarball
test_data = \
    blah.data.txt

就是这样。现在,每次在构建中运行make check时,都会构建并执行测试套件,并且您将获得一个包含已通过和失败的测试单元的报告。

如果您没有或不能依赖最新版本的GLib,那么您需要在项目中复制glib-tap.mk,而不是使用tap-testglib.mk。并以与上述相同的方式包括它。规则完全相同,因此您无需更改它们。在这种情况下,测试套件中的每个单元将使用GLib在系统位置安装的gtester Python脚本运行。

最后,如果您想要一个GLib测试系统如何与(小)库集成的示例,您可以查看JSON-GLib:https://git.gnome.org/browse/json-glib/