【初心者向け】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

この Makefilemake 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 には、テストを実行するための組み込みサポートが含まれています。これは、テストをデバッグしたり、結果を視覚化したりするのに役立ちます。