【问题标题】:Automake: how to handle global and local 'make check' effectively?Automake:如何有效地处理全局和本地“make check”?
【发布时间】:2010-01-26 16:46:41
【问题描述】:

在一个较大的项目中,我设置了./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

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

这也很有效 - 当我在子目录 foo 中调用 make check 时,只执行 foo 测试。

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

如果我在全局 Makefile.am 中省略了 SUBDIRS 语句,则子目录 makefile 不会生成。如果我从本地 Makefile.am 中省略 TESTSmake check 不会对本地目录执行任何操作。

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

【问题讨论】:

    标签: automated-tests automake


    【解决方案1】:

    分解你的测试。在你的测试/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 会话中'export TESTS=foo_test',然后只输入'make check'。

    【讨论】:

    • 设置环境变量的好技巧,但它对我的问题没有帮助:对于全局测试运行,所有测试的摘要在 结束输出。
    • Automake 生成的 Makefile 确实在最后输出了一个摘要。它告诉您“所有 2 个测试都通过了”。如果您想要更明确的内容,您的测试应该为您生成输出。有关示例,请参阅检查单元测试框架。
    【解决方案2】:

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

    【讨论】:

    • 测试产生大量输出,并在最后打印它们的摘要。按顺序执行子目录测试会淹没该输出中的实际结果,这就是为什么将所有测试捆绑到一个全局套件中很有用(您会在输出末尾获得适当的一目了然的摘要)。
    • 我的测试通常有一个详细的选项。当它们从 make check 运行时,它们是静默的:标准输出被重定向到一个日志文件,并且只有结论被写出 stderr(在失败的情况下会提到日志文件)。这样,重要信息就不会隐藏在输出中。当手动运行测试时,它们很冗长,标准输出会发送到终端。
    【解决方案3】:

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

    check:
            DISABLE_SUBTESTS=1 make check-recursive
    

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

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

    【讨论】:

    • 这听起来很有趣;正如我所说,我对 Automake 不太熟悉,也不知道您可以覆盖规则。 (而且无论如何也不知道 baout check-recursive。)我会检查一下。
    猜你喜欢
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    相关资源
    最近更新 更多