概要
GoogleTest は成熟した C++ xUnit テストフレームワークであり、自動テスト検出、豊富なアサーション、デステスト、パラメータ化テスト、モック機能をサポートしています。多くの大規模オープンソースプロジェクトで広く採用されており、開発者が柔軟かつ便利にテストを作成・実行できるよう支援します。
README プレビュー
# GoogleTest\n\n### Announcements\n\n#### Documentation Updates\n\nOur documentation is now live on GitHub Pages at\nhttps://google.github.io/googletest/. We recommend browsing the documentation on\nGitHub Pages rather than directly in the repository.\n\n#### Release 1.18.0\n\n[Release 1.18.0](https://github.com/google/googletest/releases/tag/v1.18.0) is\nnow available.\n\nThe 1.18.x branch\n[requires at least C++17](https://opensource.google/documentation/policies/cplusplus-support#c_language_standard).\n\n#### Continuous Integration\n\nWe use Google's internal systems for continuous integration.\n\n#### Coming Soon\n\n* We are planning to take a dependency on\n [Abseil](https://github.com/abseil/abseil-cpp).\n\n## Welcome to **GoogleTest**, Google's C++ test framework!\n\nThis repository is a merger of the formerly separate GoogleTest and GoogleMock\nprojects. These were so closely related that it makes sense to maintain and\nrelease them together.\n\n### Getting Started\n\nSee the [GoogleTest User's Guide](https://google.github.io/googletest/) for\ndocumentation. We recommend starting with the\n[GoogleTest Primer](https://google.github.io/googletest/primer.html).\n\nMore information about building GoogleTest can be found at\n[googletest/README.md](googletest/README.md).\n\n## Features\n\n* xUnit test framework: \\n Googletest is based on the [xUnit](https://en.wikipedia.org/wiki/XUnit)\n testing framework, a popular architecture for unit testing.\n* Test discovery: \\n Googletest automatically discovers and runs your tests, eliminating the need\n to manually register your tests.\n* Rich set of assertions: \\n Googletest provides a variety of assertions, such as equality, inequality,\n exceptions, and more, making it easy to test your code.\n* User-defined assertions: \\n You can define your own assertions with Googletest, making it simple to\n write tests that are specific to your code.\n* Death tests: \\n Googletest supp
FAQ (5)
トラブル対応GoogleTest で --gtest_shuffle が有効になっている場合、UnitTest::GetTestSuite(i) が誤ったテストスイートを返すのはなぜですか?
UnitTestImpl::GetTestSuite(int i) は test_suite_indices_ からシャッフル後の位置を計算しますが、test_suites_ のインデックスに元の i を誤って使用しています。googletest/src/gtest-internal-inl.h で、以下を:
return test_suites_[i];
次のように変更してください:
return test_suites_[index];
mutable アクセサでは既に index が正しく使用されています。パッチを適用した後、GoogleTest を再ビルドし、テストバイナリを再リンクしてください。このバグはコミット bd851333 から存在しており、main のコミット 08da6214 で確認されました。
トラブル対応なぜGoogleTestのJSON出力は、各バイトを\u00XXとしてエスケープすることでUTF-8プロパティ値を破損させるのですか?
これは、プレーンな char が符号付きであるプラットフォームで発生します。JsonUnitTestResultPrinter::EscapeJson では、0x80 から 0xFF までの UTF-8 バイトが負の値になるため、ch < ' ' というチェックがそれらを JSON の制御文字として扱い、各バイトを個別にエスケープしてしまいます。
制御文字のチェックを行う前に、バイトを符号なしとして解釈することで修正します:
const unsigned char ch = static_cast<unsigned char>(str[i]);
if (ch < ' ') {
// Emit the needed \u00XX escape only for real ASCII control characters.
}
上位ビットがセットされたバイトはそのまま残し、有効な UTF-8 シーケンスが UTF-8 として書き込まれるようにする必要があります。" や \ など、JSON でエスケープが必須の文字は引き続きエスケープしてください。その後、libgtest と libgtest_main をリビルドするか、issue #5081 の修正を含む GoogleTest リリースにアップグレードしてください。
一時的な回避策として、RecordProperty、テスト名、ファイルパス、失敗メッセージで非 ASCII 文字を使用しないようにするか、JSON を後処理して誤って分割された UTF-8 シーケンスを再構成してください。
トラブル対応CMake FetchContent を使用した場合に発生する GoogleTest の LNK2038「'MTd_StaticDebug' が 'MDd_DynamicDebug' と一致しません」エラーを修正する方法
このエラーは、GoogleTest が静的デバッグ C ランタイム(/MTd)でビルドされているのに対し、実行ファイルが動的デバッグ C ランタイム(/MDd)を使用していることを意味します。
issue #5042 の修正を含む main コミットに GoogleTest をアップグレードしてください。この修正は GoogleTest がトップレベルプロジェクトの場合にのみ CRT 設定を上書きするため、FetchContent や add_subdirectory() 経由で利用する側は親プロジェクトの CRT 設定を継承します。
すぐに更新できない場合は、GoogleTest を宣言する前に共有 CRT を使用するように強制してください:
set(gtest_force_shared_crt ON CACHE BOOL "Use shared CRT for GoogleTest" FORCE)
include(FetchContent)
FetchContent_Declare(
googletest
GIT_REPOSITORY https://github.com/google/googletest
GIT_TAG main
)
FetchContent_MakeAvailable(googletest)
その後、ビルドディレクトリを削除して再構成してください:
Remove-Item -Recurse -Force build
cmake -S . -B build
cmake --build build
あるいは、すべてで静的 CRT を一貫して使用するには、ターゲットを作成して GoogleTest を追加する前に次を設定してください:
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")トラブル対応Linux または Fedora で GoogleTest をビルドする際に発生する「undefined reference to `regcompA`」エラーの修正方法
このエラーは、MinGW または Cygwin の regex.h ヘッダーが Linux のインクルードパスに混入した場合に発生します。このヘッダーは、regcomp、regexec、regfree などの POSIX 関数を regcompA のような Windows 形式の名前にマクロで置き換えますが、これらの名前は glibc には存在しません。CMake や GCC のバージョンは原因ではありません。
1. 混入したインクルードパスを確認します:
echo "$CPATH $C_INCLUDE_PATH $CPLUS_INCLUDE_PATH $CMAKE_INCLUDE_PATH"
echo | g++ -x c++ -E -Wp,-v -MinGW、Cygwin、
w64-mingw32、またはクロスコンパイラのインクルードディレクトリがないか確認してください。
2. それらを環境から削除し、ゼロから再ビルドします:
unset CPATH C_INCLUDE_PATH CPLUS_INCLUDE_PATH CMAKE_INCLUDE_PATH
rm -rf build
cmake -S . -B build
cmake --build build
問題のあるインクルードパスをすぐに削除できない場合は、POSIX regex の代わりに GoogleTest のシンプルな正規表現実装を使用するように強制します:
rm -rf build
cmake -S . -B build -DCMAKE_CXX_FLAGS='-DGTEST_HAS_POSIX_RE=0'
cmake --build build
恒久的な修正としては、issue #5001 の修正を含む新しいリリースまたはコミットへ GoogleTest を更新してください。この修正では、マクロで再定義された POSIX regex シンボルを検出し、自動的に SIMPLE_RE にフォールバックします。
トラブル対応C++14 で GoogleTest をビルドする際に発生する [[maybe_unused]] に対する -Wc++17-attribute-extensions 警告を修正するにはどうすればよいですか?
GoogleTest 1.15.x は C++17 を必要とするため、C++14 ではなく C++17 でビルドしてください:
CXXFLAGS="-Werror -Wall -Wextra -Wpedantic" cmake -S . -B /tmp/gtestbuildfolder -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_STANDARD_REQUIRED=ON
cmake --build /tmp/gtestbuildfolder
この警告は、[[maybe_unused]] 属性が C++17 で導入されたにもかかわらず、Apple Clang がコンパイラ拡張として C++14 でも [[maybe_unused]] を公開しているために発生します。
古いバージョンの GoogleTest を C++14 でコンパイルする必要がある場合は、GTEST_INTERNAL_HAVE_CPP_ATTRIBUTE マクロが __cplusplus もチェックするようにパッチを適用してください:
#if defined(__has_cpp_attribute)
#define GTEST_INTERNAL_HAVE_CPP_ATTRIBUTE(x) (__cplusplus >= __has_cpp_attribute(x))
#else
#define GTEST_INTERNAL_HAVE_CPP_ATTRIBUTE(x) 0
#endif
推奨される修正方法は、C++17 を使用するか、GoogleTest をアップグレードすることです。