【初心者向け】CMakeのテスト実行コマンド「ctest_test()」の使い方をわかりやすく解説
ctest_test()
コマンドは、CMake で生成されたビルツリー内のテストを実行するために使用されます。テスト結果は Test.xml
ファイルに保存され、ctest_submit()
コマンドを使用してダッシュボードサーバーに送信できます。
構文
ctest_test([BUILD <build-dir>] [APPEND] [START <start-number>] [END <end-number>]
[STRIDE <stride-number>] [EXCLUDE <exclude-regex>] [INCLUDE <include-regex>]
[EXCLUDE_LABEL <label-exclude-regex>] [INCLUDE_LABEL <label-include-regex>]
[PARALLEL_LEVEL <level>] [TEST_LOAD <threshold>] [SCHEDULE_RANDOM <ON|OFF>]
[STOP_ON_FAILURE] [STOP_TIME <time-of-day>] [RETURN_VALUE <result-var>]
[CAPTURE_CMAKE_ERROR <result-var>] [REPEAT <mode>:<n>] [OUTPUT_JUNIT <file>] [QUIET])
オプション
- QUIET: 標準出力への出力を抑制します。
- OUTPUT_JUNIT <file>: JUnit 形式でテスト結果を出力します。
- REPEAT <mode>:<n>: 各テストを最大
n
回実行します。テストがタイムアウトした場合のみ繰り返します。 - CAPTURE_CMAKE_ERROR <result-var>: CMake エラーメッセージを変数に格納します。
- RETURN_VALUE <result-var>: 終了ステータスを変数に格納します。
- STOP_TIME <time-of-day>: 指定された時刻になったら停止します。
- STOP_ON_FAILURE: テストが失敗したら停止します。
- SCHEDULE_RANDOM <ON|OFF>: テストをランダム順序で実行します。
- TEST_LOAD <threshold>: 並列にテストを実行する場合、CPU 負荷が指定されたしきい値を超えないようにします。
- PARALLEL_LEVEL <level>: 並列に実行するテストの数を指定します。
- INCLUDE_LABEL <label-include-regex>: 一致するテストラベルを含む正規表現を指定します。一致しないテストは除外されます。
- EXCLUDE_LABEL <label-exclude-regex>: 一致するテストラベルを除外する正規表現を指定します。
- INCLUDE <include-regex>: 一致するテスト名を含む正規表現を指定します。一致しないテストは除外されます。
- EXCLUDE <exclude-regex>: 一致するテスト名を除外する正規表現を指定します。
- STRIDE <stride-number>: テスト番号の範囲を跨るステップ数を指定します。
- END <end-number>: テスト番号の範囲の終了を指定します。
- START <start-number>: テスト番号の範囲の開始を指定します。
- APPEND: 最後の
ctest_start()
呼び出し以降にダッシュボードサーバーに送信された結果にTest.xml
を追加するようにマークします。 - BUILD <build-dir>: ビルツリーのトップレベルディレクトリを指定します。指定されていない場合は、
CTEST_BINARY_DIRECTORY
変数が使用されます。
例
次の例では、mybuild
ディレクトリ内のすべてのテストを実行し、結果を Test.xml
ファイルに保存します。
ctest_test(BUILD mybuild)
次の例では、test1
および test2
という名前のテストのみを実行します。
ctest_test(INCLUDE test1 test2)
次の例では、label1
または label2
というラベルを持つテストのみを実行します。
ctest_test(INCLUDE_LABEL label1 label2)
次の例では、4 つの並列プロセスでテストを実行します。
ctest_test(PARALLEL_LEVEL 4)
ctest_test()
コマンドの詳細については、CMake のドキュメントを参照してください:
- テスト結果は、
ctest
コマンドを使用して表示できます。 - テストを実行するには、まず
add_test()
コマンドを使用してテストを定義する必要があります。 ctest_test()
コマンドは、CMake で生成されたビルツリー内でのみ使用できます。
- `ctest
例 1: すべてのテストを実行する
次のコードは、mybuild
ディレクトリ内のすべてのテストを実行します。
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(myproject)
add_executable(myprogram main.cpp)
add_test(mytest myprogram)
ctest_test(BUILD mybuild)
このコードを実行すると、次の出力が表示されます。
Test #1: mytest (1 tests)
Test started.
Running: /path/to/mybuild/myprogram
Test #1: PASSED (0.01 seconds)
1 test passed in 0.01 seconds.
ctest finished.
例 2: 特定のテストを実行する
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(myproject)
add_executable(myprogram main.cpp)
add_test(test1 myprogram)
add_test(test2 myprogram)
ctest_test(INCLUDE test1 test2)
Test #1: test1 (1 tests)
Test started.
Running: /path/to/mybuild/myprogram
Test #1: PASSED (0.01 seconds)
Test #2: test2 (1 tests)
Test started.
Running: /path/to/mybuild/myprogram
Test #2: PASSED (0.02 seconds)
2 tests passed in 0.03 seconds.
ctest finished.
例 3: テストラベルを使用してテストを実行する
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(myproject)
add_executable(myprogram main.cpp)
add_test(test1 myprogram LABELS label1)
add_test(test2 myprogram LABELS label2)
ctest_test(INCLUDE_LABEL label1 label2)
Test #1: test1 (1 tests)
Test started.
Running: /path/to/mybuild/myprogram
Test #1: PASSED (0.01 seconds)
Test #2: test2 (1 tests)
Test started.
Running: /path/to/mybuild/myprogram
Test #2: PASSED (0.02 seconds)
2 tests passed in 0.03 seconds.
ctest finished.
例 4: 並列処理でテストを実行する
次のコードは、4 つの並列プロセスでテストを実行します。
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(myproject)
add_executable(myprogram main.cpp)
add_test(mytest myprogram)
ctest_test(PARALLEL_LEVEL 4)
Test #1: mytest (1 tests)
Test started.
Running: /path/to/mybuild/myprogram (process 1)
Running: /path/to/mybuild/myprogram (process 2)
Running: /path/to/mybuild/myprogram (process 3)
Running: /path/to/mybuild/myprogram (process 4)
Test #1: PASSED (0.01 seconds)
1 test passed in 0.01 seconds.
ctest finished.
これらの例は、ctest_test()
コマンドの使用方法をほんの一例です。詳細については、CMake のドキュメントを参照してください:
- テストを実行するには、まず
add_test()
コマンドを使用してテストを定義する必要があります。
make test を使用する
make test
コマンドは、Makefile
で定義されたすべてのテストを実行します。これは、シンプルなプロジェクトの場合に適しています。
例
all: myprogram
myprogram: main.cpp
$(CC) main.cpp -o myprogram
test: myprogram
./myprogram
この Makefile
で make test
を実行すると、myprogram
テストが実行されます。
ctest コマンドの他のオプションを使用する
ctest
コマンドには、ctest_test()
コマンドよりも多くのオプションと機能が用意されています。たとえば、次のコマンドを使用して、特定のテストを実行できます。
ctest -R test1 test2
カスタムスクリプトを使用する
テストを実行するカスタムスクリプトを作成することもできます。これは、複雑なロジックや条件処理が必要な場合に役立ちます。
例
import os
def run_tests():
for root, _, files in os.walk('build'):
for filename in files:
if filename.endswith('.test'):
test_path = os.path.join(root, filename)
print(f"Running test: {test_path}")
os.system(f"{test_path}")
if __name__ == '__main__':
run_tests()
このスクリプトは、build
ディレクトリ内のすべての .test
ファイルを実行します。
テストランナーを使用する
テストランナーは、テストを実行し、結果を報告するためのツールです。いくつかの異なるテストランナーが利用可能ですが、最も人気のあるものは Boost Test と Google Test です。
Boost Test
Boost Test は、C++ 用のテストフレームワークです。 CMake と簡単に統合できます。
例
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(myproject)
add_executable(myprogram main.cpp)
add_test(mytest myprogram BOOST_TEST_MODULE_TEST mytest.cpp)
target_link_libraries(myprogram Boost::Test)
このコードを実行すると、Boost Test フレームワークを使用して mytest.cpp
ファイル内のテストが実行されます。
Google Test
Google Test は、C++ 用のもう 1 つのテストフレームワークです。 Boost Test よりも軽量で、より使いやすいとされています。
例
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(myproject)
add_executable(myprogram main.cpp)
add_test(mytest myprogram GTEST_SOURCE_PATH mytest.cpp)
target_link_libraries(myprogram gtest)
IDE を使用する
多くの IDE には、テストを実行するための組み込みサポートが含まれています。これは、テストをデバッグしたり、結果を視覚化したりするのに役立ちます。