3

我想使用 Boost.Test 进行测试驱动开发。

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

问题是:

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

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

您知道如何调整我的 scons 文件,以便可执行测试的链接可以使用中的目标文件./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'))
4

2 回答 2

1

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

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

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_sourcesandtest_sources列表应该包含带有主例程的适当文件。

于 2013-02-06T23:50:18.450 回答
0

我继续搜索,并使用 scons在网络上找到了这个env.Object引起我兴趣的帖子。实际上,该对象包含所有目标对象文件的列表。

稍作修改,我就有了 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']

# here I keep track of the main project object files
mainObjectFiles = env.Object( Glob('src/*.cpp')) 

env.Program('PostgresCpp', mainObjectFiles)

#
testEnv = env.Clone()
testEnv['CPPPATH'].append('./test/')
testEnv['LIBS'].append('boost_unit_test_framework')

# here I append all needed object files
testObjectFiles =  Glob('test/*.cpp')
testedObjectFiles = Glob('src/*.cpp')
allObjectFilesExceptMain = [x for x in mainObjectFiles if x != 'src/main.o']
allObjectFilesExceptMain.append(testObjectFiles)

testEnv.Program('Test',allObjectFiles)
于 2013-02-06T23:21:24.307 回答