【问题标题】:How do you create tests for "make check" with GNU autotools如何使用 GNU 自动工具为“make check”创建测试
【发布时间】:2008-09-25 00:30:36
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    TESTS=my-test-executable
    

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

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

    他们都会跑起来。

    【讨论】:

    • 如果您需要调整测试运行的环境,例如 PATH,您可能还想使用 TESTS_ENVIRONMENT 变量。
    • 当然,如果您想从源代码构建测试但不安装它们,那么您可能会在 check_PROGRAMS Automake 变量中指定它们的名称,并定义任何需要的源代码和构建选项就像对待任何其他目标一样。
    • 正确/错误/无关紧要,当您执行 make dist 时,测试不在 tarball 中。
    • 完成 autotools 初学者问题 - 哪个文件应该有 TESTS=my-test-executable 行?
    【解决方案2】:

    我正在使用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], [检查 >= 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
      

    使用 check 你可以使用 timeout 和 raise 信号。很有帮助。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • 对否决票有任何见解吗?你觉得这个问题没有直接解决吗?
      【解决方案4】:

      这是一个没有依赖的方法:

      #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 并运行您的测试。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2016-11-19
          • 1970-01-01
          • 1970-01-01
          • 2011-02-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-02
          • 1970-01-01
          相关资源
          最近更新 更多