我想使用Boost.Test进行测试驱动开发。
我让scons创建了两个可执行文件,主要文件和测试文件。
我的所有主项目文件都在./src/
,我的所有测试专用文件都在./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'))
答案 0 :(得分: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_sources
和test_sources
列表应包含主例程的相应文件。
答案 1 :(得分:0)
我继续搜索,发现This post on the web使用s 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)