Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用autotools正确设置GLib测试框架_C_Unit Testing_Testing_Autotools_Glib - Fatal编程技术网

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

C 如何使用autotools正确设置GLib测试框架,c,unit-testing,testing,autotools,glib,C,Unit Testing,Testing,Autotools,Glib,如何使用autotools正确设置GLib测试套件?我的项目已经使用了GLib。为了建立一个测试套件,我必须做的最小修改是什么?是否包含一些m4文件?那么如何启动测试呢 谢谢自从GLib 2.38以来,建议将GLib测试套件与autotools构建系统集成的方法是依靠autotools内部的TAP(测试任何内容协议)驱动程序。在2.38之前,测试套件是基于一个特定的肮脏品牌,有一组定制的make规则,以及一个运行和合并结果的python脚本。使用它仍然是可能的,下面的大部分内容都适用,但我的建议

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


谢谢

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

GLib提供以下三个文件:

  • 用于处理命令行参数的m4宏文件:
  • 要包含在每个测试目录的
    Makefile.am
    中的生成文件:
  • 用于使用正确选项启动每个测试套件的小型shell包装器:
这些文件需要从GLib存储库复制到您自己的存储库中,因为它们仍然是比较新的-但在将来它们将安装在与GLib相同的
$prefix
中,因此项目将能够依赖它们的存在,就像它们已经为内省生成宏所做的那样

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

AC_CONFIG_MACRO_DIR([build])
因此,您必须将
glibtests.m4
放在
$top\u srcdir/build
目录中;glib tap.mk文件可以在
$top\u srcdir
中,尽管我更喜欢将所有与autotools相关的内容放在同一个目录中;最后,
tap test
启动器需要位于
$top\u srcdir
中,不过您可以通过修改
glib tap.mk
中的
LOG\u编译器
变量来更改其位置

您需要在
configure.ac
中添加
GLIB\u TESTS
指令。此指令将添加
configure
选项以启用安装测试,以及在构建项目其余部分时启用始终构建测试套件的选项,而不是仅在运行
make check
时构建测试套件。这两个选项的默认设置都是禁用的

我还将假设您的测试套件将位于
$top\u srcdir/tests
下,因此在
$top\u 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
就这样。现在,每次在构建中运行
makecheck
,测试套件都将被构建和执行,并且您将得到一个报告,其中包含通过和失败的测试单元

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


最后,如果您想了解GLib测试系统如何与(小型)库集成的示例,可以查看JSON GLib:

2.38中出现的g_test_trap_子流程如何在早期版本上正确执行fork?您可以使用g_test_trap_fork(),但是你必须意识到它是不可移植的——这就是为什么引入了g_test_trap_subprocess()的原因。glib家族有自己版本的unistd exec函数吗?不,没有。如果要生成子进程,请使用g_spawn_*函数族或新引入的GSubprocess类。感谢您的解释。在官方的油嘴滑舌的文档中有没有任何地方可以解释整个系统?