OpenSource-Hub

googletest

フレームワーク

google/googletest

ユニットテストのための Google の C++ テストおよびモックフレームワーク。

概要

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 で確認されました。

参照 Issue #5040
トラブル対応
なぜ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 シーケンスを再構成してください。

参照 Issue #5081
トラブル対応
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>")

参照 Issue #5042
トラブル対応
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 にフォールバックします。

参照 Issue #5001
トラブル対応
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 をアップグレードすることです。

参照 Issue #4605