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

Gre*_*ers 26 language-agnostic automated-tests unit-testing autotools

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

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

jon*_*ner 26

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

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

TESTS=my-test-executable
Run Code Online (Sandbox Code Playgroud)

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

TESTS=my-first-test my-second-test my-third-test
Run Code Online (Sandbox Code Playgroud)

他们都会跑.


Don*_*Yoo 11

我正在使用Check 0.9.10

    configure.ac
    Makefile.am
    src/Makefile.am
    src/foo.c
    tests/check_foo.c
    tests/Makefile.am
Run Code Online (Sandbox Code Playgroud)
  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@
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

使用检查可以使用超时和提升信号.这非常有帮助.


Kyl*_*ton 6

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

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

第二个是关于对您的 C++ 应用程序进行单元测试以及在何处调用这些测试,您已经建议从 autotools 工具链(大概是从配置脚本)中这样做。这样做并不传统——在你的 Makefile 中放置一个“测试”目标是执行测试套件的更传统的方式。使用 autotools 构建和安装应用程序的典型步骤(至少从用户的角度,而不是从您的开发人员的角度)是运行配置脚本,然后运行 ​​make,然后可选地运行 make test 和最后 make install。

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