Я хотел бы использовать Boost.Test для разработки через тестирование.
Я попросил scons создать два исполняемых файла: основной и тестовый.
Все мои основные файлы проекта находятся в ./src/
и все мои тестовые файлы находятся в ./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_sources
а также test_sources
Списки должны содержать соответствующий файл с основной процедурой.
Я продолжил поиски и нашел Этот пост в сети что заинтриговало меня, используя 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)