如何使用GNU autotools为“make check”创建测试

时间:2008-09-25 00:30:36

标签: unit-testing language-agnostic automated-tests autotools

我在特定项目的构建系统中使用GNU autotools。我想开始为验证编写自动化测试。我想输入“make check”让它自动运行这些。我的项目是用C ++编写的,尽管我仍然对为其他语言编写自动化测试感到好奇。

这几乎与每个单元测试框架兼容(我在考虑使用cppunit)吗?如何将这些单元测试框架挂钩进行make check?我是否可以确保不需要安装单元测试软件来配置和构建项目的其余部分?

5 个答案:

答案 0 :(得分:24)

要在发出make check时进行测试,您需要将它们添加到TESTS变量

假设您已经构建了运行单元测试的可执行文件,您只需将可执行文件的名称添加到TESTS变量中,如下所示:

TESTS=my-test-executable

然后应该在make check时自动运行,如果可执行文件返回非零值,它将报告为测试失败。如果您有多个单元测试可执行文件,只需在TESTS变量中列出它们:

TESTS=my-first-test my-second-test my-third-test

他们都会跑。

答案 1 :(得分:9)

我正在使用Check 0.9.10

    configure.ac
    Makefile.am
    src/Makefile.am
    src/foo.c
    tests/check_foo.c
    tests/Makefile.am
  1. ./configure.ac

    PKG_CHECK_MODULES([CHECK],[check> = 0.9.10])

  2. ./tests/Makefile.am用于测试代码

    TESTS = check_foo
    check_PROGRAMS = check_foo
    check_foo_SOURCES = check_foo.c $(top_builddir)/src/foo.h
    check_foo_CFLAGS = @CHECK_CFLAGS@
    
  3. 并编写测试代码./tests/check_foo.c

    START_TEST (test_foo)
    {
        ck_assert( foo() == 0 );
        ck_assert_int_eq( foo(), 0);
    }
    END_TEST
    
    /// And there are some tcase_xxx codes to run this test
    
  4. 使用检查可以使用超时和提升信号。这非常有帮助。

答案 2 :(得分:4)

您似乎在第一段中提出两个问题。

第一个是关于向GNU autotools工具链添加测试 - 但是如果我正确理解你的那些测试,则用于验证构建应用程序所需的环境(依赖库和工具)以及适应对环境的构建(平台特定的差异)。

第二个是关于单元测试你的C ++应用程序以及在哪里调用这些测试,你建议从autotools工具链这样做,大概来自configure脚本。这样做并不常见 - 在Makefile中放置一个'test'目标是执行测试套件的一种更传统的方式。使用autotools构建和安装应用程序的典型步骤(至少从用户的角度来看,而不是从开发人员的角度来看)是运行configure脚本,然后运行make,然后选择运行make test,最后make install。 / p>

对于第二个问题,不希望cppunit成为依赖项,为什么不将它与c ++应用程序一起分发呢?你能不能把你正在使用的档案格式(无论是tar.gz,tar.bz2还是.zip)和你的源代码放在一起。我过去曾使用过cppunit,并且对它很满意,使用了JUnit和其他xUnit样式框架。

答案 3 :(得分:1)

这是没有依赖性的方法:

#src/Makefile.am
check_PROGRAMS = test1 test2
test1_SOURCES = test/test1.c code_needed_to_test1.h code_needed_to_test1.c
test2_SOURCES = test/test2.c code_needed_to_test2.h code_needed_to_test2.c
TESTS = $(check_PROGRAMS)

make check将自然起作用并显示格式化和汇总的输出:

$ make check
...
PASS: test1
PASS: test2
============================================================================
Testsuite summary for foo 1.0
============================================================================
# TOTAL: 2
# PASS:  2
# SKIP:  0
# XFAIL: 0
# FAIL:  0
# XPASS: 0
# ERROR: 0
============================================================================
  1. 当您执行make dist时,src/test/*中的任何内容都不会 在压缩包中。测试代码不在dist中,只有源。
  2. 执行make distcheck时,它将运行make check并运行测试。

答案 4 :(得分:0)

您可以使用Automake的TESTS来运行使用check_PROGRAMS生成的程序,但这将假设您正在使用日志驱动程序和编译器来输出。使用check_PROGRAMS可能更容易,但是使用Makefile中的本地规则调用测试套件:

check_PROGRAMS=testsuite

testsuite_SOURCES=...
testsuite_CFLAGS=...
testsuite_LDADD=...

check-local:
    ./testsuite