Unit testing 如何为“测试”创建测试;勾选“;使用GNU自动工具

Unit testing 如何为“测试”创建测试;勾选“;使用GNU自动工具,unit-testing,language-agnostic,automated-tests,autotools,Unit Testing,Language Agnostic,Automated Tests,Autotools,我正在使用GNU自动工具为一个特定项目构建系统。我想开始为验证编写自动测试。我只想键入“makecheck”让它自动运行这些。我的项目是C++,虽然我仍然对编写其他语言的自动化测试感到好奇。 这与几乎所有的单元测试框架都兼容吗(我正在考虑使用cppunit)?如何将这些单元测试框架连接到make check中?我可以确保不需要安装单元测试软件来配置和构建项目的其余部分吗?在第一段中,您似乎问了两个问题 第一个是关于将测试添加到GNU autotools工具链-但是如果我理解正确的话,这些测试既用

我正在使用GNU自动工具为一个特定项目构建系统。我想开始为验证编写自动测试。我只想键入“makecheck”让它自动运行这些。我的项目是C++,虽然我仍然对编写其他语言的自动化测试感到好奇。
这与几乎所有的单元测试框架都兼容吗(我正在考虑使用cppunit)?如何将这些单元测试框架连接到make check中?我可以确保不需要安装单元测试软件来配置和构建项目的其余部分吗?

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

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

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


对于第二个问题,不希望CPPUnice成为依赖关系,为什么不将它与C++应用程序一起发布呢?你能不能把它和你的源代码一起放在你正在使用的归档格式(tar.gz、tar.bz2或.zip)中。我在过去使用过cppunit,并且对它很满意,使用过JUnit和其他xUnit风格的框架。

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

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

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

TESTS=my-first-test my-second-test my-third-test
他们都会跑的。

我用的是

  • /configure.ac

    包装检查模块([检查],[检查>=0.9.10])

  • 测试代码的
    /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@
    
  • 并编写测试代码,
    /tests/check\u 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
    

  • 使用“检查”可以使用超时和提升信号。这非常有用。

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

    check_PROGRAMS=testsuite
    
    testsuite_SOURCES=...
    testsuite_CFLAGS=...
    testsuite_LDADD=...
    
    check-local:
        ./testsuite
    

    以下是一个没有依赖项的方法:

    #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
    ...
    PASS: test1
    PASS: test2
    ============================================================================
    Testsuite summary for foo 1.0
    ============================================================================
    # TOTAL: 2
    # PASS:  2
    # SKIP:  0
    # XFAIL: 0
    # FAIL:  0
    # XPASS: 0
    # ERROR: 0
    ============================================================================
    
  • 当您执行
    make dist
    时,
    src/test/*
    中的任何内容都不会被删除 在柏油球里。测试代码不在dist中,将只显示源代码
  • 执行
    makedistcheck
    时,它将运行
    makecheck
    并运行测试

  • 对否决票有什么看法吗?您是否觉得这个问题没有直接解决?如果需要调整测试运行的环境,例如PATH,您可能还需要使用TESTS\u环境变量。当然,如果您希望从源代码生成测试,但不安装测试,然后,您可能会在
    check_PROGRAMS
    Automake变量中指定它们的名称,并定义任何所需的源和构建选项,就像您为任何其他目标定义的一样。对/错/或无关当您执行
    make dist
    时,测试不在tarball中。
    $ 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
    ============================================================================