3

テスト駆動開発に Boost.Test を使用したいと思います。

メインとテストの 2 つの実行可能ファイルを作成するように scons に依頼しました。すべてのメイン プロジェクト ファイルは に./src/あり、すべてのテスト専用ファイルは にあります。./test/

問題は:

  • メイン プロジェクト オブジェクト ファイルは ./build/src/ に配置されます
  • テスト プロジェクトのオブジェクト ファイルは ./build/test/ に配置されます。

このような構成では、(テストを実行するクラスの) すべてのメイン プロジェクト オブジェクト ファイルが同じディレクトリにないため、実行可能なテストをリンクできません。

実行可能 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'])

これにより、 andリストのみにメインルーチンの適切なファイルが含まれるmain()ため、言及した重複の問題も回避されます。program_sourcestest_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 に答える