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_test1
と my_test2
という2つのテストに「COST」プロパティを設定しています。
set_test_property(my_test1 PROPERTY COST 2)
set_test_property(my_test2 PROPERTY COST 1)
この設定の場合、my_test1
は my_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)
このコードでは、以下の処理が行われます。
- CMakeの最小バージョンを3.10に設定します。
myproject
という名前のプロジェクトを作成します。main.cpp
ファイルからmyprogram
という名前の実行ファイルを作成します。main.cpp
ファイルからmytest1
という名前のテストを追加します。mytest1
テストに「COST」プロパティを2に設定します。main.cpp
ファイルからmytest2
という名前のテストを追加します。mytest2
テストに「COST」プロパティを1に設定します。
この設定の場合、ctest
コマンドを実行すると、mytest1
テストが mytest2
テストよりも先に実行されます。
また、テストの実行順序を完全に制御するには、「COST」プロパティと併せて ctest_test_sort
コマンドを使用することができます。
代替方法
- カスタムテストランナーの使用
- 独自のテストランナーを作成し、テストの実行順序を制御することができます。
- テストの重要度に基づいた並行実行
- テストの重要度を手動で設定し、
set_test_property
コマンドを使用して各テストに「IMPORTANCE」プロパティを設定することができます。
- テストの重要度を手動で設定し、
- テストに必要なリソース量に基づいた並行実行
- テストの実行に必要なリソース量 (CPU、メモリ、ディスク I/O など) を計測し、
set_test_property
コマンドを使用して各テストに「RESOURCE」プロパティを設定することができます。
- テストの実行に必要なリソース量 (CPU、メモリ、ディスク I/O など) を計測し、
- テストの実行時間に基づいた並行実行
ctest_test_sort
コマンドを使用して、テストの実行時間を基づいてテストを並べ替えることができます。- テストの実行時間を計測し、
set_test_property
コマンドを使用して各テストに「TIME」プロパティを設定することができます。
各方法の利点と欠点
方法 | 利点 | 欠点 |
---|---|---|
テストの実行時間に基づく | シンプルで使いやすい | テストの実行時間の影響を受ける |
テストに必要なリソース量に基づく | リソース制約のある環境に適している | リソース使用量の計測が複雑になる場合がある |
テストの重要度に基づく | 重要なテストを優先的に実行できる | テストの重要度の評価が主観的になる場合がある |
カスタムテストランナーの使用 | 柔軟性が高い | 開発と保守の手間がかかる |
最適な方法の選択
最適な方法は、プロジェクトの要件と制約によって異なります。以下の点を考慮する必要があります。
- 開発リソース
- テストの重要度
- テストに必要なリソース量
- テストの実行時間
- テストスイートの規模