我想将Boost.Test用于测试驱动开发。

我要求scons创建两个可执行文件,主要是一个,测试是一个。
我所有的主要项目文件都在./src/中,我所有测试专用文件都在./test/

问题是:

  • 主要项目目标文件放在./build/src/
  • 将测试项目对象文件放在./build/test/


  • 在这种配置下,我的可执行Test无法链接,因为(我执行测试的类的)所有主要项目对象文件都不在同一目录中。

    您是否知道如何调整scons文件,以便链接可执行Test可以使用./src./中的目标文件?

    以下是我的main.scons文件:
    import os
    env=Environment(CPPPATH=['/usr/local/boost/boost_1_52_0/boost/','./src/'],
                    CPPDEFINES=[],
                    LIBPATH=['/usr/local/boost/boost_1_52_0/boost/libs/','.'],
                    LIBS=['boost_regex'],
                    CXXFLAGS="-std=c++0x")
    env['ENV']['TERM'] = os.environ['TERM']
    env.Program('Main', Glob('src/*.cpp'))
    
    #
    testEnv = env.Clone()
    testEnv['CPPPATH'].append('./test/')
    testEnv['LIBS'].append('boost_unit_test_framework')
    testEnv.Program('Test', Glob('test/*.cpp'))
    

    最佳答案

    尽管“重复对象列表”方法适用于简单项目,但是您可能会遇到一些限制,即测试代码不需要链接到主程序的整个对象空间。例如,存根不是特定单元测试重点的数据库层。

    作为替代方案,您可以创建(静态)通用代码库,将它们链接到主要可执行文件和测试框架。

    common_sources = ['src/foo.cpp', 'src/bar.cpp'] # or use Glob and then filter
    env.Library("common", common_sources)
    program_sources = ['src/main.cpp']
    env.Program("my_program", program_sources, LIBS=['common'])
    ...
    testEnv['LIBPATH'] = ['.']  # or wherever you build the library
    testEnv.Program("unit_test", test_sources, LIBS=['common'])
    

    这也避免了您提到的重复main()问题,因为只有program_sourcestest_sources列表应包含带有主例程的适当文件。

    09-10 04:01
    查看更多