テストの警告にさようなら!CTEST_CUSTOM_WARNING_EXCEPTIONでストレスフリーなテスト環境へ


使用方法

CTEST_CUSTOM_WARNING_EXCEPTION は、以下の形式で設定できます。

set(CTEST_CUSTOM_WARNING_EXCEPTION "regex")

ここで、regex は、抑制したい警告メッセージに一致する正規表現です。複数の正規表現を指定するには、スペースで区切って列挙できます。

以下の例では、MyWarning という名前の警告を抑制します。

set(CTEST_CUSTOM_WARNING_EXCEPTION "MyWarning")

以下の例では、MyWarningAnotherWarning という名前の警告を抑制します。

set(CTEST_CUSTOM_WARNING_EXCEPTION "MyWarning AnotherWarning")

注意点

  • CTEST_CUSTOM_WARNING_EXCEPTION を使用する場合、抑制する警告メッセージが実際に問題ではないことを確認してください。
  • 警告メッセージを抑制することは、潜在的な問題を隠蔽する可能性があることに注意してください。警告メッセージは、コードに問題があることを示している可能性があるため、調査して修正することが重要です。
  • CTEST_CUSTOM_WARNING_EXCEPTION は、テストランナー CTest にのみ適用されます。ビルドプロセス中には使用できません。

CTEST_CUSTOM_WARNING_EXCEPTION は、テストスイートの特定の部分にのみ適用したい場合に役立ちます。これを行うには、CTest の ctest_test コマンドの -Wno-custom オプションを使用できます。

ctest_test my_test_suite -Wno-custom "MyWarning AnotherWarning"

このコマンドは、my_test_suite テストスイートを実行し、MyWarningAnotherWarning という名前の警告を抑制します。



例 1: 特定の警告を抑制する

この例では、MyWarning という名前の警告を抑制する CMakeLists.txt ファイルを示します。

cmake_minimum_required(VERSION 3.10)

project(MyProject)

add_executable(MyProgram main.cpp)

target_link_libraries(MyProgram MyLibrary)

# MyWarning という名前の警告を抑制する
set(CTEST_CUSTOM_WARNING_EXCEPTION "MyWarning")

# テストを実行する
add_test(MyTest MyProgram)

例 2: 複数の警告を抑制する

この例では、MyWarningAnotherWarning という名前の警告を抑制する CMakeLists.txt ファイルを示します。

cmake_minimum_required(VERSION 3.10)

project(MyProject)

add_executable(MyProgram main.cpp)

target_link_libraries(MyProgram MyLibrary)

# MyWarning と AnotherWarning という名前の警告を抑制する
set(CTEST_CUSTOM_WARNING_EXCEPTION "MyWarning AnotherWarning")

# テストを実行する
add_test(MyTest MyProgram)

例 3: テストスイートの一部にのみ警告を抑制する

この例では、my_test_suite テストスイート内のテストのみで MyWarningAnotherWarning という名前の警告を抑制する CMakeLists.txt ファイルを示します。

cmake_minimum_required(VERSION 3.10)

project(MyProject)

add_executable(MyProgram main.cpp)

target_link_libraries(MyProgram MyLibrary)

# テストスイートを作成する
add_test_suite(MyTestSuite)

# テストケースを追加する
add_test(MyTest1 MyProgram)
add_test(MyTest2 MyProgram)

# テストスイートの一部にのみ警告を抑制する
ctest_test(MyTestSuite -Wno-custom "MyWarning AnotherWarning")


CTest の -Wno オプション

CTest の -Wno オプションを使用して、特定の警告を抑制することができます。このオプションは、CTEST_CUSTOM_WARNING_EXCEPTION と同様に、テスト実行中に発生する特定の警告メッセージを抑制するように指示します。

長所

  • CTEST_CUSTOM_WARNING_EXCEPTION を使用するよりも柔軟性が高い
  • シンプルで使いやすい

短所

  • CMakeLists.txt ファイルではなく、コマンドラインで指定する必要がある
  • テストスイート全体に適用されるため、特定のテストケースにのみ警告を抑制することはできません


ctest -Wno MyWarning my_test_suite

このコマンドは、my_test_suite テストスイートを実行し、MyWarning という名前の警告を抑制します。

カスタム警告ハンドラーを使用する

カスタム警告ハンドラーを作成して、特定の警告を処理することができます。このハンドラーは、警告メッセージを検査し、必要なアクションを実行するようにプログラムできます。

長所

  • 警告メッセージをログに記録したり、エラーとして報告したりすることができます
  • 警告メッセージをより細かく制御できる

短所

  • CTEST_CUSTOM_WARNING_EXCEPTION よりも複雑


#include <gtest/gtest.h>

class MyCustomWarningHandler : public testing::TestEventListener {
public:
  void OnTestPartWarning(TestPart* part, const std::string& message) override {
    if (message.find("MyWarning") != std::string::npos) {
      // 警告メッセージを処理する
    }
  }
};

TEST(MyTest, MyTest) {
  // ...
}

int main(int argc, char** argv) {
  testing::InitGoogleTest(&argc, argv);

  MyCustomWarningHandler handler;
  testing::TestEventListener* listener = &handler;
  testing::GTEST_FLAG(gtest_listeners) = listener;

  return RUN_ALL_TESTS();
}

この例では、MyCustomWarning という名前の警告を処理するカスタム警告ハンドラーを作成しています。このハンドラーは、OnTestPartWarning メソッドで警告メッセージを検査し、必要なアクションを実行します。

テストコードを変更する

場合によっては、テストコードを変更して警告を回避することが最善の方法です。警告メッセージの原因となっているコードを特定し、修正することができます。

長所

  • 将来的に警告が発生するのを防ぐ
  • 根本的な問題を解決する

短所

  • 常に可能とは限らない


#include <gtest/gtest.h>

TEST(MyTest, MyTest) {
  // 警告を引き起こすコードを修正する
}

この例では、MyTest テストケースのコードを修正して、MyWarning という名前の警告を引き起こさないようにしています。