C++ 编写Makefile.am调用googletest单元测试

C++ 编写Makefile.am调用googletest单元测试,c++,unit-testing,makefile,automake,googletest,C++,Unit Testing,Makefile,Automake,Googletest,我正在尝试将我的第一个单元测试添加到现有的开源项目中。具体来说,我添加了一个新类,名为audio_manager: src/audio/audio_manager.h src/audio/audio_manager.cc 我创建了一个src/test目录结构,它反映了实现文件的结构,并编写了我的单元测试: src/test/audio/audio_manager.cc # Unit tests noinst_PROGRAMS = test_audio_manager test_audio_

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

src/audio/audio_manager.h
src/audio/audio_manager.cc
我创建了一个src/test目录结构,它反映了实现文件的结构,并编写了我的单元测试:

src/test/audio/audio_manager.cc
# 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
现在,我正在尝试设置Makefile.am以编译和运行单元测试:

src/test/audio/Makefile.am
我从以下位置复制了Makefile.am:

src/audio/Makefile.am

有没有人给我一个简单的食谱,或者是给我一个神秘的汽车制造文档

如果现有项目已经有了测试结构,那么您只需添加:

TESTS += audio_manager 测试+=音频管理器 到现有测试/Makefile.am。如果现有项目没有适当的测试结构,您应该为山而尖叫

如果跑山是不可接受的,那么在使测试结构就位方面有相当多的工作要做,但这不是不可克服的。您可能更喜欢将测试作为src的兄弟,但这不是必需的。从一个新的Makefile.am开始可能比从src复制Makefile.am更容易,但可能不是。您可能只需要更改表单的行:

bin_PROGRAMS = ... bin_程序=。。。 到

检查程序=。。。 添加行

TESTS = test-audio-manager 测试=测试音频管理器 将audio_umanager.cc的名称更改为test-audio-manager.cc(这不是绝对必要的,但有助于维护。我更改为-纯粹出于个人喜好),并添加一个

SUBDIRS = tests/audio 细分=测试/音频
到src/Makefile.am。(如果已经有了SUBDIRS指令,请附加到该赋值或使用+=)

威廉的回答让我明白了我需要做的事情。为了社区的利益,我最终做了以下几件事:

  • 根据William的建议,我将测试移回主目录结构,并预先设置了测试
  • 我在src/audio/Makefile.am中添加了几行代码以启用单元测试:

    src/test/audio/audio_manager.cc
    
    # 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
    
  • 现在,运行“makecheck”启动单元测试


  • 所有这些都可以在这里看到:

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

    无论您指定了多少个测试,实际上您不必两次指定它们,只需将
    测试设置为
    $(check\u PROGRAMS)
    -这有助于防止意外情况,即将测试添加到
    check\u PROGRAMS
    ,但忘记将其添加到
    测试中,使您的新测试添加到生成中,但从未由
    进行检查
    运行:

    # 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)
    

    感谢你让每个人都从这里开始:)