CMakeの「Properties: Tests」における「COST」プロパティ:深く掘り下げる


CMakeの「Properties: Tests」における「COST」プロパティは、テストの実行コストを定義するために使用されます。テストの並行実行が有効な場合、このプロパティの値に基づいてテストセット内のテストが実行されます。値が高いテストほど優先的に実行されます。

「COST」プロパティの利点

  • テストの実行順序の制御
  • 重要なテストの優先的な実行
  • リソース制約のある環境でのテスト実行の優先順位付け
  • 大規模なテストスイートにおける実行時間の短縮

「COST」プロパティの設定方法

「COST」プロパティは、set_test_propertyコマンドを使用してテスト個別に設定できます。構文は以下の通りです。

set_test_property(TEST_NAME PROPERTY COST value)

ここで、

  • value は、テストのコストを表す数値です。
  • TEST_NAME は、プロパティを設定するテストの名前です。

「COST」プロパティの使用方法

テストの実行コストは、様々な要素によって算出できます。例えば、

  • テストの重要度
  • テストに必要なリソース量 (CPU、メモリ、ディスク I/O など)
  • テストの実行時間

以下の例では、my_test1my_test2 という2つのテストに「COST」プロパティを設定しています。

set_test_property(my_test1 PROPERTY COST 2)
set_test_property(my_test2 PROPERTY COST 1)

この設定の場合、my_test1my_test2 よりも優先的に実行されます。

  • テストの実行順序を完全に制御するには、「COST」プロパティと併せて ctest_test_sort コマンドを使用することができます。
  • すべてのテストに「COST」プロパティを設定する必要はありません。
  • 「COST」プロパティは、相対的な値であることに注意してください。絶対的な実行時間を表すものではありません。


cmake_minimum_required(VERSION 3.10)

project(myproject)

add_executable(myprogram main.cpp)

add_test(mytest1 main.cpp)
set_test_property(mytest1 PROPERTY COST 2)

add_test(mytest2 main.cpp)
set_test_property(mytest2 PROPERTY COST 1)

このコードでは、以下の処理が行われます。

  1. CMakeの最小バージョンを3.10に設定します。
  2. myproject という名前のプロジェクトを作成します。
  3. main.cpp ファイルから myprogram という名前の実行ファイルを作成します。
  4. main.cpp ファイルから mytest1 という名前のテストを追加します。
  5. mytest1 テストに「COST」プロパティを2に設定します。
  6. main.cpp ファイルから mytest2 という名前のテストを追加します。
  7. mytest2 テストに「COST」プロパティを1に設定します。

この設定の場合、ctest コマンドを実行すると、mytest1 テストが mytest2 テストよりも先に実行されます。

また、テストの実行順序を完全に制御するには、「COST」プロパティと併せて ctest_test_sort コマンドを使用することができます。



代替方法

  • カスタムテストランナーの使用
    • 独自のテストランナーを作成し、テストの実行順序を制御することができます。
  • テストの重要度に基づいた並行実行
    • テストの重要度を手動で設定し、set_test_property コマンドを使用して各テストに「IMPORTANCE」プロパティを設定することができます。
  • テストに必要なリソース量に基づいた並行実行
    • テストの実行に必要なリソース量 (CPU、メモリ、ディスク I/O など) を計測し、set_test_property コマンドを使用して各テストに「RESOURCE」プロパティを設定することができます。
  • テストの実行時間に基づいた並行実行
    • ctest_test_sort コマンドを使用して、テストの実行時間を基づいてテストを並べ替えることができます。
    • テストの実行時間を計測し、set_test_property コマンドを使用して各テストに「TIME」プロパティを設定することができます。

各方法の利点と欠点

方法利点欠点
テストの実行時間に基づくシンプルで使いやすいテストの実行時間の影響を受ける
テストに必要なリソース量に基づくリソース制約のある環境に適しているリソース使用量の計測が複雑になる場合がある
テストの重要度に基づく重要なテストを優先的に実行できるテストの重要度の評価が主観的になる場合がある
カスタムテストランナーの使用柔軟性が高い開発と保守の手間がかかる

最適な方法の選択

最適な方法は、プロジェクトの要件と制約によって異なります。以下の点を考慮する必要があります。

  • 開発リソース
  • テストの重要度
  • テストに必要なリソース量
  • テストの実行時間
  • テストスイートの規模