【问题标题】:Writing a Makefile.am to invoke googletest unit tests编写 Makefile.am 来调用 googletest 单元测试
【发布时间】:2011-01-28 13:06:36
【问题描述】:

我正在尝试将我的第一个单元测试添加到现有的开源项目中。具体来说,我添加了一个名为 audio_manager 的新类:

src/audio/audio_manager.h
src/audio/audio_manager.cc

我创建了一个镜像实现文件结构的 src/test 目录结构,并编写了我的googletest 单元测试:

src/test/audio/audio_manager.cc

现在,我正在尝试设置我的 Makefile.am 来编译和运行单元测试:

src/test/audio/Makefile.am

我从以下位置复制 Makefile.am:

src/audio/Makefile.am

有没有人给我一个简单的食谱,或者它是给我的神秘的 automake 文档? :)

【问题讨论】:

    标签: c++ unit-testing makefile automake googletest


    【解决方案1】:

    如果现有项目已经有一个测试结构,那么你应该添加:

    测试 += 音频管理器

    到现有的测试/Makefile.am。如果现有项目没有适当的测试结构,您应该尖叫着跑到山上。

    如果无法接受在山上奔跑,那么在建立测试结构方面还有相当多的工作量,但这并不是不可克服的。您可能更愿意将测试作为 src 的兄弟,但这不是必需的。从新的 Makefile.am 开始可能比从 src 复制 Makefile.am 更容易,但也许不是。可能,您需要做的就是更改表单的行:

    bin_PROGRAMS = ...

    check_PROGRAMS = ...

    添加行

    TESTS = 测试音频管理器

    将 audio_manager.cc 的名称更改为 test-audio-manager.cc(这不是绝对必要的,但有助于可维护性。我将 _ 更改为 - 纯粹出于个人喜好)并添加一个

    SUBDIRS = 测试/音频

    到 src/Makefile.am。 (如果已经有一个 SUBDIRS 指令,附加到该分配或使用 +=)

    【讨论】:

    • 感谢你让每个人都开始了:)
    【解决方案2】:

    William 的回答让我到达了我需要去的地方。只是为了社区,这就是我最终做的事情:

    1. 按照 William 的建议,我将测试移回主目录结构并添加了 test_。
    2. 我在 src/audio/Makefile.am 中添加了几行来启用单元测试:

      # Unit tests
      noinst_PROGRAMS = test_audio_manager
      
      test_audio_manager_SOURCES  = $(libadonthell_audio_la_SOURCES) test_audio_manager.cc
      test_audio_manager_CXXFLAGS = $(libadonthell_audio_la_CXXFLAGS)
      test_audio_manager_LDADD    = $(libadonthell_audio_la_LIBADD) -lgtest
      
      TESTS = test_audio_manager
      
    3. 现在,运行“make check”会触发单元测试!

    所有这些都可以在这里看到:http://github.com/ksterker/adonthell/commit/aacdb0fe22f59e61ef0f5986827af180c56ae9f3

    【讨论】:

      【解决方案3】:

      补充其他答案中的信息,您还可以指定多个测试到TESTS

      不管您指定了多少测试,您实际上不必指定它们两次,而只需将 TESTS 设置为 $(check_PROGRAMS) - 这有助于防止意外情况将您的测试添加到 check_PROGRAMS 但是忘记将其添加到 TESTS,导致您的新测试被添加到构建中,但从未由 make check 运行:

      # Unit tests
      check_PROGRAMS = test_audio_manager
      
      test_audio_manager_SOURCES  = test_audio_manager.cc
      
      TESTS = $(check_PROGRAMS)
      

      ...或者对多个测试做同样的事情:

      # Unit tests
      check_PROGRAMS = test_audio_manager test_video_manager
      
      test_audio_manager_SOURCES  = test_audio_manager.cc
      test_video_manager_SOURCES  = test_video_manager.cc
      
      TESTS = $(check_PROGRAMS)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-07
        • 1970-01-01
        • 2015-01-16
        • 1970-01-01
        相关资源
        最近更新 更多