Unverified Commit edadfecd authored by Akash Patel's avatar Akash Patel Committed by GitHub
Browse files

Update gtest to 1.11.0 (#1086)

Properly resolves #1083, #996.
parent 26e3b704
---
name: Feature request
about: Propose a new feature
title: ''
labels: 'enhancement'
assignees: ''
---
**Does the feature exist in the most recent commit?**
We recommend using the latest commit from GitHub in your projects.
**Why do we need this feature?**
Ideally, explain why a combination of existing features cannot be used instead.
**Describe the proposal**
Include a detailed description of the feature, with usage examples.
**Is the feature specific to an operating system, compiler, or build system version?**
If it is, please specify which versions.
...@@ -36,9 +36,19 @@ package(default_visibility = ["//visibility:public"]) ...@@ -36,9 +36,19 @@ package(default_visibility = ["//visibility:public"])
licenses(["notice"]) licenses(["notice"])
exports_files(["LICENSE"])
config_setting( config_setting(
name = "windows", name = "windows",
constraint_values = ["@bazel_tools//platforms:windows"], constraint_values = ["@platforms//os:windows"],
)
config_setting(
name = "msvc_compiler",
flag_values = {
"@bazel_tools//tools/cpp:compiler": "msvc-cl",
},
visibility = [":__subpackages__"],
) )
config_setting( config_setting(
...@@ -103,6 +113,7 @@ cc_library( ...@@ -103,6 +113,7 @@ cc_library(
"@com_google_absl//absl/debugging:stacktrace", "@com_google_absl//absl/debugging:stacktrace",
"@com_google_absl//absl/debugging:symbolize", "@com_google_absl//absl/debugging:symbolize",
"@com_google_absl//absl/strings", "@com_google_absl//absl/strings",
"@com_google_absl//absl/types:any",
"@com_google_absl//absl/types:optional", "@com_google_absl//absl/types:optional",
"@com_google_absl//absl/types:variant", "@com_google_absl//absl/types:variant",
], ],
......
# Note: CMake support is community-based. The maintainers do not use CMake # Note: CMake support is community-based. The maintainers do not use CMake
# internally. # internally.
cmake_minimum_required(VERSION 2.9) cmake_minimum_required(VERSION 2.8.12)
if (POLICY CMP0048) if (POLICY CMP0048)
cmake_policy(SET CMP0048 NEW) cmake_policy(SET CMP0048 NEW)
endif (POLICY CMP0048) endif (POLICY CMP0048)
project(googletest-distribution) project(googletest-distribution)
set(GOOGLETEST_VERSION 1.10.0) set(GOOGLETEST_VERSION 1.11.0)
if (CMAKE_VERSION VERSION_LESS "3.1") if (CMAKE_VERSION VERSION_GREATER "3.0.2")
add_definitions(-std=c++11) if(NOT CYGWIN AND NOT MSYS AND NOT ${CMAKE_SYSTEM_NAME} STREQUAL QNX)
else()
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(NOT CYGWIN)
set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_EXTENSIONS OFF)
endif() endif()
endif() endif()
......
...@@ -28,7 +28,7 @@ PR is acceptable as an alternative. ...@@ -28,7 +28,7 @@ PR is acceptable as an alternative.
## Contributing A Patch ## Contributing A Patch
1. Submit an issue describing your proposed change to the 1. Submit an issue describing your proposed change to the
[issue tracker](https://github.com/google/googletest). [issue tracker](https://github.com/google/googletest/issues).
2. Please don't mix more than one logical change per submittal, because it 2. Please don't mix more than one logical change per submittal, because it
makes the history hard to follow. If you want to make a change that doesn't makes the history hard to follow. If you want to make a change that doesn't
have a corresponding issue in the issue tracker, please create one. have a corresponding issue in the issue tracker, please create one.
...@@ -80,7 +80,7 @@ fairly rigid coding style, as defined by the ...@@ -80,7 +80,7 @@ fairly rigid coding style, as defined by the
will be expected to conform to the style outlined will be expected to conform to the style outlined
[here](https://google.github.io/styleguide/cppguide.html). Use [here](https://google.github.io/styleguide/cppguide.html). Use
[.clang-format](https://github.com/google/googletest/blob/master/.clang-format) [.clang-format](https://github.com/google/googletest/blob/master/.clang-format)
to check your formatting to check your formatting.
## Requirements for Contributors ## Requirements for Contributors
...@@ -89,7 +89,7 @@ and their own tests from a git checkout, which has further requirements: ...@@ -89,7 +89,7 @@ and their own tests from a git checkout, which has further requirements:
* [Python](https://www.python.org/) v2.3 or newer (for running some of the * [Python](https://www.python.org/) v2.3 or newer (for running some of the
tests and re-generating certain source files from templates) tests and re-generating certain source files from templates)
* [CMake](https://cmake.org/) v2.6.4 or newer * [CMake](https://cmake.org/) v2.8.12 or newer
## Developing Google Test and Google Mock ## Developing Google Test and Google Mock
...@@ -128,15 +128,3 @@ To run the tests, do ...@@ -128,15 +128,3 @@ To run the tests, do
make test make test
All tests should pass. All tests should pass.
### Regenerating Source Files
Some of Google Test's source files are generated from templates (not in the C++
sense) using a script. For example, the file
include/gtest/internal/gtest-type-util.h.pump is used to generate
gtest-type-util.h in the same directory.
You don't need to worry about regenerating the source files unless you need to
modify them. You would then modify the corresponding `.pump` files and run the
'[pump.py](googletest/scripts/pump.py)' generator script. See the
[Pump Manual](googletest/docs/pump_manual.md).
...@@ -5,33 +5,59 @@ ...@@ -5,33 +5,59 @@
Ajay Joshi <jaj@google.com> Ajay Joshi <jaj@google.com>
Balázs Dán <balazs.dan@gmail.com> Balázs Dán <balazs.dan@gmail.com>
Benoit Sigoure <tsuna@google.com>
Bharat Mediratta <bharat@menalto.com> Bharat Mediratta <bharat@menalto.com>
Bogdan Piloca <boo@google.com>
Chandler Carruth <chandlerc@google.com> Chandler Carruth <chandlerc@google.com>
Chris Prince <cprince@google.com> Chris Prince <cprince@google.com>
Chris Taylor <taylorc@google.com> Chris Taylor <taylorc@google.com>
Dan Egnor <egnor@google.com> Dan Egnor <egnor@google.com>
Dave MacLachlan <dmaclach@gmail.com>
David Anderson <danderson@google.com>
Dean Sturtevant
Eric Roman <eroman@chromium.org> Eric Roman <eroman@chromium.org>
Gene Volovich <gv@cite.com>
Hady Zalek <hady.zalek@gmail.com> Hady Zalek <hady.zalek@gmail.com>
Hal Burch <gmock@hburch.com>
Jeffrey Yasskin <jyasskin@google.com> Jeffrey Yasskin <jyasskin@google.com>
Jim Keller <jimkeller@google.com>
Joe Walnes <joe@truemesh.com>
Jon Wray <jwray@google.com>
Jói Sigurðsson <joi@google.com> Jói Sigurðsson <joi@google.com>
Keir Mierle <mierle@gmail.com> Keir Mierle <mierle@gmail.com>
Keith Ray <keith.ray@gmail.com> Keith Ray <keith.ray@gmail.com>
Kenton Varda <kenton@google.com> Kenton Varda <kenton@google.com>
Kostya Serebryany <kcc@google.com>
Krystian Kuzniarek <krystian.kuzniarek@gmail.com>
Lev Makhlis
Manuel Klimek <klimek@google.com> Manuel Klimek <klimek@google.com>
Mario Tanev <radix@google.com>
Mark Paskin
Markus Heule <markus.heule@gmail.com> Markus Heule <markus.heule@gmail.com>
Matthew Simmons <simmonmt@acm.org>
Mika Raento <mikie@iki.fi> Mika Raento <mikie@iki.fi>
Mike Bland <mbland@google.com>
Miklós Fazekas <mfazekas@szemafor.com> Miklós Fazekas <mfazekas@szemafor.com>
Neal Norwitz <nnorwitz@gmail.com>
Nermin Ozkiranartli <nermin@google.com>
Owen Carlsen <ocarlsen@google.com>
Paneendra Ba <paneendra@google.com>
Pasi Valminen <pasi.valminen@gmail.com> Pasi Valminen <pasi.valminen@gmail.com>
Patrick Hanna <phanna@google.com> Patrick Hanna <phanna@google.com>
Patrick Riley <pfr@google.com> Patrick Riley <pfr@google.com>
Paul Menage <menage@google.com>
Peter Kaminski <piotrk@google.com> Peter Kaminski <piotrk@google.com>
Piotr Kaminski <piotrk@google.com>
Preston Jackson <preston.a.jackson@gmail.com> Preston Jackson <preston.a.jackson@gmail.com>
Rainer Klaffenboeck <rainer.klaffenboeck@dynatrace.com> Rainer Klaffenboeck <rainer.klaffenboeck@dynatrace.com>
Russ Cox <rsc@google.com> Russ Cox <rsc@google.com>
Russ Rufer <russ@pentad.com> Russ Rufer <russ@pentad.com>
Sean Mcafee <eefacm@gmail.com> Sean Mcafee <eefacm@gmail.com>
Sigurður Ásgeirsson <siggi@google.com> Sigurður Ásgeirsson <siggi@google.com>
Sverre Sundsdal <sundsdal@gmail.com>
Takeshi Yoshino <tyoshino@google.com>
Tracy Bialik <tracy@pentad.com> Tracy Bialik <tracy@pentad.com>
Vadim Berman <vadimb@google.com> Vadim Berman <vadimb@google.com>
Vlad Losev <vladl@google.com> Vlad Losev <vladl@google.com>
Wolfgang Klier <wklier@google.com>
Zhanyong Wan <wan@google.com> Zhanyong Wan <wan@google.com>
# Google Test # GoogleTest
#### OSS Builds Status: ### Announcements
[![Build Status](https://api.travis-ci.org/google/googletest.svg?branch=master)](https://travis-ci.org/google/googletest) #### Live at Head
[![Build status](https://ci.appveyor.com/api/projects/status/4o38plt0xbo1ubc8/branch/master?svg=true)](https://ci.appveyor.com/project/GoogleTestAppVeyor/googletest/branch/master)
### Future Plans GoogleTest now follows the
[Abseil Live at Head philosophy](https://abseil.io/about/philosophy#upgrade-support).
We recommend using the latest commit in the `master` branch in your projects.
#### 1.8.x Release: #### Documentation Updates
[the 1.8.x](https://github.com/google/googletest/releases/tag/release-1.8.1) is Our documentation is now live on GitHub Pages at
the last release that works with pre-C++11 compilers. The 1.8.x will not accept https://google.github.io/googletest/. We recommend browsing the documentation on
any requests for any new features and any bugfix requests will only be accepted GitHub Pages rather than directly in the repository.
if proven "critical"
#### Post 1.8.x: #### Release 1.10.x
On-going work to improve/cleanup/pay technical debt. When this work is completed [Release 1.10.x](https://github.com/google/googletest/releases/tag/release-1.10.0)
there will be a 1.9.x tagged release is now available.
#### Post 1.9.x #### Coming Soon
Post 1.9.x googletest will follow * We are planning to take a dependency on
[Abseil Live at Head philosophy](https://abseil.io/about/philosophy) [Abseil](https://github.com/abseil/abseil-cpp).
* More documentation improvements are planned.
## Welcome to **Google Test**, Google's C++ test framework! ## Welcome to **GoogleTest**, Google's C++ test framework!
This repository is a merger of the formerly separate GoogleTest and GoogleMock This repository is a merger of the formerly separate GoogleTest and GoogleMock
projects. These were so closely related that it makes sense to maintain and projects. These were so closely related that it makes sense to maintain and
release them together. release them together.
Please subscribe to the mailing list at googletestframework@googlegroups.com for ### Getting Started
questions, discussions, and development.
### Getting started: See the [GoogleTest User's Guide](https://google.github.io/googletest/) for
documentation. We recommend starting with the
[GoogleTest Primer](https://google.github.io/googletest/primer.html).
The information for **Google Test** is available in the More information about building GoogleTest can be found at
[Google Test Primer](googletest/docs/primer.md) documentation. [googletest/README.md](googletest/README.md).
**Google Mock** is an extension to Google Test for writing and using C++ mock
classes. See the separate [Google Mock documentation](googlemock/README.md).
More detailed documentation for googletest is in its interior
[googletest/README.md](googletest/README.md) file.
## Features ## Features
...@@ -57,22 +53,45 @@ More detailed documentation for googletest is in its interior ...@@ -57,22 +53,45 @@ More detailed documentation for googletest is in its interior
* Various options for running the tests. * Various options for running the tests.
* XML test report generation. * XML test report generation.
## Platforms ## Supported Platforms
GoogleTest requires a codebase and compiler compliant with the C++11 standard or
newer.
The GoogleTest code is officially supported on the following platforms.
Operating systems or tools not listed below are community-supported. For
community-supported platforms, patches that do not complicate the code may be
considered.
Google test has been used on a variety of platforms: If you notice any problems on your platform, please file an issue on the
[GoogleTest GitHub Issue Tracker](https://github.com/google/googletest/issues).
Pull requests containing fixes are welcome!
### Operating Systems
* Linux * Linux
* Mac OS X * macOS
* Windows * Windows
* Cygwin
* MinGW
* Windows Mobile
* Symbian
* PlatformIO
## Who Is Using Google Test? ### Compilers
* gcc 5.0+
* clang 5.0+
* MSVC 2015+
**macOS users:** Xcode 9.3+ provides clang 5.0+.
### Build Systems
In addition to many internal projects at Google, Google Test is also used by the * [Bazel](https://bazel.build/)
* [CMake](https://cmake.org/)
**Note:** Bazel is the build system used by the team internally and in tests.
CMake is supported on a best-effort basis and by the community.
## Who Is Using GoogleTest?
In addition to many internal projects at Google, GoogleTest is also used by the
following notable projects: following notable projects:
* The [Chromium projects](http://www.chromium.org/) (behind the Chrome browser * The [Chromium projects](http://www.chromium.org/) (behind the Chrome browser
...@@ -81,8 +100,6 @@ following notable projects: ...@@ -81,8 +100,6 @@ following notable projects:
* [Protocol Buffers](https://github.com/google/protobuf), Google's data * [Protocol Buffers](https://github.com/google/protobuf), Google's data
interchange format. interchange format.
* The [OpenCV](http://opencv.org/) computer vision library. * The [OpenCV](http://opencv.org/) computer vision library.
* [tiny-dnn](https://github.com/tiny-dnn/tiny-dnn): header only,
dependency-free deep learning framework in C++11.
## Related Open Source Projects ## Related Open Source Projects
...@@ -90,13 +107,13 @@ following notable projects: ...@@ -90,13 +107,13 @@ following notable projects:
automated test-runner and Graphical User Interface with powerful features for automated test-runner and Graphical User Interface with powerful features for
Windows and Linux platforms. Windows and Linux platforms.
[Google Test UI](https://github.com/ospector/gtest-gbar) is test runner that [GoogleTest UI](https://github.com/ospector/gtest-gbar) is a test runner that
runs your test binary, allows you to track its progress via a progress bar, and runs your test binary, allows you to track its progress via a progress bar, and
displays a list of test failures. Clicking on one shows failure text. Google displays a list of test failures. Clicking on one shows failure text. Google
Test UI is written in C#. Test UI is written in C#.
[GTest TAP Listener](https://github.com/kinow/gtest-tap-listener) is an event [GTest TAP Listener](https://github.com/kinow/gtest-tap-listener) is an event
listener for Google Test that implements the listener for GoogleTest that implements the
[TAP protocol](https://en.wikipedia.org/wiki/Test_Anything_Protocol) for test [TAP protocol](https://en.wikipedia.org/wiki/Test_Anything_Protocol) for test
result output. If your test runner understands TAP, you may find it useful. result output. If your test runner understands TAP, you may find it useful.
...@@ -104,31 +121,20 @@ result output. If your test runner understands TAP, you may find it useful. ...@@ -104,31 +121,20 @@ result output. If your test runner understands TAP, you may find it useful.
runs tests from your binary in parallel to provide significant speed-up. runs tests from your binary in parallel to provide significant speed-up.
[GoogleTest Adapter](https://marketplace.visualstudio.com/items?itemName=DavidSchuldenfrei.gtest-adapter) [GoogleTest Adapter](https://marketplace.visualstudio.com/items?itemName=DavidSchuldenfrei.gtest-adapter)
is a VS Code extension allowing to view Google Tests in a tree view, and is a VS Code extension allowing to view GoogleTest in a tree view, and run/debug
run/debug your tests. your tests.
## Requirements
Google Test is designed to have fairly minimal requirements to build and use
with your projects, but there are some. If you notice any problems on your
platform, please notify
[googletestframework@googlegroups.com](https://groups.google.com/forum/#!forum/googletestframework).
Patches for fixing them are welcome!
### Build Requirements
These are the base requirements to build and use Google Test from a source
package:
* [Bazel](https://bazel.build/) or [CMake](https://cmake.org/). NOTE: Bazel is [C++ TestMate](https://github.com/matepek/vscode-catch2-test-adapter) is a VS
the build system that googletest is using internally and tests against. Code extension allowing to view GoogleTest in a tree view, and run/debug your
CMake is community-supported. tests.
* a C++11-standard-compliant compiler [Cornichon](https://pypi.org/project/cornichon/) is a small Gherkin DSL parser
that generates stub code for GoogleTest.
## Contributing change ## Contributing Changes
Please read the [`CONTRIBUTING.md`](CONTRIBUTING.md) for details on how to Please read
contribute to this project. [`CONTRIBUTING.md`](https://github.com/google/googletest/blob/master/CONTRIBUTING.md)
for details on how to contribute to this project.
Happy testing! Happy testing!
workspace(name = "com_google_googletest")
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "com_google_absl",
urls = ["https://github.com/abseil/abseil-cpp/archive/7971fb358ae376e016d2d4fc9327aad95659b25e.zip"], # 2021-05-20T02:59:16Z
strip_prefix = "abseil-cpp-7971fb358ae376e016d2d4fc9327aad95659b25e",
sha256 = "aeba534f7307e36fe084b452299e49b97420667a8d28102cf9a0daeed340b859",
)
http_archive(
name = "rules_cc",
urls = ["https://github.com/bazelbuild/rules_cc/archive/68cb652a71e7e7e2858c50593e5a9e3b94e5b9a9.zip"], # 2021-05-14T14:51:14Z
strip_prefix = "rules_cc-68cb652a71e7e7e2858c50593e5a9e3b94e5b9a9",
sha256 = "1e19e9a3bc3d4ee91d7fcad00653485ee6c798efbbf9588d40b34cbfbded143d",
)
http_archive(
name = "rules_python",
urls = ["https://github.com/bazelbuild/rules_python/archive/ed6cc8f2c3692a6a7f013ff8bc185ba77eb9b4d2.zip"], # 2021-05-17T00:24:16Z
strip_prefix = "rules_python-ed6cc8f2c3692a6a7f013ff8bc185ba77eb9b4d2",
sha256 = "98b3c592faea9636ac8444bfd9de7f3fb4c60590932d6e6ac5946e3f8dbd5ff6",
)
#!/bin/bash
#
# Copyright 2020, Google Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
# * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
set -euox pipefail
readonly LINUX_LATEST_CONTAINER="gcr.io/google.com/absl-177019/linux_hybrid-latest:20210525"
readonly LINUX_GCC_FLOOR_CONTAINER="gcr.io/google.com/absl-177019/linux_gcc-floor:20201015"
if [[ -z ${GTEST_ROOT:-} ]]; then
GTEST_ROOT="$(realpath $(dirname ${0})/..)"
fi
if [[ -z ${STD:-} ]]; then
STD="c++11 c++14 c++17 c++20"
fi
# Test the CMake build
for cc in /usr/local/bin/gcc /opt/llvm/clang/bin/clang; do
for cmake_off_on in OFF ON; do
time docker run \
--volume="${GTEST_ROOT}:/src:ro" \
--tmpfs="/build:exec" \
--workdir="/build" \
--rm \
--env="CC=${cc}" \
--env="CXX_FLAGS=\"-Werror -Wdeprecated\"" \
${LINUX_LATEST_CONTAINER} \
/bin/bash -c "
cmake /src \
-DCMAKE_CXX_STANDARD=11 \
-Dgtest_build_samples=ON \
-Dgtest_build_tests=ON \
-Dgmock_build_tests=ON \
-Dcxx_no_exception=${cmake_off_on} \
-Dcxx_no_rtti=${cmake_off_on} && \
make -j$(nproc) && \
ctest -j$(nproc) --output-on-failure"
done
done
# Do one test with an older version of GCC
time docker run \
--volume="${GTEST_ROOT}:/src:ro" \
--workdir="/src" \
--rm \
--env="CC=/usr/local/bin/gcc" \
${LINUX_GCC_FLOOR_CONTAINER} \
/usr/local/bin/bazel test ... \
--copt="-Wall" \
--copt="-Werror" \
--copt="-Wno-error=pragmas" \
--keep_going \
--show_timestamps \
--test_output=errors
# Test GCC
for std in ${STD}; do
for absl in 0 1; do
time docker run \
--volume="${GTEST_ROOT}:/src:ro" \
--workdir="/src" \
--rm \
--env="CC=/usr/local/bin/gcc" \
--env="BAZEL_CXXOPTS=-std=${std}" \
${LINUX_LATEST_CONTAINER} \
/usr/local/bin/bazel test ... \
--copt="-Wall" \
--copt="-Werror" \
--define="absl=${absl}" \
--distdir="/bazel-distdir" \
--keep_going \
--show_timestamps \
--test_output=errors
done
done
# Test Clang
for std in ${STD}; do
for absl in 0 1; do
time docker run \
--volume="${GTEST_ROOT}:/src:ro" \
--workdir="/src" \
--rm \
--env="CC=/opt/llvm/clang/bin/clang" \
--env="BAZEL_CXXOPTS=-std=${std}" \
${LINUX_LATEST_CONTAINER} \
/usr/local/bin/bazel test ... \
--copt="--gcc-toolchain=/usr/local" \
--copt="-Wall" \
--copt="-Werror" \
--define="absl=${absl}" \
--distdir="/bazel-distdir" \
--keep_going \
--linkopt="--gcc-toolchain=/usr/local" \
--show_timestamps \
--test_output=errors
done
done
#!/usr/bin/env bash #!/bin/bash
# Copyright 2017 Google Inc.
# All Rights Reserved.
# #
# Copyright 2020, Google Inc.
# All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are # modification, are permitted provided that the following conditions are
...@@ -29,20 +29,45 @@ ...@@ -29,20 +29,45 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# This file is typically sourced by another script. set -euox pipefail
# if possible, ask for the precise number of processors,
# otherwise take 2 processors as reasonable default; see if [[ -z ${GTEST_ROOT:-} ]]; then
# https://docs.travis-ci.com/user/speeding-up-the-build/#Makefile-optimization GTEST_ROOT="$(realpath $(dirname ${0})/..)"
if [ -x /usr/bin/getconf ]; then
NPROCESSORS=$(/usr/bin/getconf _NPROCESSORS_ONLN)
else
NPROCESSORS=2
fi fi
# as of 2017-09-04 Travis CI reports 32 processors, but GCC build # Test the CMake build
# crashes if parallelized too much (maybe memory consumption problem), for cmake_off_on in OFF ON; do
# so limit to 4 processors for the time being. BUILD_DIR=$(mktemp -d build_dir.XXXXXXXX)
if [ $NPROCESSORS -gt 4 ] ; then cd ${BUILD_DIR}
echo "$0:Note: Limiting processors to use by make from $NPROCESSORS to 4." time cmake ${GTEST_ROOT} \
NPROCESSORS=4 -DCMAKE_CXX_STANDARD=11 \
-Dgtest_build_samples=ON \
-Dgtest_build_tests=ON \
-Dgmock_build_tests=ON \
-Dcxx_no_exception=${cmake_off_on} \
-Dcxx_no_rtti=${cmake_off_on}
time make
time ctest -j$(nproc) --output-on-failure
done
# Test the Bazel build
# If we are running on Kokoro, check for a versioned Bazel binary.
KOKORO_GFILE_BAZEL_BIN="bazel-3.7.0-darwin-x86_64"
if [[ ${KOKORO_GFILE_DIR:-} ]] && [[ -f ${KOKORO_GFILE_DIR}/${KOKORO_GFILE_BAZEL_BIN} ]]; then
BAZEL_BIN="${KOKORO_GFILE_DIR}/${KOKORO_GFILE_BAZEL_BIN}"
chmod +x ${BAZEL_BIN}
else
BAZEL_BIN="bazel"
fi fi
cd ${GTEST_ROOT}
for absl in 0 1; do
${BAZEL_BIN} test ... \
--copt="-Wall" \
--copt="-Werror" \
--define="absl=${absl}" \
--keep_going \
--show_timestamps \
--test_output=errors
done
nav:
- section: "Get Started"
items:
- title: "Supported Platforms"
url: "/platforms.html"
- title: "Quickstart: Bazel"
url: "/quickstart-bazel.html"
- title: "Quickstart: CMake"
url: "/quickstart-cmake.html"
- section: "Guides"
items:
- title: "GoogleTest Primer"
url: "/primer.html"
- title: "Advanced Topics"
url: "/advanced.html"
- title: "Mocking for Dummies"
url: "/gmock_for_dummies.html"
- title: "Mocking Cookbook"
url: "/gmock_cook_book.html"
- title: "Mocking Cheat Sheet"
url: "/gmock_cheat_sheet.html"
- section: "References"
items:
- title: "Testing Reference"
url: "/reference/testing.html"
- title: "Mocking Reference"
url: "/reference/mocking.html"
- title: "Assertions"
url: "/reference/assertions.html"
- title: "Matchers"
url: "/reference/matchers.html"
- title: "Actions"
url: "/reference/actions.html"
- title: "Testing FAQ"
url: "/faq.html"
- title: "Mocking FAQ"
url: "/gmock_faq.html"
- title: "Code Samples"
url: "/samples.html"
- title: "Using pkg-config"
url: "/pkgconfig.html"
- title: "Community Documentation"
url: "/community_created_documentation.html"
<!DOCTYPE html>
<html lang="{{ site.lang | default: "en-US" }}">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
{% seo %}
<link rel="stylesheet" href="{{ "/assets/css/style.css?v=" | append: site.github.build_revision | relative_url }}">
<script>
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', 'UA-197576187-1', { 'storage': 'none' });
ga('set', 'referrer', document.referrer.split('?')[0]);
ga('set', 'location', window.location.href.split('?')[0]);
ga('set', 'anonymizeIp', true);
ga('send', 'pageview');
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>
</head>
<body>
<div class="sidebar">
<div class="header">
<h1><a href="{{ "/" | relative_url }}">{{ site.title | default: "Documentation" }}</a></h1>
</div>
<input type="checkbox" id="nav-toggle" class="nav-toggle">
<label for="nav-toggle" class="expander">
<span class="arrow"></span>
</label>
<nav>
{% for item in site.data.navigation.nav %}
<h2>{{ item.section }}</h2>
<ul>
{% for subitem in item.items %}
<a href="{{subitem.url | relative_url }}">
<li class="{% if subitem.url == page.url %}active{% endif %}">
{{ subitem.title }}
</li>
</a>
{% endfor %}
</ul>
{% endfor %}
</nav>
</div>
<div class="main markdown-body">
<div class="main-inner">
{{ content }}
</div>
<div class="footer">
GoogleTest &middot;
<a href="https://github.com/google/googletest">GitHub Repository</a> &middot;
<a href="https://github.com/google/googletest/blob/master/LICENSE">License</a> &middot;
<a href="https://policies.google.com/privacy">Privacy Policy</a>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/anchor-js/4.1.0/anchor.min.js" integrity="sha256-lZaRhKri35AyJSypXXs4o6OPFTbTmUoltBbDCbdzegg=" crossorigin="anonymous"></script>
<script>anchors.add('.main h2, .main h3, .main h4, .main h5, .main h6');</script>
</body>
</html>
// Styles for GoogleTest docs website on GitHub Pages.
// Color variables are defined in
// https://github.com/pages-themes/primer/tree/master/_sass/primer-support/lib/variables
$sidebar-width: 260px;
body {
display: flex;
margin: 0;
}
.sidebar {
background: $black;
color: $text-white;
flex-shrink: 0;
height: 100vh;
overflow: auto;
position: sticky;
top: 0;
width: $sidebar-width;
}
.sidebar h1 {
font-size: 1.5em;
}
.sidebar h2 {
color: $gray-light;
font-size: 0.8em;
font-weight: normal;
margin-bottom: 0.8em;
padding-left: 2.5em;
text-transform: uppercase;
}
.sidebar .header {
background: $black;
padding: 2em;
position: sticky;
top: 0;
width: 100%;
}
.sidebar .header a {
color: $text-white;
text-decoration: none;
}
.sidebar .nav-toggle {
display: none;
}
.sidebar .expander {
cursor: pointer;
display: none;
height: 3em;
position: absolute;
right: 1em;
top: 1.5em;
width: 3em;
}
.sidebar .expander .arrow {
border: solid $white;
border-width: 0 3px 3px 0;
display: block;
height: 0.7em;
margin: 1em auto;
transform: rotate(45deg);
transition: transform 0.5s;
width: 0.7em;
}
.sidebar nav {
width: 100%;
}
.sidebar nav ul {
list-style-type: none;
margin-bottom: 1em;
padding: 0;
&:last-child {
margin-bottom: 2em;
}
a {
text-decoration: none;
}
li {
color: $text-white;
padding-left: 2em;
text-decoration: none;
}
li.active {
background: $border-gray-darker;
font-weight: bold;
}
li:hover {
background: $border-gray-darker;
}
}
.main {
background-color: $bg-gray;
width: calc(100% - #{$sidebar-width});
}
.main .main-inner {
background-color: $white;
padding: 2em;
}
.main .footer {
margin: 0;
padding: 2em;
}
.main table th {
text-align: left;
}
.main .callout {
border-left: 0.25em solid $white;
padding: 1em;
a {
text-decoration: underline;
}
&.important {
background-color: $bg-yellow-light;
border-color: $bg-yellow;
color: $black;
}
&.note {
background-color: $bg-blue-light;
border-color: $text-blue;
color: $text-blue;
}
&.tip {
background-color: $green-000;
border-color: $green-700;
color: $green-700;
}
&.warning {
background-color: $red-000;
border-color: $text-red;
color: $text-red;
}
}
.main .good pre {
background-color: $bg-green-light;
}
.main .bad pre {
background-color: $red-000;
}
@media all and (max-width: 768px) {
body {
flex-direction: column;
}
.sidebar {
height: auto;
position: relative;
width: 100%;
}
.sidebar .expander {
display: block;
}
.sidebar nav {
height: 0;
overflow: hidden;
}
.sidebar .nav-toggle:checked {
& ~ nav {
height: auto;
}
& + .expander .arrow {
transform: rotate(-135deg);
}
}
.main {
width: 100%;
}
}
# Advanced googletest Topics # Advanced googletest Topics
<!-- GOOGLETEST_CM0016 DO NOT DELETE -->
## Introduction ## Introduction
Now that you have read the [googletest Primer](primer.md) and learned how to Now that you have read the [googletest Primer](primer.md) and learned how to
...@@ -17,69 +15,13 @@ assertions. ...@@ -17,69 +15,13 @@ assertions.
### Explicit Success and Failure ### Explicit Success and Failure
These three assertions do not actually test a value or expression. Instead, they See [Explicit Success and Failure](reference/assertions.md#success-failure) in
generate a success or failure directly. Like the macros that actually perform a the Assertions Reference.
test, you may stream a custom failure message into them.
```c++
SUCCEED();
```
Generates a success. This does **NOT** make the overall test succeed. A test is
considered successful only if none of its assertions fail during its execution.
NOTE: `SUCCEED()` is purely documentary and currently doesn't generate any
user-visible output. However, we may add `SUCCEED()` messages to googletest's
output in the future.
```c++
FAIL();
ADD_FAILURE();
ADD_FAILURE_AT("file_path", line_number);
```
`FAIL()` generates a fatal failure, while `ADD_FAILURE()` and `ADD_FAILURE_AT()`
generate a nonfatal failure. These are useful when control flow, rather than a
Boolean expression, determines the test's success or failure. For example, you
might want to write something like:
```c++
switch(expression) {
case 1:
... some checks ...
case 2:
... some other checks ...
default:
FAIL() << "We shouldn't get here.";
}
```
NOTE: you can only use `FAIL()` in functions that return `void`. See the
[Assertion Placement section](#assertion-placement) for more information.
### Exception Assertions ### Exception Assertions
These are for verifying that a piece of code throws (or does not throw) an See [Exception Assertions](reference/assertions.md#exceptions) in the Assertions
exception of the given type: Reference.
Fatal assertion | Nonfatal assertion | Verifies
------------------------------------------ | ------------------------------------------ | --------
`ASSERT_THROW(statement, exception_type);` | `EXPECT_THROW(statement, exception_type);` | `statement` throws an exception of the given type
`ASSERT_ANY_THROW(statement);` | `EXPECT_ANY_THROW(statement);` | `statement` throws an exception of any type
`ASSERT_NO_THROW(statement);` | `EXPECT_NO_THROW(statement);` | `statement` doesn't throw any exception
Examples:
```c++
ASSERT_THROW(Foo(5), bar_exception);
EXPECT_NO_THROW({
int n = 5;
Bar(&n);
});
```
**Availability**: requires exceptions to be enabled in the build environment
### Predicate Assertions for Better Error Messages ### Predicate Assertions for Better Error Messages
...@@ -99,60 +41,9 @@ googletest gives you three different options to solve this problem: ...@@ -99,60 +41,9 @@ googletest gives you three different options to solve this problem:
If you already have a function or functor that returns `bool` (or a type that If you already have a function or functor that returns `bool` (or a type that
can be implicitly converted to `bool`), you can use it in a *predicate can be implicitly converted to `bool`), you can use it in a *predicate
assertion* to get the function arguments printed for free: assertion* to get the function arguments printed for free. See
[`EXPECT_PRED*`](reference/assertions.md#EXPECT_PRED) in the Assertions
<!-- mdformat off(github rendering does not support multiline tables) --> Reference for details.
| Fatal assertion | Nonfatal assertion | Verifies |
| --------------------------------- | --------------------------------- | --------------------------- |
| `ASSERT_PRED1(pred1, val1)` | `EXPECT_PRED1(pred1, val1)` | `pred1(val1)` is true |
| `ASSERT_PRED2(pred2, val1, val2)` | `EXPECT_PRED2(pred2, val1, val2)` | `pred1(val1, val2)` is true |
| `...` | `...` | `...` |
<!-- mdformat on-->
In the above, `predn` is an `n`-ary predicate function or functor, where `val1`,
`val2`, ..., and `valn` are its arguments. The assertion succeeds if the
predicate returns `true` when applied to the given arguments, and fails
otherwise. When the assertion fails, it prints the value of each argument. In
either case, the arguments are evaluated exactly once.
Here's an example. Given
```c++
// Returns true if m and n have no common divisors except 1.
bool MutuallyPrime(int m, int n) { ... }
const int a = 3;
const int b = 4;
const int c = 10;
```
the assertion
```c++
EXPECT_PRED2(MutuallyPrime, a, b);
```
will succeed, while the assertion
```c++
EXPECT_PRED2(MutuallyPrime, b, c);
```
will fail with the message
```none
MutuallyPrime(b, c) is false, where
b is 4
c is 10
```
> NOTE:
>
> 1. If you see a compiler error "no matching function to call" when using
> `ASSERT_PRED*` or `EXPECT_PRED*`, please see
> [this](faq.md#the-compiler-complains-no-matching-function-to-call-when-i-use-assert-pred-how-do-i-fix-it)
> for how to resolve it.
#### Using a Function That Returns an AssertionResult #### Using a Function That Returns an AssertionResult
...@@ -187,11 +78,11 @@ write a predicate function that returns `AssertionResult` instead of `bool`. For ...@@ -187,11 +78,11 @@ write a predicate function that returns `AssertionResult` instead of `bool`. For
example, if you define `IsEven()` as: example, if you define `IsEven()` as:
```c++ ```c++
::testing::AssertionResult IsEven(int n) { testing::AssertionResult IsEven(int n) {
if ((n % 2) == 0) if ((n % 2) == 0)
return ::testing::AssertionSuccess(); return testing::AssertionSuccess();
else else
return ::testing::AssertionFailure() << n << " is odd"; return testing::AssertionFailure() << n << " is odd";
} }
``` ```
...@@ -225,11 +116,11 @@ are fine with making the predicate slower in the success case, you can supply a ...@@ -225,11 +116,11 @@ are fine with making the predicate slower in the success case, you can supply a
success message: success message:
```c++ ```c++
::testing::AssertionResult IsEven(int n) { testing::AssertionResult IsEven(int n) {
if ((n % 2) == 0) if ((n % 2) == 0)
return ::testing::AssertionSuccess() << n << " is even"; return testing::AssertionSuccess() << n << " is even";
else else
return ::testing::AssertionFailure() << n << " is odd"; return testing::AssertionFailure() << n << " is odd";
} }
``` ```
...@@ -243,176 +134,50 @@ Then the statement `EXPECT_FALSE(IsEven(Fib(6)))` will print ...@@ -243,176 +134,50 @@ Then the statement `EXPECT_FALSE(IsEven(Fib(6)))` will print
#### Using a Predicate-Formatter #### Using a Predicate-Formatter
If you find the default message generated by `(ASSERT|EXPECT)_PRED*` and If you find the default message generated by
`(ASSERT|EXPECT)_(TRUE|FALSE)` unsatisfactory, or some arguments to your [`EXPECT_PRED*`](reference/assertions.md#EXPECT_PRED) and
predicate do not support streaming to `ostream`, you can instead use the [`EXPECT_TRUE`](reference/assertions.md#EXPECT_TRUE) unsatisfactory, or some
following *predicate-formatter assertions* to *fully* customize how the message arguments to your predicate do not support streaming to `ostream`, you can
is formatted: instead use *predicate-formatter assertions* to *fully* customize how the
message is formatted. See
Fatal assertion | Nonfatal assertion | Verifies [`EXPECT_PRED_FORMAT*`](reference/assertions.md#EXPECT_PRED_FORMAT) in the
------------------------------------------------ | ------------------------------------------------ | -------- Assertions Reference for details.
`ASSERT_PRED_FORMAT1(pred_format1, val1);` | `EXPECT_PRED_FORMAT1(pred_format1, val1);` | `pred_format1(val1)` is successful
`ASSERT_PRED_FORMAT2(pred_format2, val1, val2);` | `EXPECT_PRED_FORMAT2(pred_format2, val1, val2);` | `pred_format2(val1, val2)` is successful
`...` | `...` | ...
The difference between this and the previous group of macros is that instead of
a predicate, `(ASSERT|EXPECT)_PRED_FORMAT*` take a *predicate-formatter*
(`pred_formatn`), which is a function or functor with the signature:
```c++
::testing::AssertionResult PredicateFormattern(const char* expr1,
const char* expr2,
...
const char* exprn,
T1 val1,
T2 val2,
...
Tn valn);
```
where `val1`, `val2`, ..., and `valn` are the values of the predicate arguments,
and `expr1`, `expr2`, ..., and `exprn` are the corresponding expressions as they
appear in the source code. The types `T1`, `T2`, ..., and `Tn` can be either
value types or reference types. For example, if an argument has type `Foo`, you
can declare it as either `Foo` or `const Foo&`, whichever is appropriate.
As an example, let's improve the failure message in `MutuallyPrime()`, which was
used with `EXPECT_PRED2()`:
```c++
// Returns the smallest prime common divisor of m and n,
// or 1 when m and n are mutually prime.
int SmallestPrimeCommonDivisor(int m, int n) { ... }
// A predicate-formatter for asserting that two integers are mutually prime.
::testing::AssertionResult AssertMutuallyPrime(const char* m_expr,
const char* n_expr,
int m,
int n) {
if (MutuallyPrime(m, n)) return ::testing::AssertionSuccess();
return ::testing::AssertionFailure() << m_expr << " and " << n_expr
<< " (" << m << " and " << n << ") are not mutually prime, "
<< "as they have a common divisor " << SmallestPrimeCommonDivisor(m, n);
}
```
With this predicate-formatter, we can use
```c++
EXPECT_PRED_FORMAT2(AssertMutuallyPrime, b, c);
```
to generate the message
```none
b and c (4 and 10) are not mutually prime, as they have a common divisor 2.
```
As you may have realized, many of the built-in assertions we introduced earlier
are special cases of `(EXPECT|ASSERT)_PRED_FORMAT*`. In fact, most of them are
indeed defined using `(EXPECT|ASSERT)_PRED_FORMAT*`.
### Floating-Point Comparison ### Floating-Point Comparison
Comparing floating-point numbers is tricky. Due to round-off errors, it is very See [Floating-Point Comparison](reference/assertions.md#floating-point) in the
unlikely that two floating-points will match exactly. Therefore, `ASSERT_EQ` 's Assertions Reference.
naive comparison usually doesn't work. And since floating-points can have a wide
value range, no single fixed error bound works. It's better to compare by a
fixed relative error bound, except for values close to 0 due to the loss of
precision there.
In general, for floating-point comparison to make sense, the user needs to
carefully choose the error bound. If they don't want or care to, comparing in
terms of Units in the Last Place (ULPs) is a good default, and googletest
provides assertions to do this. Full details about ULPs are quite long; if you
want to learn more, see
[here](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/).
#### Floating-Point Macros
<!-- mdformat off(github rendering does not support multiline tables) -->
| Fatal assertion | Nonfatal assertion | Verifies |
| ------------------------------- | ------------------------------- | ---------------------------------------- |
| `ASSERT_FLOAT_EQ(val1, val2);` | `EXPECT_FLOAT_EQ(val1, val2);` | the two `float` values are almost equal |
| `ASSERT_DOUBLE_EQ(val1, val2);` | `EXPECT_DOUBLE_EQ(val1, val2);` | the two `double` values are almost equal |
<!-- mdformat on-->
By "almost equal" we mean the values are within 4 ULP's from each other.
The following assertions allow you to choose the acceptable error bound:
<!-- mdformat off(github rendering does not support multiline tables) -->
| Fatal assertion | Nonfatal assertion | Verifies |
| ------------------------------------- | ------------------------------------- | -------------------------------------------------------------------------------- |
| `ASSERT_NEAR(val1, val2, abs_error);` | `EXPECT_NEAR(val1, val2, abs_error);` | the difference between `val1` and `val2` doesn't exceed the given absolute error |
<!-- mdformat on-->
#### Floating-Point Predicate-Format Functions #### Floating-Point Predicate-Format Functions
Some floating-point operations are useful, but not that often used. In order to Some floating-point operations are useful, but not that often used. In order to
avoid an explosion of new macros, we provide them as predicate-format functions avoid an explosion of new macros, we provide them as predicate-format functions
that can be used in predicate assertion macros (e.g. `EXPECT_PRED_FORMAT2`, that can be used in the predicate assertion macro
etc). [`EXPECT_PRED_FORMAT2`](reference/assertions.md#EXPECT_PRED_FORMAT), for
example:
```c++ ```c++
EXPECT_PRED_FORMAT2(::testing::FloatLE, val1, val2); EXPECT_PRED_FORMAT2(testing::FloatLE, val1, val2);
EXPECT_PRED_FORMAT2(::testing::DoubleLE, val1, val2); EXPECT_PRED_FORMAT2(testing::DoubleLE, val1, val2);
``` ```
Verifies that `val1` is less than, or almost equal to, `val2`. You can replace The above code verifies that `val1` is less than, or approximately equal to,
`EXPECT_PRED_FORMAT2` in the above table with `ASSERT_PRED_FORMAT2`. `val2`.
### Asserting Using gMock Matchers ### Asserting Using gMock Matchers
[gMock](../../googlemock) comes with a library of matchers for validating See [`EXPECT_THAT`](reference/assertions.md#EXPECT_THAT) in the Assertions
arguments passed to mock objects. A gMock *matcher* is basically a predicate Reference.
that knows how to describe itself. It can be used in these assertion macros:
<!-- mdformat off(github rendering does not support multiline tables) -->
| Fatal assertion | Nonfatal assertion | Verifies |
| ------------------------------ | ------------------------------ | --------------------- |
| `ASSERT_THAT(value, matcher);` | `EXPECT_THAT(value, matcher);` | value matches matcher |
<!-- mdformat on-->
For example, `StartsWith(prefix)` is a matcher that matches a string starting
with `prefix`, and you can write:
```c++
using ::testing::StartsWith;
...
// Verifies that Foo() returns a string starting with "Hello".
EXPECT_THAT(Foo(), StartsWith("Hello"));
```
Read this
[recipe](../../googlemock/docs/cook_book.md#using-matchers-in-googletest-assertions)
in the gMock Cookbook for more details.
gMock has a rich set of matchers. You can do many things googletest cannot do
alone with them. For a list of matchers gMock provides, read
[this](../../googlemock/docs/cook_book.md##using-matchers). It's easy to write
your [own matchers](../../googlemock/docs/cook_book.md#NewMatchers) too.
gMock is bundled with googletest, so you don't need to add any build dependency
in order to take advantage of this. Just include `"testing/base/public/gmock.h"`
and you're ready to go.
### More String Assertions ### More String Assertions
(Please read the [previous](#asserting-using-gmock-matchers) section first if (Please read the [previous](#asserting-using-gmock-matchers) section first if
you haven't.) you haven't.)
You can use the gMock You can use the gMock [string matchers](reference/matchers.md#string-matchers)
[string matchers](../../googlemock/docs/cheat_sheet.md#string-matchers) with with [`EXPECT_THAT`](reference/assertions.md#EXPECT_THAT) to do more string
`EXPECT_THAT()` or `ASSERT_THAT()` to do more string comparison tricks comparison tricks (sub-string, prefix, suffix, regular expression, and etc). For
(sub-string, prefix, suffix, regular expression, and etc). For example, example,
```c++ ```c++
using ::testing::HasSubstr; using ::testing::HasSubstr;
...@@ -422,37 +187,10 @@ using ::testing::MatchesRegex; ...@@ -422,37 +187,10 @@ using ::testing::MatchesRegex;
EXPECT_THAT(bar_string, MatchesRegex("\\w*\\d+")); EXPECT_THAT(bar_string, MatchesRegex("\\w*\\d+"));
``` ```
If the string contains a well-formed HTML or XML document, you can check whether
its DOM tree matches an
[XPath expression](http://www.w3.org/TR/xpath/#contents):
```c++
// Currently still in //template/prototemplate/testing:xpath_matcher
#include "template/prototemplate/testing/xpath_matcher.h"
using prototemplate::testing::MatchesXPath;
EXPECT_THAT(html_string, MatchesXPath("//a[text()='click here']"));
```
### Windows HRESULT assertions ### Windows HRESULT assertions
These assertions test for `HRESULT` success or failure. See [Windows HRESULT Assertions](reference/assertions.md#HRESULT) in the
Assertions Reference.
Fatal assertion | Nonfatal assertion | Verifies
-------------------------------------- | -------------------------------------- | --------
`ASSERT_HRESULT_SUCCEEDED(expression)` | `EXPECT_HRESULT_SUCCEEDED(expression)` | `expression` is a success `HRESULT`
`ASSERT_HRESULT_FAILED(expression)` | `EXPECT_HRESULT_FAILED(expression)` | `expression` is a failure `HRESULT`
The generated output contains the human-readable error message associated with
the `HRESULT` code returned by `expression`.
You might use them like this:
```c++
CComPtr<IShellDispatch2> shell;
ASSERT_HRESULT_SUCCEEDED(shell.CoCreateInstance(L"Shell.Application"));
CComVariant empty;
ASSERT_HRESULT_SUCCEEDED(shell->ShellExecute(CComBSTR(url), empty, empty, empty, empty));
```
### Type Assertions ### Type Assertions
...@@ -465,7 +203,7 @@ You can call the function ...@@ -465,7 +203,7 @@ You can call the function
to assert that types `T1` and `T2` are the same. The function does nothing if to assert that types `T1` and `T2` are the same. The function does nothing if
the assertion is satisfied. If the types are different, the function call will the assertion is satisfied. If the types are different, the function call will
fail to compile, the compiler error message will say that fail to compile, the compiler error message will say that
`type1 and type2 are not the same type` and most likely (depending on the compiler) `T1 and T2 are not the same type` and most likely (depending on the compiler)
show you the actual values of `T1` and `T2`. This is mainly useful inside show you the actual values of `T1` and `T2`. This is mainly useful inside
template code. template code.
...@@ -476,7 +214,7 @@ instantiated. For example, given: ...@@ -476,7 +214,7 @@ instantiated. For example, given:
```c++ ```c++
template <typename T> class Foo { template <typename T> class Foo {
public: public:
void Bar() { ::testing::StaticAssertTypeEq<int, T>(); } void Bar() { testing::StaticAssertTypeEq<int, T>(); }
}; };
``` ```
...@@ -516,6 +254,7 @@ any assertion inside of it. ...@@ -516,6 +254,7 @@ any assertion inside of it.
If changing the function's type is not an option, you should just use assertions If changing the function's type is not an option, you should just use assertions
that generate non-fatal failures, such as `ADD_FAILURE*` and `EXPECT_*`. that generate non-fatal failures, such as `ADD_FAILURE*` and `EXPECT_*`.
{: .callout .note}
NOTE: Constructors and destructors are not considered void-returning functions, NOTE: Constructors and destructors are not considered void-returning functions,
according to the C++ language specification, and so you may not use fatal according to the C++ language specification, and so you may not use fatal
assertions in them; you'll get a compilation error if you try. Instead, either assertions in them; you'll get a compilation error if you try. Instead, either
...@@ -523,13 +262,46 @@ call `abort` and crash the entire test executable, or put the fatal assertion in ...@@ -523,13 +262,46 @@ call `abort` and crash the entire test executable, or put the fatal assertion in
a `SetUp`/`TearDown` function; see a `SetUp`/`TearDown` function; see
[constructor/destructor vs. `SetUp`/`TearDown`](faq.md#CtorVsSetUp) [constructor/destructor vs. `SetUp`/`TearDown`](faq.md#CtorVsSetUp)
{: .callout .warning}
WARNING: A fatal assertion in a helper function (private void-returning method) WARNING: A fatal assertion in a helper function (private void-returning method)
called from a constructor or destructor does not does not terminate the current called from a constructor or destructor does not terminate the current test, as
test, as your intuition might suggest: it merely returns from the constructor or your intuition might suggest: it merely returns from the constructor or
destructor early, possibly leaving your object in a partially-constructed or destructor early, possibly leaving your object in a partially-constructed or
partially-destructed state! You almost certainly want to `abort` or use partially-destructed state! You almost certainly want to `abort` or use
`SetUp`/`TearDown` instead. `SetUp`/`TearDown` instead.
## Skipping test execution
Related to the assertions `SUCCEED()` and `FAIL()`, you can prevent further test
execution at runtime with the `GTEST_SKIP()` macro. This is useful when you need
to check for preconditions of the system under test during runtime and skip
tests in a meaningful way.
`GTEST_SKIP()` can be used in individual test cases or in the `SetUp()` methods
of classes derived from either `::testing::Environment` or `::testing::Test`.
For example:
```c++
TEST(SkipTest, DoesSkip) {
GTEST_SKIP() << "Skipping single test";
EXPECT_EQ(0, 1); // Won't fail; it won't be executed
}
class SkipFixture : public ::testing::Test {
protected:
void SetUp() override {
GTEST_SKIP() << "Skipping all tests for this fixture";
}
};
// Tests for SkipFixture won't be executed.
TEST_F(SkipFixture, SkipsOneTest) {
EXPECT_EQ(5, 7); // Won't fail
}
```
As with assertion macros, you can stream a custom message into `GTEST_SKIP()`.
## Teaching googletest How to Print Your Values ## Teaching googletest How to Print Your Values
When a test assertion such as `EXPECT_EQ` fails, googletest prints the argument When a test assertion such as `EXPECT_EQ` fails, googletest prints the argument
...@@ -605,7 +377,7 @@ call `::testing::PrintToString(x)`, which returns an `std::string`: ...@@ -605,7 +377,7 @@ call `::testing::PrintToString(x)`, which returns an `std::string`:
vector<pair<Bar, int> > bar_ints = GetBarIntVector(); vector<pair<Bar, int> > bar_ints = GetBarIntVector();
EXPECT_TRUE(IsCorrectBarIntVector(bar_ints)) EXPECT_TRUE(IsCorrectBarIntVector(bar_ints))
<< "bar_ints = " << ::testing::PrintToString(bar_ints); << "bar_ints = " << testing::PrintToString(bar_ints);
``` ```
## Death Tests ## Death Tests
...@@ -628,73 +400,16 @@ exception and avoid the crash. If you want to verify exceptions thrown by your ...@@ -628,73 +400,16 @@ exception and avoid the crash. If you want to verify exceptions thrown by your
code, see [Exception Assertions](#ExceptionAssertions). code, see [Exception Assertions](#ExceptionAssertions).
If you want to test `EXPECT_*()/ASSERT_*()` failures in your test code, see If you want to test `EXPECT_*()/ASSERT_*()` failures in your test code, see
Catching Failures ["Catching" Failures](#catching-failures).
### How to Write a Death Test ### How to Write a Death Test
googletest has the following macros to support death tests: GoogleTest provides assertion macros to support death tests. See
[Death Assertions](reference/assertions.md#death) in the Assertions Reference
Fatal assertion | Nonfatal assertion | Verifies for details.
------------------------------------------------ | ------------------------------------------------ | --------
`ASSERT_DEATH(statement, matcher);` | `EXPECT_DEATH(statement, matcher);` | `statement` crashes with the given error
`ASSERT_DEATH_IF_SUPPORTED(statement, matcher);` | `EXPECT_DEATH_IF_SUPPORTED(statement, matcher);` | if death tests are supported, verifies that `statement` crashes with the given error; otherwise verifies nothing
`ASSERT_EXIT(statement, predicate, matcher);` | `EXPECT_EXIT(statement, predicate, matcher);` | `statement` exits with the given error, and its exit code matches `predicate`
where `statement` is a statement that is expected to cause the process to die,
`predicate` is a function or function object that evaluates an integer exit
status, and `matcher` is either a GMock matcher matching a `const std::string&`
or a (Perl) regular expression - either of which is matched against the stderr
output of `statement`. For legacy reasons, a bare string (i.e. with no matcher)
is interpreted as `ContainsRegex(str)`, **not** `Eq(str)`. Note that `statement`
can be *any valid statement* (including *compound statement*) and doesn't have
to be an expression.
As usual, the `ASSERT` variants abort the current test function, while the
`EXPECT` variants do not.
> NOTE: We use the word "crash" here to mean that the process terminates with a
> *non-zero* exit status code. There are two possibilities: either the process
> has called `exit()` or `_exit()` with a non-zero value, or it may be killed by
> a signal.
>
> This means that if `*statement*` terminates the process with a 0 exit code, it
> is *not* considered a crash by `EXPECT_DEATH`. Use `EXPECT_EXIT` instead if
> this is the case, or if you want to restrict the exit code more precisely.
A predicate here must accept an `int` and return a `bool`. The death test
succeeds only if the predicate returns `true`. googletest defines a few
predicates that handle the most common cases:
```c++
::testing::ExitedWithCode(exit_code)
```
This expression is `true` if the program exited normally with the given exit
code.
```c++
::testing::KilledBySignal(signal_number) // Not available on Windows.
```
This expression is `true` if the program was killed by the given signal.
The `*_DEATH` macros are convenient wrappers for `*_EXIT` that use a predicate To write a death test, simply use one of the macros inside your test function.
that verifies the process' exit code is non-zero. For example,
Note that a death test only cares about three things:
1. does `statement` abort or exit the process?
2. (in the case of `ASSERT_EXIT` and `EXPECT_EXIT`) does the exit status
satisfy `predicate`? Or (in the case of `ASSERT_DEATH` and `EXPECT_DEATH`)
is the exit status non-zero? And
3. does the stderr output match `regex`?
In particular, if `statement` generates an `ASSERT_*` or `EXPECT_*` failure, it
will **not** cause the death test to fail, as googletest assertions don't abort
the process.
To write a death test, simply use one of the above macros inside your test
function. For example,
```c++ ```c++
TEST(MyDeathTest, Foo) { TEST(MyDeathTest, Foo) {
...@@ -706,11 +421,11 @@ TEST(MyDeathTest, Foo) { ...@@ -706,11 +421,11 @@ TEST(MyDeathTest, Foo) {
} }
TEST(MyDeathTest, NormalExit) { TEST(MyDeathTest, NormalExit) {
EXPECT_EXIT(NormalExit(), ::testing::ExitedWithCode(0), "Success"); EXPECT_EXIT(NormalExit(), testing::ExitedWithCode(0), "Success");
} }
TEST(MyDeathTest, KillMyself) { TEST(MyDeathTest, KillProcess) {
EXPECT_EXIT(KillMyself(), ::testing::KilledBySignal(SIGKILL), EXPECT_EXIT(KillProcess(), testing::KilledBySignal(SIGKILL),
"Sending myself unblockable signal"); "Sending myself unblockable signal");
} }
``` ```
...@@ -720,13 +435,26 @@ verifies that: ...@@ -720,13 +435,26 @@ verifies that:
* calling `Foo(5)` causes the process to die with the given error message, * calling `Foo(5)` causes the process to die with the given error message,
* calling `NormalExit()` causes the process to print `"Success"` to stderr and * calling `NormalExit()` causes the process to print `"Success"` to stderr and
exit with exit code 0, and exit with exit code 0, and
* calling `KillMyself()` kills the process with signal `SIGKILL`. * calling `KillProcess()` kills the process with signal `SIGKILL`.
The test function body may contain other assertions and statements as well, if The test function body may contain other assertions and statements as well, if
necessary. necessary.
Note that a death test only cares about three things:
1. does `statement` abort or exit the process?
2. (in the case of `ASSERT_EXIT` and `EXPECT_EXIT`) does the exit status
satisfy `predicate`? Or (in the case of `ASSERT_DEATH` and `EXPECT_DEATH`)
is the exit status non-zero? And
3. does the stderr output match `matcher`?
In particular, if `statement` generates an `ASSERT_*` or `EXPECT_*` failure, it
will **not** cause the death test to fail, as googletest assertions don't abort
the process.
### Death Test Naming ### Death Test Naming
{: .callout .important}
IMPORTANT: We strongly recommend you to follow the convention of naming your IMPORTANT: We strongly recommend you to follow the convention of naming your
**test suite** (not test) `*DeathTest` when it contains a death test, as **test suite** (not test) `*DeathTest` when it contains a death test, as
demonstrated in the above example. The demonstrated in the above example. The
...@@ -737,7 +465,7 @@ If a test fixture class is shared by normal tests and death tests, you can use ...@@ -737,7 +465,7 @@ If a test fixture class is shared by normal tests and death tests, you can use
duplicating its code: duplicating its code:
```c++ ```c++
class FooTest : public ::testing::Test { ... }; class FooTest : public testing::Test { ... };
using FooDeathTest = FooTest; using FooDeathTest = FooTest;
...@@ -795,31 +523,8 @@ limited syntax only. ...@@ -795,31 +523,8 @@ limited syntax only.
### How It Works ### How It Works
Under the hood, `ASSERT_EXIT()` spawns a new process and executes the death test See [Death Assertions](reference/assertions.md#death) in the Assertions
statement in that process. The details of how precisely that happens depend on Reference.
the platform and the variable ::testing::GTEST_FLAG(death_test_style) (which is
initialized from the command-line flag `--gtest_death_test_style`).
* On POSIX systems, `fork()` (or `clone()` on Linux) is used to spawn the
child, after which:
* If the variable's value is `"fast"`, the death test statement is
immediately executed.
* If the variable's value is `"threadsafe"`, the child process re-executes
the unit test binary just as it was originally invoked, but with some
extra flags to cause just the single death test under consideration to
be run.
* On Windows, the child is spawned using the `CreateProcess()` API, and
re-executes the binary to cause just the single death test under
consideration to be run - much like the `threadsafe` mode on POSIX.
Other values for the variable are illegal and will cause the death test to fail.
Currently, the flag's default value is **"fast"**
1. the child's exit status satisfies the predicate, and
2. the child's stderr matches the regular expression.
If the death test statement runs to completion without dying, the child process
will nonetheless terminate, and the assertion fails.
### Death Tests And Threads ### Death Tests And Threads
...@@ -862,13 +567,13 @@ restored afterwards, so you need not do that yourself. For example: ...@@ -862,13 +567,13 @@ restored afterwards, so you need not do that yourself. For example:
```c++ ```c++
int main(int argc, char** argv) { int main(int argc, char** argv) {
InitGoogle(argv[0], &argc, &argv, true); testing::InitGoogleTest(&argc, argv);
::testing::FLAGS_gtest_death_test_style = "fast"; testing::FLAGS_gtest_death_test_style = "fast";
return RUN_ALL_TESTS(); return RUN_ALL_TESTS();
} }
TEST(MyDeathTest, TestOne) { TEST(MyDeathTest, TestOne) {
::testing::FLAGS_gtest_death_test_style = "threadsafe"; testing::FLAGS_gtest_death_test_style = "threadsafe";
// This test is run in the "threadsafe" style: // This test is run in the "threadsafe" style:
ASSERT_DEATH(ThisShouldDie(), ""); ASSERT_DEATH(ThisShouldDie(), "");
} }
...@@ -908,6 +613,13 @@ handlers registered with `pthread_atfork(3)`. ...@@ -908,6 +613,13 @@ handlers registered with `pthread_atfork(3)`.
## Using Assertions in Sub-routines ## Using Assertions in Sub-routines
{: .callout .note}
Note: If you want to put a series of test assertions in a subroutine to check
for a complex condition, consider using
[a custom GMock matcher](gmock_cook_book.md#NewMatchers)
instead. This lets you provide a more readable error message in case of failure
and avoid all of the issues described below.
### Adding Traces to Assertions ### Adding Traces to Assertions
If a test sub-routine is called from several places, when an assertion inside it If a test sub-routine is called from several places, when an assertion inside it
...@@ -918,6 +630,8 @@ the `SCOPED_TRACE` macro or the `ScopedTrace` utility: ...@@ -918,6 +630,8 @@ the `SCOPED_TRACE` macro or the `ScopedTrace` utility:
```c++ ```c++
SCOPED_TRACE(message); SCOPED_TRACE(message);
```
```c++
ScopedTrace trace("file_path", line_number, message); ScopedTrace trace("file_path", line_number, message);
``` ```
...@@ -953,7 +667,7 @@ path/to/foo_test.cc:11: Failure ...@@ -953,7 +667,7 @@ path/to/foo_test.cc:11: Failure
Value of: Bar(n) Value of: Bar(n)
Expected: 1 Expected: 1
Actual: 2 Actual: 2
Trace: Google Test trace:
path/to/foo_test.cc:17: A path/to/foo_test.cc:17: A
path/to/foo_test.cc:12: Failure path/to/foo_test.cc:12: Failure
...@@ -1003,7 +717,7 @@ TEST(FooTest, Bar) { ...@@ -1003,7 +717,7 @@ TEST(FooTest, Bar) {
// in Subroutine() to abort the entire test. // in Subroutine() to abort the entire test.
// The actual behavior: the function goes on after Subroutine() returns. // The actual behavior: the function goes on after Subroutine() returns.
int* p = NULL; int* p = nullptr;
*p = 3; // Segfault! *p = 3; // Segfault!
} }
``` ```
...@@ -1097,7 +811,7 @@ If `HasFatalFailure()` is used outside of `TEST()` , `TEST_F()` , or a test ...@@ -1097,7 +811,7 @@ If `HasFatalFailure()` is used outside of `TEST()` , `TEST_F()` , or a test
fixture, you must add the `::testing::Test::` prefix, as in: fixture, you must add the `::testing::Test::` prefix, as in:
```c++ ```c++
if (::testing::Test::HasFatalFailure()) return; if (testing::Test::HasFatalFailure()) return;
``` ```
Similarly, `HasNonfatalFailure()` returns `true` if the current test has at Similarly, `HasNonfatalFailure()` returns `true` if the current test has at
...@@ -1127,12 +841,13 @@ will output XML like this: ...@@ -1127,12 +841,13 @@ will output XML like this:
... ...
``` ```
{: .callout .note}
> NOTE: > NOTE:
> >
> * `RecordProperty()` is a static member of the `Test` class. Therefore it > * `RecordProperty()` is a static member of the `Test` class. Therefore it
> needs to be prefixed with `::testing::Test::` if used outside of the > needs to be prefixed with `::testing::Test::` if used outside of the
> `TEST` body and the test fixture class. > `TEST` body and the test fixture class.
> * `*key*` must be a valid XML attribute name, and cannot conflict with the > * *`key`* must be a valid XML attribute name, and cannot conflict with the
> ones already used by googletest (`name`, `status`, `time`, `classname`, > ones already used by googletest (`name`, `status`, `time`, `classname`,
> `type_param`, and `value_param`). > `type_param`, and `value_param`).
> * Calling `RecordProperty()` outside of the lifespan of a test is allowed. > * Calling `RecordProperty()` outside of the lifespan of a test is allowed.
...@@ -1176,7 +891,7 @@ state to its original value before passing control to the next test. ...@@ -1176,7 +891,7 @@ state to its original value before passing control to the next test.
Here's an example of per-test-suite set-up and tear-down: Here's an example of per-test-suite set-up and tear-down:
```c++ ```c++
class FooTest : public ::testing::Test { class FooTest : public testing::Test {
protected: protected:
// Per-test-suite set-up. // Per-test-suite set-up.
// Called before the first test in this test suite. // Called before the first test in this test suite.
...@@ -1190,20 +905,20 @@ class FooTest : public ::testing::Test { ...@@ -1190,20 +905,20 @@ class FooTest : public ::testing::Test {
// Can be omitted if not needed. // Can be omitted if not needed.
static void TearDownTestSuite() { static void TearDownTestSuite() {
delete shared_resource_; delete shared_resource_;
shared_resource_ = NULL; shared_resource_ = nullptr;
} }
// You can define per-test set-up logic as usual. // You can define per-test set-up logic as usual.
virtual void SetUp() { ... } void SetUp() override { ... }
// You can define per-test tear-down logic as usual. // You can define per-test tear-down logic as usual.
virtual void TearDown() { ... } void TearDown() override { ... }
// Some expensive resource shared by all tests. // Some expensive resource shared by all tests.
static T* shared_resource_; static T* shared_resource_;
}; };
T* FooTest::shared_resource_ = NULL; T* FooTest::shared_resource_ = nullptr;
TEST_F(FooTest, Test1) { TEST_F(FooTest, Test1) {
... you can refer to shared_resource_ here ... ... you can refer to shared_resource_ here ...
...@@ -1214,6 +929,7 @@ TEST_F(FooTest, Test2) { ...@@ -1214,6 +929,7 @@ TEST_F(FooTest, Test2) {
} }
``` ```
{: .callout .note}
NOTE: Though the above code declares `SetUpTestSuite()` protected, it may NOTE: Though the above code declares `SetUpTestSuite()` protected, it may
sometimes be necessary to declare it public, such as when using it with sometimes be necessary to declare it public, such as when using it with
`TEST_P`. `TEST_P`.
...@@ -1229,7 +945,7 @@ environment, which knows how to set-up and tear-down: ...@@ -1229,7 +945,7 @@ environment, which knows how to set-up and tear-down:
```c++ ```c++
class Environment : public ::testing::Environment { class Environment : public ::testing::Environment {
public: public:
virtual ~Environment() {} ~Environment() override {}
// Override this to define how to set up the environment. // Override this to define how to set up the environment.
void SetUp() override {} void SetUp() override {}
...@@ -1265,8 +981,8 @@ probably in `main()`. If you use `gtest_main`, you need to call this before ...@@ -1265,8 +981,8 @@ probably in `main()`. If you use `gtest_main`, you need to call this before
variable like this: variable like this:
```c++ ```c++
::testing::Environment* const foo_env = testing::Environment* const foo_env =
::testing::AddGlobalTestEnvironment(new FooEnvironment); testing::AddGlobalTestEnvironment(new FooEnvironment);
``` ```
However, we strongly recommend you to write your own `main()` and call However, we strongly recommend you to write your own `main()` and call
...@@ -1301,6 +1017,7 @@ and `testing::WithParamInterface<T>`. `T` can be any copyable type. If it's a ...@@ -1301,6 +1017,7 @@ and `testing::WithParamInterface<T>`. `T` can be any copyable type. If it's a
raw pointer, you are responsible for managing the lifespan of the pointed raw pointer, you are responsible for managing the lifespan of the pointed
values. values.
{: .callout .note}
NOTE: If your test fixture defines `SetUpTestSuite()` or `TearDownTestSuite()` NOTE: If your test fixture defines `SetUpTestSuite()` or `TearDownTestSuite()`
they must be declared **public** rather than **protected** in order to use they must be declared **public** rather than **protected** in order to use
`TEST_P`. `TEST_P`.
...@@ -1340,80 +1057,80 @@ TEST_P(FooTest, HasBlahBlah) { ...@@ -1340,80 +1057,80 @@ TEST_P(FooTest, HasBlahBlah) {
} }
``` ```
Finally, you can use `INSTANTIATE_TEST_SUITE_P` to instantiate the test suite Finally, you can use the `INSTANTIATE_TEST_SUITE_P` macro to instantiate the
with any set of parameters you want. googletest defines a number of functions test suite with any set of parameters you want. GoogleTest defines a number of
for generating test parameters. They return what we call (surprise!) *parameter functions for generating test parameters—see details at
generators*. Here is a summary of them, which are all in the `testing` [`INSTANTIATE_TEST_SUITE_P`](reference/testing.md#INSTANTIATE_TEST_SUITE_P) in
namespace: the Testing Reference.
<!-- mdformat off(github rendering does not support multiline tables) -->
| Parameter Generator | Behavior |
| ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| `Range(begin, end [, step])` | Yields values `{begin, begin+step, begin+step+step, ...}`. The values do not include `end`. `step` defaults to 1. |
| `Values(v1, v2, ..., vN)` | Yields values `{v1, v2, ..., vN}`. |
| `ValuesIn(container)` and `ValuesIn(begin,end)` | Yields values from a C-style array, an STL-style container, or an iterator range `[begin, end)` |
| `Bool()` | Yields sequence `{false, true}`. |
| `Combine(g1, g2, ..., gN)` | Yields all combinations (Cartesian product) as std\:\:tuples of the values generated by the `N` generators. |
<!-- mdformat on-->
For more details, see the comments at the definitions of these functions.
The following statement will instantiate tests from the `FooTest` test suite For example, the following statement will instantiate tests from the `FooTest`
each with parameter values `"meeny"`, `"miny"`, and `"moe"`. test suite each with parameter values `"meeny"`, `"miny"`, and `"moe"` using the
[`Values`](reference/testing.md#param-generators) parameter generator:
```c++ ```c++
INSTANTIATE_TEST_SUITE_P(InstantiationName, INSTANTIATE_TEST_SUITE_P(MeenyMinyMoe,
FooTest, FooTest,
testing::Values("meeny", "miny", "moe")); testing::Values("meeny", "miny", "moe"));
``` ```
{: .callout .note}
NOTE: The code above must be placed at global or namespace scope, not at NOTE: The code above must be placed at global or namespace scope, not at
function scope. function scope.
NOTE: Don't forget this step! If you do your test will silently pass, but none The first argument to `INSTANTIATE_TEST_SUITE_P` is a unique name for the
of its suites will ever run! instantiation of the test suite. The next argument is the name of the test
pattern, and the last is the
[parameter generator](reference/testing.md#param-generators).
To distinguish different instances of the pattern (yes, you can instantiate it You can instantiate a test pattern more than once, so to distinguish different
more than once), the first argument to `INSTANTIATE_TEST_SUITE_P` is a prefix instances of the pattern, the instantiation name is added as a prefix to the
that will be added to the actual test suite name. Remember to pick unique actual test suite name. Remember to pick unique prefixes for different
prefixes for different instantiations. The tests from the instantiation above instantiations. The tests from the instantiation above will have these names:
will have these names:
* `InstantiationName/FooTest.DoesBlah/0` for `"meeny"` * `MeenyMinyMoe/FooTest.DoesBlah/0` for `"meeny"`
* `InstantiationName/FooTest.DoesBlah/1` for `"miny"` * `MeenyMinyMoe/FooTest.DoesBlah/1` for `"miny"`
* `InstantiationName/FooTest.DoesBlah/2` for `"moe"` * `MeenyMinyMoe/FooTest.DoesBlah/2` for `"moe"`
* `InstantiationName/FooTest.HasBlahBlah/0` for `"meeny"` * `MeenyMinyMoe/FooTest.HasBlahBlah/0` for `"meeny"`
* `InstantiationName/FooTest.HasBlahBlah/1` for `"miny"` * `MeenyMinyMoe/FooTest.HasBlahBlah/1` for `"miny"`
* `InstantiationName/FooTest.HasBlahBlah/2` for `"moe"` * `MeenyMinyMoe/FooTest.HasBlahBlah/2` for `"moe"`
You can use these names in [`--gtest_filter`](#running-a-subset-of-the-tests). You can use these names in [`--gtest_filter`](#running-a-subset-of-the-tests).
This statement will instantiate all tests from `FooTest` again, each with The following statement will instantiate all tests from `FooTest` again, each
parameter values `"cat"` and `"dog"`: with parameter values `"cat"` and `"dog"` using the
[`ValuesIn`](reference/testing.md#param-generators) parameter generator:
```c++ ```c++
const char* pets[] = {"cat", "dog"}; const char* pets[] = {"cat", "dog"};
INSTANTIATE_TEST_SUITE_P(AnotherInstantiationName, FooTest, INSTANTIATE_TEST_SUITE_P(Pets, FooTest, testing::ValuesIn(pets));
testing::ValuesIn(pets));
``` ```
The tests from the instantiation above will have these names: The tests from the instantiation above will have these names:
* `AnotherInstantiationName/FooTest.DoesBlah/0` for `"cat"` * `Pets/FooTest.DoesBlah/0` for `"cat"`
* `AnotherInstantiationName/FooTest.DoesBlah/1` for `"dog"` * `Pets/FooTest.DoesBlah/1` for `"dog"`
* `AnotherInstantiationName/FooTest.HasBlahBlah/0` for `"cat"` * `Pets/FooTest.HasBlahBlah/0` for `"cat"`
* `AnotherInstantiationName/FooTest.HasBlahBlah/1` for `"dog"` * `Pets/FooTest.HasBlahBlah/1` for `"dog"`
Please note that `INSTANTIATE_TEST_SUITE_P` will instantiate *all* tests in the Please note that `INSTANTIATE_TEST_SUITE_P` will instantiate *all* tests in the
given test suite, whether their definitions come before or *after* the given test suite, whether their definitions come before or *after* the
`INSTANTIATE_TEST_SUITE_P` statement. `INSTANTIATE_TEST_SUITE_P` statement.
Additionally, by default, every `TEST_P` without a corresponding
`INSTANTIATE_TEST_SUITE_P` causes a failing test in test suite
`GoogleTestVerification`. If you have a test suite where that omission is not an
error, for example it is in a library that may be linked in for other reasons or
where the list of test cases is dynamic and may be empty, then this check can be
suppressed by tagging the test suite:
```c++
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(FooTest);
```
You can see [sample7_unittest.cc] and [sample8_unittest.cc] for more examples. You can see [sample7_unittest.cc] and [sample8_unittest.cc] for more examples.
[sample7_unittest.cc]: ../samples/sample7_unittest.cc "Parameterized Test example" [sample7_unittest.cc]: https://github.com/google/googletest/blob/master/googletest/samples/sample7_unittest.cc "Parameterized Test example"
[sample8_unittest.cc]: ../samples/sample8_unittest.cc "Parameterized Test example with multiple parameters" [sample8_unittest.cc]: https://github.com/google/googletest/blob/master/googletest/samples/sample8_unittest.cc "Parameterized Test example with multiple parameters"
### Creating Value-Parameterized Abstract Tests ### Creating Value-Parameterized Abstract Tests
...@@ -1450,6 +1167,7 @@ the test parameters. The function should accept one argument of type ...@@ -1450,6 +1167,7 @@ the test parameters. The function should accept one argument of type
returns the value of `testing::PrintToString(GetParam())`. It does not work for returns the value of `testing::PrintToString(GetParam())`. It does not work for
`std::string` or C strings. `std::string` or C strings.
{: .callout .note}
NOTE: test names must be non-empty, unique, and may only contain ASCII NOTE: test names must be non-empty, unique, and may only contain ASCII
alphanumeric characters. In particular, they alphanumeric characters. In particular, they
[should not contain underscores](faq.md#why-should-test-suite-names-and-test-names-not-contain-underscore) [should not contain underscores](faq.md#why-should-test-suite-names-and-test-names-not-contain-underscore)
...@@ -1476,17 +1194,17 @@ for conciseness: ...@@ -1476,17 +1194,17 @@ for conciseness:
```c++ ```c++
enum class MyType { MY_FOO = 0, MY_BAR = 1 }; enum class MyType { MY_FOO = 0, MY_BAR = 1 };
class MyTestSuite : public testing::TestWithParam<std::tuple<MyType, string>> { class MyTestSuite : public testing::TestWithParam<std::tuple<MyType, std::string>> {
}; };
INSTANTIATE_TEST_SUITE_P( INSTANTIATE_TEST_SUITE_P(
MyGroup, MyTestSuite, MyGroup, MyTestSuite,
testing::Combine( testing::Combine(
testing::Values(MyType::VALUE_0, MyType::VALUE_1), testing::Values(MyType::MY_FOO, MyType::MY_BAR),
testing::ValuesIn("", "")), testing::Values("A", "B")),
[](const testing::TestParamInfo<MyTestSuite::ParamType>& info) { [](const testing::TestParamInfo<MyTestSuite::ParamType>& info) {
string name = absl::StrCat( std::string name = absl::StrCat(
std::get<0>(info.param) == MY_FOO ? "Foo" : "Bar", "_", std::get<0>(info.param) == MyType::MY_FOO ? "Foo" : "Bar",
std::get<1>(info.param)); std::get<1>(info.param));
absl::c_replace_if(name, [](char c) { return !std::isalnum(c); }, '_'); absl::c_replace_if(name, [](char c) { return !std::isalnum(c); }, '_');
return name; return name;
...@@ -1515,10 +1233,10 @@ Remember to derive it from `::testing::Test`: ...@@ -1515,10 +1233,10 @@ Remember to derive it from `::testing::Test`:
```c++ ```c++
template <typename T> template <typename T>
class FooTest : public ::testing::Test { class FooTest : public testing::Test {
public: public:
... ...
typedef std::list<T> List; using List = std::list<T>;
static T shared_; static T shared_;
T value_; T value_;
}; };
...@@ -1563,7 +1281,7 @@ TYPED_TEST(FooTest, HasPropertyA) { ... } ...@@ -1563,7 +1281,7 @@ TYPED_TEST(FooTest, HasPropertyA) { ... }
You can see [sample6_unittest.cc] for a complete example. You can see [sample6_unittest.cc] for a complete example.
[sample6_unittest.cc]: ../samples/sample6_unittest.cc "Typed Test example" [sample6_unittest.cc]: https://github.com/google/googletest/blob/master/googletest/samples/sample6_unittest.cc "Typed Test example"
## Type-Parameterized Tests ## Type-Parameterized Tests
...@@ -1583,7 +1301,7 @@ First, define a fixture class template, as we did with typed tests: ...@@ -1583,7 +1301,7 @@ First, define a fixture class template, as we did with typed tests:
```c++ ```c++
template <typename T> template <typename T>
class FooTest : public ::testing::Test { class FooTest : public testing::Test {
... ...
}; };
``` ```
...@@ -1622,7 +1340,7 @@ put the above code in a header file, you can `#include` it in multiple C++ ...@@ -1622,7 +1340,7 @@ put the above code in a header file, you can `#include` it in multiple C++
source files and instantiate it multiple times. source files and instantiate it multiple times.
```c++ ```c++
typedef ::testing::Types<char, int, unsigned int> MyTypes; using MyTypes = ::testing::Types<char, int, unsigned int>;
INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes); INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);
``` ```
...@@ -1718,10 +1436,11 @@ To test them, we use the following special techniques: ...@@ -1718,10 +1436,11 @@ To test them, we use the following special techniques:
} }
``` ```
Pay special attention when your class is defined in a namespace, as you Pay special attention when your class is defined in a namespace. If you want
should define your test fixtures and tests in the same namespace if you want your test fixtures and tests to be friends of your class, then they must be
them to be friends of your class. For example, if the code to be tested defined in the exact same namespace (no anonymous or inline namespaces).
looks like:
For example, if the code to be tested looks like:
```c++ ```c++
namespace my_namespace { namespace my_namespace {
...@@ -1741,7 +1460,7 @@ To test them, we use the following special techniques: ...@@ -1741,7 +1460,7 @@ To test them, we use the following special techniques:
```c++ ```c++
namespace my_namespace { namespace my_namespace {
class FooTest : public ::testing::Test { class FooTest : public testing::Test {
protected: protected:
... ...
}; };
...@@ -1762,7 +1481,7 @@ In frameworks that report a failure by throwing an exception, you could catch ...@@ -1762,7 +1481,7 @@ In frameworks that report a failure by throwing an exception, you could catch
the exception and assert on it. But googletest doesn't use exceptions, so how do the exception and assert on it. But googletest doesn't use exceptions, so how do
we test that a piece of code generates an expected failure? we test that a piece of code generates an expected failure?
gunit-spi.h contains some constructs to do this. After #including this header, `"gtest/gtest-spi.h"` contains some constructs to do this. After #including this header,
you can use you can use
```c++ ```c++
...@@ -1788,6 +1507,7 @@ well, use one of the following macros instead: ...@@ -1788,6 +1507,7 @@ well, use one of the following macros instead:
EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substring); EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substring);
``` ```
{: .callout .note}
NOTE: Assertions from multiple threads are currently not supported on Windows. NOTE: Assertions from multiple threads are currently not supported on Windows.
For technical reasons, there are some caveats: For technical reasons, there are some caveats:
...@@ -1803,7 +1523,7 @@ For technical reasons, there are some caveats: ...@@ -1803,7 +1523,7 @@ For technical reasons, there are some caveats:
## Registering tests programmatically ## Registering tests programmatically
The `TEST` macros handle the vast majority of all use cases, but there are few The `TEST` macros handle the vast majority of all use cases, but there are few
were runtime registration logic is required. For those cases, the framework where runtime registration logic is required. For those cases, the framework
provides the `::testing::RegisterTest` that allows callers to register arbitrary provides the `::testing::RegisterTest` that allows callers to register arbitrary
tests dynamically. tests dynamically.
...@@ -1836,7 +1556,7 @@ undefined. ...@@ -1836,7 +1556,7 @@ undefined.
Use case example: Use case example:
```c++ ```c++
class MyFixture : public ::testing::Test { class MyFixture : public testing::Test {
public: public:
// All of these optional, just like in regular macro usage. // All of these optional, just like in regular macro usage.
static void SetUpTestSuite() { ... } static void SetUpTestSuite() { ... }
...@@ -1856,7 +1576,7 @@ class MyTest : public MyFixture { ...@@ -1856,7 +1576,7 @@ class MyTest : public MyFixture {
void RegisterMyTests(const std::vector<int>& values) { void RegisterMyTests(const std::vector<int>& values) {
for (int v : values) { for (int v : values) {
::testing::RegisterTest( testing::RegisterTest(
"MyFixture", ("Test" + std::to_string(v)).c_str(), nullptr, "MyFixture", ("Test" + std::to_string(v)).c_str(), nullptr,
std::to_string(v).c_str(), std::to_string(v).c_str(),
__FILE__, __LINE__, __FILE__, __LINE__,
...@@ -1876,35 +1596,18 @@ int main(int argc, char** argv) { ...@@ -1876,35 +1596,18 @@ int main(int argc, char** argv) {
Sometimes a function may need to know the name of the currently running test. Sometimes a function may need to know the name of the currently running test.
For example, you may be using the `SetUp()` method of your test fixture to set For example, you may be using the `SetUp()` method of your test fixture to set
the golden file name based on which test is running. The `::testing::TestInfo` the golden file name based on which test is running. The
class has this information: [`TestInfo`](reference/testing.md#TestInfo) class has this information.
```c++
namespace testing {
class TestInfo {
public:
// Returns the test suite name and the test name, respectively.
//
// Do NOT delete or free the return value - it's managed by the
// TestInfo class.
const char* test_suite_name() const;
const char* name() const;
};
}
```
To obtain a `TestInfo` object for the currently running test, call To obtain a `TestInfo` object for the currently running test, call
`current_test_info()` on the `UnitTest` singleton object: `current_test_info()` on the [`UnitTest`](reference/testing.md#UnitTest)
singleton object:
```c++ ```c++
// Gets information about the currently running test. // Gets information about the currently running test.
// Do NOT delete the returned object - it's managed by the UnitTest class. // Do NOT delete the returned object - it's managed by the UnitTest class.
const ::testing::TestInfo* const test_info = const testing::TestInfo* const test_info =
::testing::UnitTest::GetInstance()->current_test_info(); testing::UnitTest::GetInstance()->current_test_info();
printf("We are in test %s of test suite %s.\n", printf("We are in test %s of test suite %s.\n",
test_info->name(), test_info->name(),
...@@ -1912,8 +1615,8 @@ To obtain a `TestInfo` object for the currently running test, call ...@@ -1912,8 +1615,8 @@ To obtain a `TestInfo` object for the currently running test, call
``` ```
`current_test_info()` returns a null pointer if no test is running. In `current_test_info()` returns a null pointer if no test is running. In
particular, you cannot find the test suite name in `TestSuiteSetUp()`, particular, you cannot find the test suite name in `SetUpTestSuite()`,
`TestSuiteTearDown()` (where you know the test suite name implicitly), or `TearDownTestSuite()` (where you know the test suite name implicitly), or
functions called from them. functions called from them.
## Extending googletest by Handling Test Events ## Extending googletest by Handling Test Events
...@@ -1928,12 +1631,14 @@ checkpoints to implement a resource leak checker, for example. ...@@ -1928,12 +1631,14 @@ checkpoints to implement a resource leak checker, for example.
### Defining Event Listeners ### Defining Event Listeners
To define a event listener, you subclass either testing::TestEventListener or To define a event listener, you subclass either
testing::EmptyTestEventListener The former is an (abstract) interface, where [`testing::TestEventListener`](reference/testing.md#TestEventListener) or
*each pure virtual method can be overridden to handle a test event* (For [`testing::EmptyTestEventListener`](reference/testing.md#EmptyTestEventListener)
example, when a test starts, the `OnTestStart()` method will be called.). The The former is an (abstract) interface, where *each pure virtual method can be
latter provides an empty implementation of all methods in the interface, such overridden to handle a test event* (For example, when a test starts, the
that a subclass only needs to override the methods it cares about. `OnTestStart()` method will be called.). The latter provides an empty
implementation of all methods in the interface, such that a subclass only needs
to override the methods it cares about.
When an event is fired, its context is passed to the handler function as an When an event is fired, its context is passed to the handler function as an
argument. The following argument types are used: argument. The following argument types are used:
...@@ -1950,15 +1655,15 @@ interesting information about the event and the test program's state. ...@@ -1950,15 +1655,15 @@ interesting information about the event and the test program's state.
Here's an example: Here's an example:
```c++ ```c++
class MinimalistPrinter : public ::testing::EmptyTestEventListener { class MinimalistPrinter : public testing::EmptyTestEventListener {
// Called before a test starts. // Called before a test starts.
virtual void OnTestStart(const ::testing::TestInfo& test_info) { void OnTestStart(const testing::TestInfo& test_info) override {
printf("*** Test %s.%s starting.\n", printf("*** Test %s.%s starting.\n",
test_info.test_suite_name(), test_info.name()); test_info.test_suite_name(), test_info.name());
} }
// Called after a failed assertion or a SUCCESS(). // Called after a failed assertion or a SUCCESS().
virtual void OnTestPartResult(const ::testing::TestPartResult& test_part_result) { void OnTestPartResult(const testing::TestPartResult& test_part_result) override {
printf("%s in %s:%d\n%s\n", printf("%s in %s:%d\n%s\n",
test_part_result.failed() ? "*** Failure" : "Success", test_part_result.failed() ? "*** Failure" : "Success",
test_part_result.file_name(), test_part_result.file_name(),
...@@ -1967,7 +1672,7 @@ Here's an example: ...@@ -1967,7 +1672,7 @@ Here's an example:
} }
// Called after a test ends. // Called after a test ends.
virtual void OnTestEnd(const ::testing::TestInfo& test_info) { void OnTestEnd(const testing::TestInfo& test_info) override {
printf("*** Test %s.%s ending.\n", printf("*** Test %s.%s ending.\n",
test_info.test_suite_name(), test_info.name()); test_info.test_suite_name(), test_info.name());
} }
...@@ -1977,16 +1682,17 @@ Here's an example: ...@@ -1977,16 +1682,17 @@ Here's an example:
### Using Event Listeners ### Using Event Listeners
To use the event listener you have defined, add an instance of it to the To use the event listener you have defined, add an instance of it to the
googletest event listener list (represented by class TestEventListeners - note googletest event listener list (represented by class
the "s" at the end of the name) in your `main()` function, before calling [`TestEventListeners`](reference/testing.md#TestEventListeners) - note the "s"
at the end of the name) in your `main()` function, before calling
`RUN_ALL_TESTS()`: `RUN_ALL_TESTS()`:
```c++ ```c++
int main(int argc, char** argv) { int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv); testing::InitGoogleTest(&argc, argv);
// Gets hold of the event listener list. // Gets hold of the event listener list.
::testing::TestEventListeners& listeners = testing::TestEventListeners& listeners =
::testing::UnitTest::GetInstance()->listeners(); testing::UnitTest::GetInstance()->listeners();
// Adds a listener to the end. googletest takes the ownership. // Adds a listener to the end. googletest takes the ownership.
listeners.Append(new MinimalistPrinter); listeners.Append(new MinimalistPrinter);
return RUN_ALL_TESTS(); return RUN_ALL_TESTS();
...@@ -2008,7 +1714,7 @@ You can do so by adding one line: ...@@ -2008,7 +1714,7 @@ You can do so by adding one line:
Now, sit back and enjoy a completely different output from your tests. For more Now, sit back and enjoy a completely different output from your tests. For more
details, see [sample9_unittest.cc]. details, see [sample9_unittest.cc].
[sample9_unittest.cc]: ../samples/sample9_unittest.cc "Event listener example" [sample9_unittest.cc]: https://github.com/google/googletest/blob/master/googletest/samples/sample9_unittest.cc "Event listener example"
You may append more than one listener to the list. When an `On*Start()` or You may append more than one listener to the list. When an `On*Start()` or
`OnTestPartResult()` event is fired, the listeners will receive it in the order `OnTestPartResult()` event is fired, the listeners will receive it in the order
...@@ -2035,7 +1741,7 @@ by the former. ...@@ -2035,7 +1741,7 @@ by the former.
See [sample10_unittest.cc] for an example of a failure-raising listener. See [sample10_unittest.cc] for an example of a failure-raising listener.
[sample10_unittest.cc]: ../samples/sample10_unittest.cc "Failure-raising listener example" [sample10_unittest.cc]: https://github.com/google/googletest/blob/master/googletest/samples/sample10_unittest.cc "Failure-raising listener example"
## Running Test Programs: Advanced Options ## Running Test Programs: Advanced Options
...@@ -2104,6 +1810,15 @@ For example: ...@@ -2104,6 +1810,15 @@ For example:
everything in test suite `FooTest` except `FooTest.Bar` and everything in everything in test suite `FooTest` except `FooTest.Bar` and everything in
test suite `BarTest` except `BarTest.Foo`. test suite `BarTest` except `BarTest.Foo`.
#### Stop test execution upon first failure
By default, a googletest program runs all tests the user has defined. In some
cases (e.g. iterative test development & execution) it may be desirable stop
test execution upon first failure (trading improved latency for completeness).
If `GTEST_FAIL_FAST` environment variable or `--gtest_fail_fast` flag is set,
the test runner will stop execution as soon as the first test failure is
found.
#### Temporarily Disabling Tests #### Temporarily Disabling Tests
If you have a broken test that you cannot fix right away, you can add the If you have a broken test that you cannot fix right away, you can add the
...@@ -2122,19 +1837,21 @@ will still be compiled: ...@@ -2122,19 +1837,21 @@ will still be compiled:
// Tests that Foo does Abc. // Tests that Foo does Abc.
TEST(FooTest, DISABLED_DoesAbc) { ... } TEST(FooTest, DISABLED_DoesAbc) { ... }
class DISABLED_BarTest : public ::testing::Test { ... }; class DISABLED_BarTest : public testing::Test { ... };
// Tests that Bar does Xyz. // Tests that Bar does Xyz.
TEST_F(DISABLED_BarTest, DoesXyz) { ... } TEST_F(DISABLED_BarTest, DoesXyz) { ... }
``` ```
{: .callout .note}
NOTE: This feature should only be used for temporary pain-relief. You still have NOTE: This feature should only be used for temporary pain-relief. You still have
to fix the disabled tests at a later date. As a reminder, googletest will print to fix the disabled tests at a later date. As a reminder, googletest will print
a banner warning you if a test program contains any disabled tests. a banner warning you if a test program contains any disabled tests.
TIP: You can easily count the number of disabled tests you have using `gsearch` {: .callout .tip}
and/or `grep`. This number can be used as a metric for improving your test TIP: You can easily count the number of disabled tests you have using
quality. `grep`. This number can be used as a metric for
improving your test quality.
#### Temporarily Enabling Disabled Tests #### Temporarily Enabling Disabled Tests
...@@ -2201,38 +1918,25 @@ random seed and re-shuffle the tests in each iteration. ...@@ -2201,38 +1918,25 @@ random seed and re-shuffle the tests in each iteration.
googletest can use colors in its terminal output to make it easier to spot the googletest can use colors in its terminal output to make it easier to spot the
important information: important information:
<code> <pre>...
...<br/> <font color="green">[----------]</font> 1 test from FooTest
<font color="green">[----------]</font><font color="black"> 1 test from <font color="green">[ RUN ]</font> FooTest.DoesAbc
FooTest</font><br/> <font color="green">[ OK ]</font> FooTest.DoesAbc
<font color="green">[ RUN &nbsp; &nbsp; &nbsp;]</font><font color="black"> <font color="green">[----------]</font> 2 tests from BarTest
FooTest.DoesAbc</font><br/> <font color="green">[ RUN ]</font> BarTest.HasXyzProperty
<font color="green">[ &nbsp; &nbsp; &nbsp; OK ]</font><font color="black"> <font color="green">[ OK ]</font> BarTest.HasXyzProperty
FooTest.DoesAbc </font><br/> <font color="green">[ RUN ]</font> BarTest.ReturnsTrueOnSuccess
<font color="green">[----------]</font><font color="black"> ... some error messages ...
2 tests from BarTest</font><br/> <font color="red">[ FAILED ]</font> BarTest.ReturnsTrueOnSuccess
<font color="green">[ RUN &nbsp; &nbsp; &nbsp;]</font><font color="black"> ...
BarTest.HasXyzProperty </font><br/> <font color="green">[==========]</font> 30 tests from 14 test suites ran.
<font color="green">[ &nbsp; &nbsp; &nbsp; OK ]</font><font color="black"> <font color="green">[ PASSED ]</font> 28 tests.
BarTest.HasXyzProperty</font><br/> <font color="red">[ FAILED ]</font> 2 tests, listed below:
<font color="green">[ RUN &nbsp; &nbsp; &nbsp;]</font><font color="black"> <font color="red">[ FAILED ]</font> BarTest.ReturnsTrueOnSuccess
BarTest.ReturnsTrueOnSuccess ... some error messages ...</font><br/> <font color="red">[ FAILED ]</font> AnotherTest.DoesXyz
<font color="red">[ &nbsp; FAILED ]</font><font color="black">
BarTest.ReturnsTrueOnSuccess ...</font><br/> 2 FAILED TESTS
<font color="green">[==========]</font><font color="black"> </pre>
30 tests from 14 test suites ran.</font><br/>
<font color="green">[ &nbsp; PASSED ]</font><font color="black">
28 tests.</font><br/>
<font color="red">[ &nbsp; FAILED ]</font><font color="black">
2 tests, listed below:</font><br/>
<font color="red">[ &nbsp; FAILED ]</font><font color="black">
BarTest.ReturnsTrueOnSuccess</font><br/>
<font color="red">[ &nbsp; FAILED ]</font><font color="black">
AnotherTest.DoesXyz<br/>
<br/>
2 FAILED TESTS
</font>
</code>
You can set the `GTEST_COLOR` environment variable or the `--gtest_color` You can set the `GTEST_COLOR` environment variable or the `--gtest_color`
command line flag to `yes`, `no`, or `auto` (the default) to enable colors, command line flag to `yes`, `no`, or `auto` (the default) to enable colors,
...@@ -2240,6 +1944,12 @@ disable colors, or let googletest decide. When the value is `auto`, googletest ...@@ -2240,6 +1944,12 @@ disable colors, or let googletest decide. When the value is `auto`, googletest
will use colors if and only if the output goes to a terminal and (on non-Windows will use colors if and only if the output goes to a terminal and (on non-Windows
platforms) the `TERM` environment variable is set to `xterm` or `xterm-color`. platforms) the `TERM` environment variable is set to `xterm` or `xterm-color`.
#### Suppressing test passes
By default, googletest prints 1 line of output for each test, indicating if it
passed or failed. To show only test failures, run the test program with
`--gtest_brief=1`, or set the GTEST_BRIEF environment variable to `1`.
#### Suppressing the Elapsed Time #### Suppressing the Elapsed Time
By default, googletest prints the time it takes to run each test. To disable By default, googletest prints the time it takes to run each test. To disable
...@@ -2261,8 +1971,7 @@ environment variable to `0`. ...@@ -2261,8 +1971,7 @@ environment variable to `0`.
googletest can emit a detailed XML report to a file in addition to its normal googletest can emit a detailed XML report to a file in addition to its normal
textual output. The report contains the duration of each test, and thus can help textual output. The report contains the duration of each test, and thus can help
you identify slow tests. The report is also used by the http://unittest you identify slow tests.
dashboard to show per-test-method error messages.
To generate the XML report, set the `GTEST_OUTPUT` environment variable or the To generate the XML report, set the `GTEST_OUTPUT` environment variable or the
`--gtest_output` flag to the string `"xml:path_to_output_file"`, which will `--gtest_output` flag to the string `"xml:path_to_output_file"`, which will
...@@ -2537,10 +2246,23 @@ could generate this report: ...@@ -2537,10 +2246,23 @@ could generate this report:
} }
``` ```
{: .callout .important}
IMPORTANT: The exact format of the JSON document is subject to change. IMPORTANT: The exact format of the JSON document is subject to change.
### Controlling How Failures Are Reported ### Controlling How Failures Are Reported
#### Detecting Test Premature Exit
Google Test implements the _premature-exit-file_ protocol for test runners
to catch any kind of unexpected exits of test programs. Upon start,
Google Test creates the file which will be automatically deleted after
all work has been finished. Then, the test runner can check if this file
exists. In case the file remains undeleted, the inspected test has exited
prematurely.
This feature is enabled only if the `TEST_PREMATURE_EXIT_FILE` environment
variable has been set.
#### Turning Assertion Failures into Break-Points #### Turning Assertion Failures into Break-Points
When running test programs under a debugger, it's very convenient if the When running test programs under a debugger, it's very convenient if the
...@@ -2565,3 +2287,32 @@ to be handled by the debugger, such that you can examine the call stack when an ...@@ -2565,3 +2287,32 @@ to be handled by the debugger, such that you can examine the call stack when an
exception is thrown. To achieve that, set the `GTEST_CATCH_EXCEPTIONS` exception is thrown. To achieve that, set the `GTEST_CATCH_EXCEPTIONS`
environment variable to `0`, or use the `--gtest_catch_exceptions=0` flag when environment variable to `0`, or use the `--gtest_catch_exceptions=0` flag when
running the tests. running the tests.
### Sanitizer Integration
The
[Undefined Behavior Sanitizer](https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html),
[Address Sanitizer](https://github.com/google/sanitizers/wiki/AddressSanitizer),
and
[Thread Sanitizer](https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual)
all provide weak functions that you can override to trigger explicit failures
when they detect sanitizer errors, such as creating a reference from `nullptr`.
To override these functions, place definitions for them in a source file that
you compile as part of your main binary:
```
extern "C" {
void __ubsan_on_report() {
FAIL() << "Encountered an undefined behavior sanitizer error";
}
void __asan_on_error() {
FAIL() << "Encountered an address sanitizer error";
}
void __tsan_on_report() {
FAIL() << "Encountered a thread sanitizer error";
}
} // extern "C"
```
After compiling your project with one of the sanitizers enabled, if a particular
test triggers a sanitizer error, googletest will report that it failed.
---
---
@import "jekyll-theme-primer";
@import "main";
# Community-Created Documentation
The following is a list, in no particular order, of links to documentation
created by the Googletest community.
* [Googlemock Insights](https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/googletest/insights.md),
by [ElectricRCAircraftGuy](https://github.com/ElectricRCAircraftGuy)
# Googletest FAQ # Googletest FAQ
<!-- GOOGLETEST_CM0014 DO NOT DELETE -->
## Why should test suite names and test names not contain underscore? ## Why should test suite names and test names not contain underscore?
{: .callout .note}
Note: Googletest reserves underscore (`_`) for special purpose keywords, such as
[the `DISABLED_` prefix](advanced.md#temporarily-disabling-tests), in addition
to the following rationale.
Underscore (`_`) is special, as C++ reserves the following to be used by the Underscore (`_`) is special, as C++ reserves the following to be used by the
compiler and the standard library: compiler and the standard library:
...@@ -57,9 +60,10 @@ the rule. ...@@ -57,9 +60,10 @@ the rule.
## Why does googletest support `EXPECT_EQ(NULL, ptr)` and `ASSERT_EQ(NULL, ptr)` but not `EXPECT_NE(NULL, ptr)` and `ASSERT_NE(NULL, ptr)`? ## Why does googletest support `EXPECT_EQ(NULL, ptr)` and `ASSERT_EQ(NULL, ptr)` but not `EXPECT_NE(NULL, ptr)` and `ASSERT_NE(NULL, ptr)`?
First of all you can use `EXPECT_NE(nullptr, ptr)` and `ASSERT_NE(nullptr, First of all, you can use `nullptr` with each of these macros, e.g.
ptr)`. This is the preferred syntax in the style guide because nullptr does not `EXPECT_EQ(ptr, nullptr)`, `EXPECT_NE(ptr, nullptr)`, `ASSERT_EQ(ptr, nullptr)`,
have the type problems that NULL does. Which is why NULL does not work. `ASSERT_NE(ptr, nullptr)`. This is the preferred syntax in the style guide
because `nullptr` does not have the type problems that `NULL` does.
Due to some peculiarity of C++, it requires some non-trivial template meta Due to some peculiarity of C++, it requires some non-trivial template meta
programming tricks to support using `NULL` as an argument of the `EXPECT_XX()` programming tricks to support using `NULL` as an argument of the `EXPECT_XX()`
...@@ -67,22 +71,21 @@ and `ASSERT_XX()` macros. Therefore we only do it where it's most needed ...@@ -67,22 +71,21 @@ and `ASSERT_XX()` macros. Therefore we only do it where it's most needed
(otherwise we make the implementation of googletest harder to maintain and more (otherwise we make the implementation of googletest harder to maintain and more
error-prone than necessary). error-prone than necessary).
The `EXPECT_EQ()` macro takes the *expected* value as its first argument and the Historically, the `EXPECT_EQ()` macro took the *expected* value as its first
*actual* value as the second. It's reasonable that someone wants to write argument and the *actual* value as the second, though this argument order is now
`EXPECT_EQ(NULL, some_expression)`, and this indeed was requested several times. discouraged. It was reasonable that someone wanted
Therefore we implemented it. to write `EXPECT_EQ(NULL, some_expression)`, and this indeed was requested
several times. Therefore we implemented it.
The need for `EXPECT_NE(NULL, ptr)` isn't nearly as strong. When the assertion The need for `EXPECT_NE(NULL, ptr)` wasn't nearly as strong. When the assertion
fails, you already know that `ptr` must be `NULL`, so it doesn't add any fails, you already know that `ptr` must be `NULL`, so it doesn't add any
information to print `ptr` in this case. That means `EXPECT_TRUE(ptr != NULL)` information to print `ptr` in this case. That means `EXPECT_TRUE(ptr != NULL)`
works just as well. works just as well.
If we were to support `EXPECT_NE(NULL, ptr)`, for consistency we'll have to If we were to support `EXPECT_NE(NULL, ptr)`, for consistency we'd have to
support `EXPECT_NE(ptr, NULL)` as well, as unlike `EXPECT_EQ`, we don't have a support `EXPECT_NE(ptr, NULL)` as well. This means using the template meta
convention on the order of the two arguments for `EXPECT_NE`. This means using programming tricks twice in the implementation, making it even harder to
the template meta programming tricks twice in the implementation, making it even understand and maintain. We believe the benefit doesn't justify the cost.
harder to understand and maintain. We believe the benefit doesn't justify the
cost.
Finally, with the growth of the gMock matcher library, we are encouraging people Finally, with the growth of the gMock matcher library, we are encouraging people
to use the unified `EXPECT_THAT(value, matcher)` syntax more often in tests. One to use the unified `EXPECT_THAT(value, matcher)` syntax more often in tests. One
...@@ -127,6 +130,7 @@ can much more easily decide which one to use the next time. ...@@ -127,6 +130,7 @@ can much more easily decide which one to use the next time.
## I got some run-time errors about invalid proto descriptors when using `ProtocolMessageEquals`. Help! ## I got some run-time errors about invalid proto descriptors when using `ProtocolMessageEquals`. Help!
{: .callout .note}
**Note:** `ProtocolMessageEquals` and `ProtocolMessageEquiv` are *deprecated* **Note:** `ProtocolMessageEquals` and `ProtocolMessageEquiv` are *deprecated*
now. Please use `EqualsProto`, etc instead. now. Please use `EqualsProto`, etc instead.
...@@ -176,18 +180,6 @@ template argument, and thus doesn't compile in opt mode when `a` contains a call ...@@ -176,18 +180,6 @@ template argument, and thus doesn't compile in opt mode when `a` contains a call
to `htonl()`. It is difficult to make `EXPECT_EQ` bypass the `htonl()` bug, as to `htonl()`. It is difficult to make `EXPECT_EQ` bypass the `htonl()` bug, as
the solution must work with different compilers on various platforms. the solution must work with different compilers on various platforms.
`htonl()` has some other problems as described in `//util/endian/endian.h`,
which defines `ghtonl()` to replace it. `ghtonl()` does the same thing `htonl()`
does, only without its problems. We suggest you to use `ghtonl()` instead of
`htonl()`, both in your tests and production code.
`//util/endian/endian.h` also defines `ghtons()`, which solves similar problems
in `htons()`.
Don't forget to add `//util/endian` to the list of dependencies in the `BUILD`
file wherever `ghtonl()` and `ghtons()` are used. The library consists of a
single header file and will not bloat your binary.
## The compiler complains about "undefined references" to some static const member variables, but I did define them in the class body. What's wrong? ## The compiler complains about "undefined references" to some static const member variables, but I did define them in the class body. What's wrong?
If your class has a static data member: If your class has a static data member:
...@@ -211,6 +203,18 @@ particular, using it in googletest comparison assertions (`EXPECT_EQ`, etc) will ...@@ -211,6 +203,18 @@ particular, using it in googletest comparison assertions (`EXPECT_EQ`, etc) will
generate an "undefined reference" linker error. The fact that "it used to work" generate an "undefined reference" linker error. The fact that "it used to work"
doesn't mean it's valid. It just means that you were lucky. :-) doesn't mean it's valid. It just means that you were lucky. :-)
If the declaration of the static data member is `constexpr` then it is
implicitly an `inline` definition, and a separate definition in `foo.cc` is not
needed:
```c++
// foo.h
class Foo {
...
static constexpr int kBar = 100; // Defines kBar, no need to do it in foo.cc.
};
```
## Can I derive a test fixture from another? ## Can I derive a test fixture from another?
Yes. Yes.
...@@ -263,7 +267,7 @@ If necessary, you can continue to derive test fixtures from a derived fixture. ...@@ -263,7 +267,7 @@ If necessary, you can continue to derive test fixtures from a derived fixture.
googletest has no limit on how deep the hierarchy can be. googletest has no limit on how deep the hierarchy can be.
For a complete example using derived test fixtures, see For a complete example using derived test fixtures, see
[sample5_unittest.cc](../samples/sample5_unittest.cc). [sample5_unittest.cc](https://github.com/google/googletest/blob/master/googletest/samples/sample5_unittest.cc).
## My compiler complains "void value not ignored as it ought to be." What does this mean? ## My compiler complains "void value not ignored as it ought to be." What does this mean?
...@@ -275,8 +279,9 @@ disabled by our build system. Please see more details ...@@ -275,8 +279,9 @@ disabled by our build system. Please see more details
## My death test hangs (or seg-faults). How do I fix it? ## My death test hangs (or seg-faults). How do I fix it?
In googletest, death tests are run in a child process and the way they work is In googletest, death tests are run in a child process and the way they work is
delicate. To write death tests you really need to understand how they work. delicate. To write death tests you really need to understand how they work—see
Please make sure you have read [this](advanced.md#how-it-works). the details at [Death Assertions](reference/assertions.md#death) in the
Assertions Reference.
In particular, death tests don't like having multiple threads in the parent In particular, death tests don't like having multiple threads in the parent
process. So the first thing you can try is to eliminate creating threads outside process. So the first thing you can try is to eliminate creating threads outside
...@@ -295,7 +300,7 @@ program from the beginning in the child process. Therefore make sure your ...@@ -295,7 +300,7 @@ program from the beginning in the child process. Therefore make sure your
program can run side-by-side with itself and is deterministic. program can run side-by-side with itself and is deterministic.
In the end, this boils down to good concurrent programming. You have to make In the end, this boils down to good concurrent programming. You have to make
sure that there is no race conditions or dead locks in your program. No silver sure that there are no race conditions or deadlocks in your program. No silver
bullet - sorry! bullet - sorry!
## Should I use the constructor/destructor of the test fixture or SetUp()/TearDown()? {#CtorVsSetUp} ## Should I use the constructor/destructor of the test fixture or SetUp()/TearDown()? {#CtorVsSetUp}
...@@ -332,8 +337,8 @@ You may still want to use `SetUp()/TearDown()` in the following cases: ...@@ -332,8 +337,8 @@ You may still want to use `SetUp()/TearDown()` in the following cases:
* In the body of a constructor (or destructor), it's not possible to use the * In the body of a constructor (or destructor), it's not possible to use the
`ASSERT_xx` macros. Therefore, if the set-up operation could cause a fatal `ASSERT_xx` macros. Therefore, if the set-up operation could cause a fatal
test failure that should prevent the test from running, it's necessary to test failure that should prevent the test from running, it's necessary to
use `abort` <!-- GOOGLETEST_CM0015 DO NOT DELETE --> and abort the whole test executable, use `abort` and abort the whole test
or to use `SetUp()` instead of a constructor. executable, or to use `SetUp()` instead of a constructor.
* If the tear-down operation could throw an exception, you must use * If the tear-down operation could throw an exception, you must use
`TearDown()` as opposed to the destructor, as throwing in a destructor leads `TearDown()` as opposed to the destructor, as throwing in a destructor leads
to undefined behavior and usually will kill your program right away. Note to undefined behavior and usually will kill your program right away. Note
...@@ -349,72 +354,8 @@ You may still want to use `SetUp()/TearDown()` in the following cases: ...@@ -349,72 +354,8 @@ You may still want to use `SetUp()/TearDown()` in the following cases:
## The compiler complains "no matching function to call" when I use ASSERT_PRED*. How do I fix it? ## The compiler complains "no matching function to call" when I use ASSERT_PRED*. How do I fix it?
If the predicate function you use in `ASSERT_PRED*` or `EXPECT_PRED*` is See details for [`EXPECT_PRED*`](reference/assertions.md#EXPECT_PRED) in the
overloaded or a template, the compiler will have trouble figuring out which Assertions Reference.
overloaded version it should use. `ASSERT_PRED_FORMAT*` and
`EXPECT_PRED_FORMAT*` don't have this problem.
If you see this error, you might want to switch to
`(ASSERT|EXPECT)_PRED_FORMAT*`, which will also give you a better failure
message. If, however, that is not an option, you can resolve the problem by
explicitly telling the compiler which version to pick.
For example, suppose you have
```c++
bool IsPositive(int n) {
return n > 0;
}
bool IsPositive(double x) {
return x > 0;
}
```
you will get a compiler error if you write
```c++
EXPECT_PRED1(IsPositive, 5);
```
However, this will work:
```c++
EXPECT_PRED1(static_cast<bool (*)(int)>(IsPositive), 5);
```
(The stuff inside the angled brackets for the `static_cast` operator is the type
of the function pointer for the `int`-version of `IsPositive()`.)
As another example, when you have a template function
```c++
template <typename T>
bool IsNegative(T x) {
return x < 0;
}
```
you can use it in a predicate assertion like this:
```c++
ASSERT_PRED1(IsNegative<int>, -5);
```
Things are more interesting if your template has more than one parameters. The
following won't compile:
```c++
ASSERT_PRED2(GreaterThan<int, int>, 5, 0);
```
as the C++ pre-processor thinks you are giving `ASSERT_PRED2` 4 arguments, which
is one more than expected. The workaround is to wrap the predicate function in
parentheses:
```c++
ASSERT_PRED2((GreaterThan<int, int>), 5, 0);
```
## My compiler complains about "ignoring return value" when I call RUN_ALL_TESTS(). Why? ## My compiler complains about "ignoring return value" when I call RUN_ALL_TESTS(). Why?
...@@ -531,8 +472,8 @@ There are several good reasons: ...@@ -531,8 +472,8 @@ There are several good reasons:
## What can the statement argument in ASSERT_DEATH() be? ## What can the statement argument in ASSERT_DEATH() be?
`ASSERT_DEATH(*statement*, *regex*)` (or any death assertion macro) can be used `ASSERT_DEATH(statement, matcher)` (or any death assertion macro) can be used
wherever `*statement*` is valid. So basically `*statement*` can be any C++ wherever *`statement`* is valid. So basically *`statement`* can be any C++
statement that makes sense in the current context. In particular, it can statement that makes sense in the current context. In particular, it can
reference global and/or local variables, and can be: reference global and/or local variables, and can be:
...@@ -555,7 +496,7 @@ TEST(MyDeathTest, ComplexExpression) { ...@@ -555,7 +496,7 @@ TEST(MyDeathTest, ComplexExpression) {
"(Func1|Method) failed"); "(Func1|Method) failed");
} }
// Death assertions can be used any where in a function. In // Death assertions can be used anywhere in a function. In
// particular, they can be inside a loop. // particular, they can be inside a loop.
TEST(MyDeathTest, InsideLoop) { TEST(MyDeathTest, InsideLoop) {
// Verifies that Foo(0), Foo(1), ..., and Foo(4) all die. // Verifies that Foo(0), Foo(1), ..., and Foo(4) all die.
...@@ -578,8 +519,6 @@ TEST(MyDeathTest, CompoundStatement) { ...@@ -578,8 +519,6 @@ TEST(MyDeathTest, CompoundStatement) {
} }
``` ```
gtest-death-test_test.cc contains more examples if you are interested.
## I have a fixture class `FooTest`, but `TEST_F(FooTest, Bar)` gives me error ``"no matching function for call to `FooTest::FooTest()'"``. Why? ## I have a fixture class `FooTest`, but `TEST_F(FooTest, Bar)` gives me error ``"no matching function for call to `FooTest::FooTest()'"``. Why?
Googletest needs to be able to create objects of your test fixture class, so it Googletest needs to be able to create objects of your test fixture class, so it
...@@ -597,7 +536,7 @@ However, there are cases where you have to define your own: ...@@ -597,7 +536,7 @@ However, there are cases where you have to define your own:
## Why does ASSERT_DEATH complain about previous threads that were already joined? ## Why does ASSERT_DEATH complain about previous threads that were already joined?
With the Linux pthread library, there is no turning back once you cross the line With the Linux pthread library, there is no turning back once you cross the line
from single thread to multiple threads. The first time you create a thread, a from a single thread to multiple threads. The first time you create a thread, a
manager thread is created in addition, so you get 3, not 2, threads. Later when manager thread is created in addition, so you get 3, not 2, threads. Later when
the thread you create joins the main thread, the thread count decrements by 1, the thread you create joins the main thread, the thread count decrements by 1,
but the manager thread will never be killed, so you still have 2 threads, which but the manager thread will never be killed, so you still have 2 threads, which
...@@ -612,7 +551,7 @@ runs on, you shouldn't depend on this. ...@@ -612,7 +551,7 @@ runs on, you shouldn't depend on this.
googletest does not interleave tests from different test suites. That is, it googletest does not interleave tests from different test suites. That is, it
runs all tests in one test suite first, and then runs all tests in the next test runs all tests in one test suite first, and then runs all tests in the next test
suite, and so on. googletest does this because it needs to set up a test suite suite, and so on. googletest does this because it needs to set up a test suite
before the first test in it is run, and tear it down afterwords. Splitting up before the first test in it is run, and tear it down afterwards. Splitting up
the test case would require multiple set-up and tear-down processes, which is the test case would require multiple set-up and tear-down processes, which is
inefficient and makes the semantics unclean. inefficient and makes the semantics unclean.
...@@ -661,14 +600,15 @@ break the death test (e.g. by changing the regex pattern it is expected to ...@@ -661,14 +600,15 @@ break the death test (e.g. by changing the regex pattern it is expected to
match). Admittedly, this is a hack. We'll consider a more permanent solution match). Admittedly, this is a hack. We'll consider a more permanent solution
after the fork-and-exec-style death tests are implemented. after the fork-and-exec-style death tests are implemented.
## The compiler complains about "no match for 'operator<<'" when I use an assertion. What gives? ## The compiler complains about `no match for 'operator<<'` when I use an assertion. What gives?
If you use a user-defined type `FooType` in an assertion, you must make sure If you use a user-defined type `FooType` in an assertion, you must make sure
there is an `std::ostream& operator<<(std::ostream&, const FooType&)` function there is an `std::ostream& operator<<(std::ostream&, const FooType&)` function
defined such that we can print a value of `FooType`. defined such that we can print a value of `FooType`.
In addition, if `FooType` is declared in a name space, the `<<` operator also In addition, if `FooType` is declared in a name space, the `<<` operator also
needs to be defined in the *same* name space. See https://abseil.io/tips/49 for details. needs to be defined in the *same* name space. See
[Tip of the Week #49](http://abseil.io/tips/49) for details.
## How do I suppress the memory leak messages on Windows? ## How do I suppress the memory leak messages on Windows?
...@@ -689,10 +629,10 @@ mistake in production. Such cleverness also leads to ...@@ -689,10 +629,10 @@ mistake in production. Such cleverness also leads to
advise against the practice, and googletest doesn't provide a way to do it. advise against the practice, and googletest doesn't provide a way to do it.
In general, the recommended way to cause the code to behave differently under In general, the recommended way to cause the code to behave differently under
test is [Dependency Injection](https://en.wikipedia.org/wiki/Dependency_injection). You can inject test is [Dependency Injection](http://en.wikipedia.org/wiki/Dependency_injection). You can inject
different functionality from the test and from the production code. Since your different functionality from the test and from the production code. Since your
production code doesn't link in the for-test logic at all (the production code doesn't link in the for-test logic at all (the
[`testonly`](https://docs.bazel.build/versions/master/be/common-definitions.html#common.testonly) attribute for BUILD targets helps to ensure [`testonly`](http://docs.bazel.build/versions/master/be/common-definitions.html#common.testonly) attribute for BUILD targets helps to ensure
that), there is no danger in accidentally running it. that), there is no danger in accidentally running it.
However, if you *really*, *really*, *really* have no choice, and if you follow However, if you *really*, *really*, *really* have no choice, and if you follow
...@@ -703,12 +643,12 @@ whether the code is under test. ...@@ -703,12 +643,12 @@ whether the code is under test.
## How do I temporarily disable a test? ## How do I temporarily disable a test?
If you have a broken test that you cannot fix right away, you can add the If you have a broken test that you cannot fix right away, you can add the
DISABLED_ prefix to its name. This will exclude it from execution. This is `DISABLED_` prefix to its name. This will exclude it from execution. This is
better than commenting out the code or using #if 0, as disabled tests are still better than commenting out the code or using `#if 0`, as disabled tests are
compiled (and thus won't rot). still compiled (and thus won't rot).
To include disabled tests in test execution, just invoke the test program with To include disabled tests in test execution, just invoke the test program with
the --gtest_also_run_disabled_tests flag. the `--gtest_also_run_disabled_tests` flag.
## Is it OK if I have two separate `TEST(Foo, Bar)` test methods defined in different namespaces? ## Is it OK if I have two separate `TEST(Foo, Bar)` test methods defined in different namespaces?
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment