CMake: テストソースファイルをまとめてテスト駆動プログラムに!create_test_sourcelist() コマンドの活用術


構文

create_test_sourcelist(VariableName DriverName test1 test2 test3 ... [EXTRA_INCLUDE include.h] [FUNCTION function])
  • FUNCTION: テスト駆動プログラムのエントリポイント関数の名前
  • EXTRA_INCLUDE: テスト駆動プログラムに追加するヘッダーファイル
  • test1, test2, test3: テストソースファイル
  • DriverName: テスト駆動プログラムの名前
  • VariableName: テストソースファイルのリストを格納する変数名

set(TestToRun ObjectFactory.cxx otherArrays.cxx otherEmptyCell.cxx TestSmartPointer.cxx SystemInformation.cxx ...)

create_test_sourcelist(Tests CommonCxxTests.cxx ${TestToRun})

add_executable(CommonCxxTests ${Tests})

foreach(test ${TestToRun})
  add_test(NAME ${test} COMMAND ${CommonCxxTests} ${test})
endforeach()

この例では、TestToRun 変数にテストソースファイルのリストを格納し、create_test_sourcelist() コマンドを使用してテスト駆動プログラム CommonCxxTests を作成します。その後、add_executable() コマンドを使用して実行ファイルを作成し、foreach ループを使用して各テストソースファイルに対して add_test() コマンドを実行します。

利点

  • テスト駆動プログラムを使用して、各テストにコマンドライン引数を渡すことができます。
  • 静的実行ファイルを作成する場合、ライブラリのサイズを小さくすることができます。
  • テスト駆動プログラムは、テストの実行に必要なライブラリをすべてリンクする必要があります。
  • テストソースファイルには、同じ名前の関数が必要です。
  • CMake には、テストを作成および実行するための他のコマンドも用意されています。
  • テスト駆動プログラムは、ctest コマンドを使用して実行できます。
  • create_test_sourcelist() コマンドは、CMake 3.0 以降で使用できます。
  • より詳細な情報については、CMake の公式ドキュメントを参照してください。


set(TestToRun add.cxx multiply.cxx)

create_test_sourcelist(Tests CommonCxxTests.cxx ${TestToRun})

add_executable(CommonCxxTests ${Tests})

foreach(test ${TestToRun})
  add_test(NAME ${test} COMMAND ${CommonCxxTests} ${test})
endforeach()

例 2: ヘッダーファイルの追加

この例では、EXTRA_INCLUDE オプションを使用して、テスト駆動プログラムにヘッダーファイルを追加します。

set(TestToRun ObjectFactory.cxx otherArrays.cxx otherEmptyCell.cxx TestSmartPointer.cxx SystemInformation.cxx ...)

create_test_sourcelist(Tests CommonCxxTests.cxx ${TestToRun} EXTRA_INCLUDE include/my_header.h)

add_executable(CommonCxxTests ${Tests})

foreach(test ${TestToRun})
  add_test(NAME ${test} COMMAND ${CommonCxxTests} ${test})
endforeach()

例 3: エントリポイント関数の指定

この例では、FUNCTION オプションを使用して、テスト駆動プログラムのエントリポイント関数を指定します。

set(TestToRun ObjectFactory.cxx otherArrays.cxx otherEmptyCell.cxx TestSmartPointer.cxx SystemInformation.cxx ...)

create_test_sourcelist(Tests CommonCxxTests.cxx ${TestToRun} FUNCTION my_test_function)

add_executable(CommonCxxTests ${Tests})

foreach(test ${TestToRun})
  add_test(NAME ${test} COMMAND ${CommonCxxTests} ${test})
endforeach()
  • より詳細な情報については、CMake の公式ドキュメントを参照してください。


代替方法

  • 手動でテストソースファイルを列挙する
add_executable(CommonCxxTests add.cxx multiply.cxx)

add_test(NAME add COMMAND CommonCxxTests add)
add_test(NAME multiply COMMAND CommonCxxTests multiply)

これは、テストソースファイルが少ない場合に適しています。

  • add_test() コマンドの SOURCES オプションを使用する
add_executable(CommonCxxTests)

add_test(NAME add SOURCES add.cxx)
add_test(NAME multiply SOURCES multiply.cxx)

これは、テストソースファイルとテストコマンドを別の行で指定したい場合に適しています。

  • file(GLOB) コマンドを使用する
file(GLOB TestToRun TEST_SOURCES "tests/*.cxx")

add_executable(CommonCxxTests ${TestToRun})

foreach(test ${TestToRun})
  add_test(NAME ${test} COMMAND ${CommonCxxTests} ${test})
endforeach()

これは、テストソースファイルがディレクトリ内に分散している場合に適しています。

方法利点欠点
手動でテストソースファイルを列挙するシンプルテストソースファイルが増えると煩雑になる
add_test() コマンドの SOURCES オプションを使用するテストソースファイルとテストコマンドを別々に指定できるコードが冗長になる
file(GLOB) コマンドを使用するテストソースファイルがディレクトリ内に分散している場合に便利ワイルドカードを使用するため、意図しないファイルを含めてしまう可能性がある
  • CTest の add_test コマンドを使用する

CTest は、CMake に付属するテスト実行ツールです。 add_test コマンドを使用して、テストソースファイルとテストコマンドを指定することができます。

  • サードパーティのテストフレームワークを使用する

Boost Test や Google Test などのサードパーティのテストフレームワークを使用することもできます。 これらのフレームワークは、より多くの機能を提供することがあります。

create_test_sourcelist() コマンドは便利なツールですが、状況によっては代替方法の方が適切な場合があります。 どの方法を選択するかは、プロジェクトのニーズと開発者の好みによって異なります。

  • より詳細な情報については、CMake の公式ドキュメントを参照してください。