テストの警告にさようなら!CTEST_CUSTOM_WARNING_EXCEPTIONでストレスフリーなテスト環境へ
使用方法
CTEST_CUSTOM_WARNING_EXCEPTION は、以下の形式で設定できます。
set(CTEST_CUSTOM_WARNING_EXCEPTION "regex")
ここで、regex は、抑制したい警告メッセージに一致する正規表現です。複数の正規表現を指定するには、スペースで区切って列挙できます。
例
以下の例では、MyWarning
という名前の警告を抑制します。
set(CTEST_CUSTOM_WARNING_EXCEPTION "MyWarning")
以下の例では、MyWarning
と AnotherWarning
という名前の警告を抑制します。
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
テストスイートを実行し、MyWarning
と AnotherWarning
という名前の警告を抑制します。
例 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: 複数の警告を抑制する
この例では、MyWarning
と AnotherWarning
という名前の警告を抑制する 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
テストスイート内のテストのみで MyWarning
と AnotherWarning
という名前の警告を抑制する 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
という名前の警告を引き起こさないようにしています。