2

在一个更大的项目中,我已经设置./tests/Makefile.am好在调用make check. 该文件global_wrapper.c包含设置/故障代码,它调用在几个子目录中实现的测试函数。

TESTS = global_test

check_PROGRAMS = global_test

global_test_SOURCES = global_wrapper.c foo/foo_test.c bar/bar_test.c

效果很好。但是测试需要很长时间,所以我希望能够选择只执行来自单个子目录的测试。我一开始就是这样做的。

我添加了子目录:

SUBDIRS = foo bar

在子目录中,我添加了本地包装器和Makefile.am's:

TESTS = foo_test

check_PROGRAMS = foo_test

# the foo_test.c here is of course the same as in the global Makefile.am
foo_test_SOURCES = foo_wrapper.c foo_test.c

这也很有效——当我make check在 subdirectory中调用时foo,只执行 foo 测试。

但是,当我现在调用make check./tests所有测试都执行了两次。一次通过global_test,一次通过本地测试程序。

如果我省略SUBDIRSglobal 中的语句Makefile.am,则子目录 makefiles 不会生成。如果我TESTS从 local中省略Makefile.ammake check则不会对本地目录执行任何操作。

我对 automake 不太熟悉,但我很确定有一些方法可以解决这个难题。这里有人可以给我一个提示吗?

4

3 回答 3

4

打破你的测试。在您的测试/Makefile.am 中:

测试 = foo_test bar_test

并使用类似的东西适当地构建 foo_test bar_test

foo_test_SOURCES = foo/foo_wrapper.c foo/foo_test.c
bar_test_SOURCES = bar/bar_wrapper.c bar/bar_test.c

现在,如果你做一个原始的'make check',两个测试都会运行。如果您只想运行一项测试,您可以使用 'make check TESTS=foo_test' 或 'make check TESTS=bar_test' 来执行此操作,并且只会运行适当的测试。通常,Makefile.am 列出了在 TESTS 中默认运行的所有测试,并且用户在生成时选择替代测试。当然,如果您经常运行测试,您可以在 shell 会话中“导出 TESTS=foo_test”,然后只输入“make check”。

于 2010-02-03T06:31:36.187 回答
1

你不能从“global_test”中删除任何已经在子目录中执行的测试吗?(只是这样他们就不会被执行两次。)

于 2010-01-28T10:04:13.360 回答
1

我认为您可以覆盖check顶层的规则来定义环境变量:

check:
        DISABLE_SUBTESTS=1 make check-recursive

然后DISABLE_SUBTESTS在您的子目录中进行测试以决定是否实际运行测试。

(就个人而言,我宁愿make check通过隐藏测试的输出来安排在现有框架中工作,而不是像这样覆盖生成的规则。)

于 2010-01-29T07:15:27.700 回答