This guide is for build engineers, toolchain owners, library integrators, and contributors who need to understand GoogleTest's architecture, integrate it into larger build systems, control it in CI, harden it, and reason about its internals. It complements the User Guide, which covers day-to-day test authoring.
GoogleTest is a header-rich, statically-linked C++ library with no runtime services, no network surface, and no daemon. Its "operations" are therefore build-time integration, CI configuration, and version management rather than deployment in the conventional sense.
1. Executive Summary
| Aspect | Detail |
|---|---|
| What it is | Google's C++ unit-testing + mocking framework (gtest + gmock), merged into one repo |
| Language standard | C++17 minimum (the 1.17.x line) |
| Distribution | Source; consumed via CMake FetchContent, Bazel (BCR), or pkg-config; compiled into the consumer |
| Runtime dependencies | None required. Optional: Abseil + RE2 (richer regex, flags, stack traces) |
| Build systems | Bazel (first-class, maintainer-used) and CMake (community-maintained) |
| Supported platforms | Linux, macOS, Windows, plus POSIX, Cygwin, QNX, FreeBSD, OpenBSD; Fuchsia unofficial |
| Threading | Thread-safe where pthreads is available; assertions from multiple threads are unsupported on some systems (e.g. Windows) |
| License | BSD 3-Clause (notice) |
| Output formats | Console (colored), JUnit XML, JSON |
Operational posture: the only "production" concern is correctness of
integration — pinning a version, wiring it into the build, and configuring CI
flags. There is nothing to deploy, monitor, or secure at runtime in the usual
sense, because GoogleTest code only ever runs inside your test binaries, never
in shipped production binaries (assuming you keep test targets testonly).
2. Architecture
2.1 Two libraries, one repository
The repository is a merger of two formerly separate projects:
googletest/ (repo root)
├── googletest/ <- gtest: the testing framework
│ ├── include/gtest/ public headers (the macro + class API)
│ │ └── internal/ implementation-detail headers (not a public API)
│ ├── src/ the .cc implementation
│ ├── samples/ worked examples (sample1..sample10)
│ ├── cmake/ CMake helper files + .pc.in templates
│ └── test/ the framework's own self-tests
├── googlemock/ <- gmock: the mocking library (depends on gtest)
│ ├── include/gmock/ public headers
│ │ └── internal/ implementation-detail headers
│ ├── src/ the .cc implementation
│ └── test/ self-tests
├── docs/ <- the canonical user/reference documentation (Jekyll site)
├── ci/ <- presubmit scripts (linux/macos/windows)
├── CMakeLists.txt <- top-level CMake (community-maintained)
├── BUILD.bazel, MODULE.bazel, WORKSPACE* <- Bazel build
└── .clang-format, CONTRIBUTING.md, LICENSE
Note
The
googletest/docs/README.mdandgooglemock/docs/README.mdare stubs that redirect to the top-leveldocs/directory — that is the single source of the documentation, also published at https://google.github.io/googletest/.
2.2 Component model
GoogleTest has no servers or processes; its "architecture" is a set of cooperating classes and a registration mechanism.
InitGoogleTest(argc, argv) parses --gtest_* flags
│
▼
TEST/TEST_F/TEST_P ──► auto-registration ──► UnitTest (singleton)
macros generate (static init) │
Test subclasses ▼
RUN_ALL_TESTS()
│
┌───────────────────────────────────────────────┤
▼ ▼ ▼
TestSuite objects ◄── owns ── TestInfo objects TestEventListeners
│ │ │ (fan-out)
▼ ▼ ▼
SetUpTestSuite() Test fixture lifecycle default printer +
TearDownTestSuite() (ctor→SetUp→body→TearDown→dtor) XML/JSON generator
│
▼
TestResult / TestPartResult (per-assertion outcomes)
Key runtime types (all in namespace testing, declared in
googletest/include/gtest/gtest.h):
| Type | Role |
|---|---|
UnitTest |
Singleton holding the whole test program's state; UnitTest::GetInstance() |
TestSuite |
A group of tests; tracks pass/fail/skip counts and timing |
TestInfo |
Metadata for one test (suite name, name, file, line, type/value params) |
Test |
Abstract base all fixtures inherit from; defines SetUp/TearDown hooks |
TestResult / TestPartResult |
Outcome of a test / a single assertion |
TestEventListener / TestEventListeners |
The observer API for progress + output |
Environment |
Global program-level setup/teardown |
AssertionResult |
Carries success/failure + message; the basis of custom predicates |
2.3 Registration and execution flow
TEST*macros expand to a class deriving fromTest(or a fixture) and a static registrar that adds aTestInfoto the globalUnitTest. No manual test listing is ever required.InitGoogleTest(&argc, argv)parses and strips recognized--gtest_*flags.RUN_ALL_TESTS()saves flag state, then for each test: constructs the fixture, callsSetUp(), runs the body, callsTearDown(), destroys the fixture, and restores flag state. A fatal failure skips remaining steps of that test only.- Listeners receive
On*Start/On*Endevents; the default console printer and XML/JSON generators are themselves listeners and can be removed or replaced.
2.4 The event-listener extension point
TestEventListener is the primary extension API. Subclass
EmptyTestEventListener and override only the events you care about
(OnTestStart, OnTestPartResult, OnTestEnd, OnTestIterationStart, etc.),
then listeners().Append(...). This is how teams build custom reporters, TAP
output, GUIs, leak checkers, or database sinks. The default text printer can be
detached via listeners().Release(listeners().default_result_printer()).
Important
A listener that handles
OnTestPartResult()must not itself generate failures, and must be ordered before listeners that can. Failures raised inOnTestPartResult()would recurse.
2.5 Death-test architecture
Death tests spawn a child process to verify a crash/exit:
- POSIX:
fork()(orclone()on Linux) the child. In"fast"style the statement runs immediately in the child; in"threadsafe"style the child re-executes the test binary with flags that run only the single death test. - Windows: the child is spawned with
CreateProcess()and re-executes the binary — equivalent to POSIX"threadsafe".
clone() (not fork()) is used on Linux because forking with multiple parent
threads risks the child hanging. Suites containing death tests should be named
*DeathTest so GoogleTest runs them before other suites.
3. Build & Integration Mastery
3.1 CMake options
The top-level CMakeLists.txt exposes these cache options:
| Option | Default | Effect |
|---|---|---|
BUILD_GMOCK |
ON |
Build the googlemock subproject (which also builds googletest). Set OFF to build gtest only. |
INSTALL_GTEST |
ON |
Enable install rules. Turn OFF when embedding GoogleTest inside a larger project so you don't pollute the install tree. |
GTEST_HAS_ABSL |
OFF |
Use Abseil + RE2 (must be added to the build separately via find_package(absl) / find_package(re2)). |
gtest_force_shared_crt |
(per-project) | On Windows/MSVC, force use of the shared C runtime so settings don't clash with the parent project. |
cmake -S . -B build -DBUILD_GMOCK=OFF -DINSTALL_GTEST=OFF
Note
CMAKE_CXX_EXTENSIONSis forced OFF by the build except on Cygwin, MSYS, and QNX. Minimum CMake is 3.16 for building GoogleTest itself; consumers usingFetchContentneed 3.14+.
The imported/installed targets are GTest::gtest, GTest::gtest_main,
GTest::gmock, GTest::gmock_main. The CMake GoogleTest module provides
gtest_discover_tests(<target>) to register each test with CTest.
Caution
CMake support is community-based — the maintainers do not use CMake internally (per the comment at the top of
CMakeLists.txt). For the most robust experience, Bazel is the reference build. Track CMake-specific issues (e.g. #4616, #4718, #4925, #3771) accordingly.
3.2 Bazel
The canonical build. MODULE.bazel declares the module and its direct deps:
module(name = "googletest", version = "head", compatibility_level = 1)
bazel_dep(name = "abseil-cpp", version = "20260107.0")
bazel_dep(name = "platforms", version = "0.0.11")
bazel_dep(name = "re2", version = "2025-11-05.bcr.1")
bazel_dep(name = "rules_cc", version = "0.2.8")
bazel_dep(name = "rules_python", version = "1.3.0", dev_dependency = True)
Consumers add bazel_dep(name = "googletest", version = "1.17.0") and depend on
@googletest//:gtest and @googletest//:gtest_main.
Targets defined in BUILD.bazel:
| Target | Purpose |
|---|---|
:gtest |
The combined gtest + gmock library (use for any test) |
:gtest_main |
main() for tests (srcs = googlemock/src/gmock_main.cc) — note the unified main lives in gmock |
:gtest_for_library |
testonly alias of :gtest for libraries that are themselves test-only |
:gtest_prod |
Header-only target exposing the FRIEND_TEST macro for production code |
:gtest_sample_lib, :gtest_samples, :sample9_unittest, :sample10_unittest |
The bundled samples |
Platform-aware build logic (select() in BUILD.bazel):
copts/linkoptsadd-pthreadeverywhere except QNX and Windows; QNX adds-lregex; FreeBSD/OpenBSD add-lm -pthread.config_settings exist forqnx,windows,freebsd,openbsd,fuchsia,msvc_compiler, andhas_absl.- With
--define absl=1,GTEST_HAS_ABSL=1is defined and the Abseil/RE2 deps are linked (flat_hash_set, failure_signal_handler, stacktrace, symbolize, flags, strings, re2). - Fuchsia (unofficial) links
@fuchsia_sdk//pkg/fdio+pkg/zxsogtest-death-test.cc'sEXPECT_DEATHcompiles.
Tip
Pass the C++ standard explicitly to Bazel:
--cxxopt=-std=c++17(Clang/GCC) or--cxxopt=/std:c++17(MSVC). The default compiler setting may be older than C++17.
3.3 pkg-config
GoogleTest installs .pc templates (gtest.pc.in, gtest_main.pc.in,
gmock.pc.in, gmock_main.pc.in). The generated gtest.pc looks like:
Name: gtest
Description: GoogleTest (without main() function)
Version: <PROJECT_VERSION>
Libs: -L${libdir} -lgtest -lpthread
Cflags: -I${includedir} -DGTEST_HAS_PTHREAD=1
Important
Always consume
Cflags/Libswhole (${GTEST_CFLAGS}/${GTEST_LDFLAGS}in CMake). Splitting them into include-dirs and libraries drops-pthreadand-DGTEST_HAS_PTHREAD=1, which causes link errors or subtle threading bugs. For cross-compilation, setPKG_CONFIG_SYSROOT_DIRandPKG_CONFIG_LIBDIRso-I/-Lpaths are rewritten into the sysroot.
3.4 Choosing libraries
| You build | Link |
|---|---|
A test with GoogleTest's main() |
gtest_main |
A test with your own main() |
gtest |
A test using mocks + ready main() |
gmock_main |
A test using mocks + own main() |
gmock (which pulls in gtest) |
Production code needing FRIEND_TEST |
gtest_prod (header only) |
4. Configuration Reference
GoogleTest is configured at three layers: compile-time macros, command-line flags, and environment variables. Flags override the matching environment variable.
4.1 Runtime flags and environment variables
| Flag | Env var | Default | Purpose |
|---|---|---|---|
--gtest_list_tests |
— | off | List tests and exit (overrides other flags) |
--gtest_filter=PAT |
GTEST_FILTER |
* |
Run only matching tests |
--gtest_also_run_disabled_tests |
GTEST_ALSO_RUN_DISABLED_TESTS |
off | Include DISABLED_ tests |
--gtest_fail_fast |
GTEST_FAIL_FAST |
off | Stop at first failure |
--gtest_fail_if_no_test_linked |
GTEST_FAIL_IF_NO_TEST_LINKED |
off | Fail if no test case is linked in |
--gtest_fail_if_no_test_selected |
GTEST_FAIL_IF_NO_TEST_SELECTED |
off | Fail if no test actually ran |
--gtest_repeat=N |
GTEST_REPEAT |
1 | Repeat tests N times (-1=forever) |
--gtest_shuffle |
GTEST_SHUFFLE |
off | Randomize test order |
--gtest_random_seed=N |
GTEST_RANDOM_SEED |
0 (time-based) | Fix shuffle seed (0–99999) |
--gtest_recreate_environments_when_repeating |
— | true | Re-run global env setup/teardown each iteration |
--gtest_color=(yes|no|auto) |
GTEST_COLOR |
auto | Colored output |
--gtest_brief=1 |
GTEST_BRIEF |
0 | Print only failures |
--gtest_print_time=0 |
GTEST_PRINT_TIME |
1 | Suppress per-test timing |
--gtest_print_utf8=0 |
GTEST_PRINT_UTF8 |
1 | Suppress UTF-8 rendering of strings |
--gtest_output=(xml|json)[:path] |
GTEST_OUTPUT |
none | Emit XML/JSON report |
--gtest_break_on_failure |
GTEST_BREAK_ON_FAILURE |
off | Trap into debugger on failure |
--gtest_catch_exceptions=0 |
GTEST_CATCH_EXCEPTIONS |
1 | Whether GoogleTest catches test-thrown exceptions |
--gtest_death_test_style=(fast|threadsafe) |
— | fast | Death-test execution style |
--gmock_catch_leaked_mocks=0 |
— | 1 | Report leaked mocks as failures |
--gmock_verbose=(info|warning|error) |
— | warning | gMock log verbosity |
Sharding env vars (set by your test runner, no flag equivalent):
GTEST_TOTAL_SHARDS, GTEST_SHARD_INDEX, GTEST_SHARD_STATUS_FILE.
Other env-only controls: TEST_PREMATURE_EXIT_FILE (premature-exit
detection protocol), TEST_SHARD_STATUS_FILE.
Note
For flags to take effect, your
main()must calltesting::InitGoogleTest(&argc, argv)beforeRUN_ALL_TESTS(). Run any test binary with--helpfor the authoritative, version-specific flag list.
4.2 Compile-time customization points
GoogleTest supports deep customization via macros, intended for unusual
platforms. The internal/custom/ directories are the official injection points
(googletest/include/gtest/internal/custom/,
googlemock/include/gmock/internal/custom/):
| Header / macro | Customizes |
|---|---|
GTEST_OS_STACK_TRACE_GETTER_ |
Stack-trace getter implementation |
GTEST_CUSTOM_TEMPDIR_FUNCTION_ |
Override testing::TempDir() |
GTEST_LOG_(severity), GTEST_CHECK_(condition) |
Logging primitives (plus LogToStderr/FlushInfoLog) |
GTEST_HAS_NOTIFICATION_, GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ |
Supply your own threading primitives |
GTEST_API_ |
Symbol-export specifier |
GMOCK_DECLARE_*_ / GMOCK_DEFINE_*_ / GMOCK_FLAG_GET/SET |
Flag plumbing for gmock |
Feature-detection macros include GTEST_HAS_PTHREAD, GTEST_HAS_ABSL,
GTEST_USES_SIMPLE_RE / GTEST_USES_POSIX_RE (which regex engine is active),
GTEST_OS_* (platform), and GTEST_HAS_CXXABI_H_.
Tip
Regex engine selection matters for death-test matchers and
MatchesRegex: with Bazel+Abseil you get RE2 syntax; on POSIX you get POSIX extended regex; on Windows you get GoogleTest's simple engine (no|,(),[], or{m,n}). For portable death tests, use only the simple-engine subset or#ifonGTEST_USES_*_RE.
4.3 XML / JSON report schema
--gtest_output=xml produces JUnit-style XML where <testsuites> = the program,
<testsuite> = a GoogleTest suite, <testcase> = a test function, and each
<failure> = one failed assertion. Attributes include tests, failures,
errors, time, timestamp, file, line. JSON output mirrors the same
shape and conforms to a documented JSON Schema / Proto3 message.
Important
The exact JSON document format is explicitly subject to change — don't build brittle parsers against undocumented fields. XML is the more stable integration target (it maps to the long-standing
junitreportAnt format).
Per-test metadata can be injected via RecordProperty("key", value), surfaced
as XML attributes (key must be a valid XML attribute name and not collide with
name, file, line, status, time, classname, type_param,
value_param).
5. Operations & CI
5.1 Continuous integration
The repo's own CI lives in ci/ (linux-presubmit.sh, macos-presubmit.sh,
windows-presubmit.bat); the project notes it also uses Google's internal CI.
For your projects, the standard pattern is:
- Build test binaries with your build system (Bazel
cc_testor CMake +gtest_discover_tests). - Run via the native runner (
bazel test/ctest) or invoke the binaries directly with--gtest_output=xml:results/for CI report ingestion. - Shard across machines with
GTEST_TOTAL_SHARDS/GTEST_SHARD_INDEX. - Use
--gtest_shuffleto surface inter-test coupling, and--gtest_repeat=N --gtest_break_on_failureto chase flakes.
5.2 Self-testing layout
GoogleTest tests itself extensively. Each library has a test/ tree mixing C++
unit tests (*_test.cc) and Python-driven golden-output tests
(googletest-output-test.py + *_golden*.txt). The samples double as
integration tests (gtest_samples, sample9_unittest, sample10_unittest in
Bazel).
Note
One open issue (#3943) notes
googletest-output-test.pyis not fully Python 3 ready — relevant if you build/run the framework's own Python-based tests in a Python-3-only environment.
5.3 Version management
| Practice | Why |
|---|---|
| Pin to a specific commit/release | Reproducible builds; the AI-doc model is diff-from-pinned |
| Update the pin deliberately and often | Picks up new-compiler fixes (GCC 15, MSVC) |
| Keep WORKSPACE and MODULE.bazel versions in sync | The MODULE file comments require it |
Mark test targets testonly |
Keeps GoogleTest out of production binaries |
The current release line is 1.17.0 (C++17+). The repo main builds as
version head in Bazel; CMake stamps GOOGLETEST_VERSION.
Caution
The project announces a planned dependency on Abseil is coming. Today Abseil/RE2 are optional (
GTEST_HAS_ABSL); plan for them potentially becoming required in a future major version, and verify your build can supply them.
6. Security Analysis
GoogleTest's threat surface is unusually small because it is a build-time, in-process testing library with no network, no persistence, and no daemon.
| Vector | Assessment |
|---|---|
| Network | None. No sockets, no listeners, no remote calls. |
| Untrusted input | Test inputs are author-supplied code. --gtest_filter, --gtest_output paths, and env vars come from the CI operator, not external users. |
| File writes | XML/JSON reports and the premature-exit file are written to operator-specified paths. Ensure CI runs with least privilege and writes to a sandboxed workspace. |
| Process spawning | Death tests fork/clone/CreateProcess a child that re-executes the test binary. Only triggered by author-written death tests. |
| Supply chain | The real risk surface: a compromised pinned archive/registry entry would be compiled into your test binaries. Pin by commit hash and verify provenance via the Bazel Central Registry. |
| Production leakage | GoogleTest code must not ship in production. Keep test/mocks testonly; never link gtest/gmock into release artifacts. |
Important
The
gtest_force_shared_crt/ CRT settings and--gtest_catch_exceptionsaffect crash behavior, not security. The one genuine hardening control is supply-chain hygiene: pin versions by hash, restrict who can bump the pin, and run CI test execution under least-privilege sandboxes (death tests spawn processes; reports write files).
Caution
On Windows, the statically-initialized GoogleTest singleton allocates on the heap, so the VC++ leak detector reports false positives at exit. This is benign — suppress with
_CrtMemCheckpoint/_CrtMemDumpAllObjectsSince. Do not mistake it for a real leak in your code.
7. Internals & Module Reference
7.1 gtest source modules (googletest/src/)
| File | Responsibility |
|---|---|
gtest.cc |
Core: UnitTest, TestSuite, TestInfo, flag parsing, the console printer, XML/JSON generation, RUN_ALL_TESTS machinery (largest module) |
gtest-death-test.cc |
Death-test execution (fork/clone/CreateProcess, child re-exec) |
gtest-filepath.cc |
Path handling for outputs and temp dirs |
gtest-matchers.cc |
The matcher base machinery shared with gmock |
gtest-port.cc |
Platform-abstraction layer (threads, regex, mutexes, time) |
gtest-printers.cc |
The extensible value printer |
gtest-assertion-result.cc |
AssertionResult implementation |
gtest-test-part.cc |
TestPartResult |
gtest-typed-test.cc |
Typed / type-parameterized test support |
gtest-internal-inl.h |
Internal shared declarations |
gtest-all.cc |
Unity build aggregating all of the above |
gtest_main.cc |
A default main() (the Bazel gtest_main uses gmock's main instead) |
7.2 gtest public headers (googletest/include/gtest/)
gtest.h is the umbrella include. Companions: gtest-assertion-result.h,
gtest-death-test.h, gtest-matchers.h, gtest-message.h,
gtest-param-test.h, gtest-printers.h, gtest-spi.h (the
"catching-framework-failures" API), gtest-test-part.h, gtest-typed-test.h,
gtest_pred_impl.h, and gtest_prod.h (the FRIEND_TEST macro for production
code). The internal/ subtree (gtest-internal.h, gtest-port.h,
gtest-param-util.h, gtest-type-util.h, gtest-death-test-internal.h, etc.)
is not a stable public API.
7.3 gmock source modules (googlemock/src/)
| File | Responsibility |
|---|---|
gmock-spec-builders.cc |
EXPECT_CALL/ON_CALL expectation engine, sequencing, verification |
gmock-matchers.cc |
Built-in matcher implementations |
gmock-cardinalities.cc |
Times() cardinalities (AtLeast, AnyNumber, etc.) |
gmock-internal-utils.cc |
Shared helpers |
gmock.cc |
Library init + flag handling (--gmock_*) |
gmock-all.cc |
Unity build |
gmock_main.cc |
The unified main() used by both gtest_main and gmock_main |
7.4 gmock public headers (googlemock/include/gmock/)
gmock.h (umbrella), plus gmock-actions.h, gmock-cardinalities.h,
gmock-function-mocker.h (the MOCK_METHOD machinery), gmock-matchers.h,
gmock-more-actions.h, gmock-more-matchers.h, gmock-nice-strict.h
(NiceMock/NaggyMock/StrictMock), and gmock-spec-builders.h. The
internal/ subtree (gmock-internal-utils.h, gmock-port.h, gmock-pp.h — the
preprocessor metaprogramming behind MOCK_METHOD) is implementation detail.
7.5 Threading model
GoogleTest is designed to be thread-safe and is thread-safe where pthreads
is available. On platforms lacking it (notably Windows), using GoogleTest
assertions from two threads concurrently is unsafe. In practice most tests
assert from the main thread; EXPECT_NO_FATAL_FAILURE and the SPI failure-catch
macros only observe failures in the calling thread.
8. Code Quality & Conventions
| Aspect | Observation |
|---|---|
| Style | Google C++ Style Guide; enforced by the repo's .clang-format |
| Naming | Tests/suites avoid underscores (compiler-reserved-identifier safety) |
| Portability | Heavy select()/macro abstraction (gtest-port) isolates platform differences; works with and without exceptions |
| No-exceptions design | Fatal assertions return rather than throw — hence the void-function constraint |
| Public vs internal | Clean separation: include/.../internal/ and internal/custom/ are explicitly not public API |
| Self-documentation | The docs/ tree is exhaustive and authoritative; samples are runnable and CI-checked |
| Header organization | One umbrella header per library plus focused sub-headers; *-all.cc unity builds |
9. Known Issues & Improvement Areas
Drawn from the project's open community issues at the documented commit.
| Theme | Issues | Notes |
|---|---|---|
| New-compiler breakage | #4965 (deleted function), #4881 (GCC 15.2 attribute ordering), #4759 (GCC 15 MOCK_METHOD + std::expected) |
Track latest release for fixes |
| CMake friction | #4616, #4718 (BUILD_SHARED_LIBS=ON + GTEST_HAS_ABSL=ON flag access), #4925 (MSVC _isatty), #3771 (find_package can't find gmock) |
Reflects community-maintained CMake path |
| Parameterized-test naming | #4985 (param test name ≠ ctest name), #4956 (macOS INSTANTIATE_TEST_SUITE_P pointer names), #4937 (names too long) |
Naming/ctest integration edge cases |
| Output/format | #4907 (XML output changes when failures present), #4973 (%s directive with null arg) |
Report-format edge cases |
| Platform | #3947 (QNX .WillOnce() compile failure), #3982 (Windows leaked-mock crash) |
Niche-platform support |
| Tooling | #3943 (googletest-output-test.py not fully Python 3 ready) |
Affects framework self-tests |
| Docs | #4608 (document the 15-argument limit), #4974 (missing full stops), #4934 (human/AI-readable ElementsAreArray) |
Documentation requests |
Architectural watch items:
- Planned Abseil dependency. Optional today; budget for it becoming standard.
- JSON output format is explicitly unstable. Prefer XML for durable CI integration.
- CMake is community-maintained. For mission-critical builds, the Bazel path is the reference; weigh contributing CMake fixes if you rely on it heavily.
10. Contributing
See CONTRIBUTING.md in the repository. High-level expectations:
- Follow the Google C++ Style Guide; run
clang-format(config in the repo). - Add or update tests in the relevant
test/tree; samples are CI-checked. - Keep changes portable across the supported compiler/platform matrix.
- Maintainers develop and test primarily with Bazel + Google's internal CI; validate non-trivial build changes there as well as in CMake.
11. Quick Reference
Build (CMake):
cmake -S . -B build [-DBUILD_GMOCK=OFF] [-DINSTALL_GTEST=OFF] [-DGTEST_HAS_ABSL=ON]
cmake --build build
cd build && ctest
Build (Bazel):
bazel test --cxxopt=-std=c++17 //...
Link targets: gtest, gtest_main, gmock, gmock_main, gtest_prod.
Most-used flags: --gtest_filter, --gtest_output=xml:dir/,
--gtest_repeat=N, --gtest_shuffle, --gtest_break_on_failure,
--gtest_death_test_style=threadsafe, --gmock_verbose=info.
Key types: UnitTest, TestSuite, TestInfo, Test, Environment,
TestEventListener, AssertionResult.
Optional deps: Abseil + RE2 (via GTEST_HAS_ABSL / --define absl=1).
Self-check: --gtest_fail_if_no_test_linked,
--gtest_fail_if_no_test_selected, --gmock_catch_leaked_mocks.