はじめに
この記事では、Google Test と Coverage ツールの Gcovr を、Docker で環境構築する方法を紹介します。

Google Test は、C++ の単体テストを行うためのライブラリで、
Gcovr はテストのカバレッジを計測するために使用されます。
この環境は、テスト自動化を進める上で非常に有効で、CI/CDへの統合も容易になります。
Docker を使うことで、テスト環境を統一することが可能となり、異なる環境での動作保証ができます。
ツールと環境
本記事の執筆にあたり、以下の環境で確認しております。
CPU | Intel 11th Core i5 11400 |
メモリ | 16 GiB |
OS | Ubuntu 24.04 LTS |
docker | v27.5.1 |
g++ | v13.3.0 |
cmake | v3.28.3 |
make | v4.3 |
libgtest-dev | v1.14.0-1 amd64 |
gcovr | v7.0 |
lcov | v2.0-1 |
参考
Docker のインストールは「最も簡単な Docker のインストール方法」を参照ください。
ポイント
今回は、HOST 側でコーディングやコンパイルを行っている想定で、
HOST 側の特定のボリュームをコンテナ内にマウントして利用することを目指します。
Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
FROM ubuntu:24.04 RUN apt-get update && apt-get install -y \ g++ \ cmake \ make \ git \ gcovr \ lcov \ libgtest-dev \ && rm -rf /var/lib/apt/lists/* # Google Test をビルド RUN cd /usr/src/googletest && \ cmake . && \ make && \ make install WORKDIR /work CMD ["/bin/bash"] |
- ベースイメージ
Ubuntu 24.04 LTS - パッケージのインストール
必要なパッケージ(g++, make, gtest, gcovrなど)をインストール - Google Test のビルド
aptでインストールした Google Test のコードをビルド - 作業ディレクトリの指定
HOST 側のボリュームをマウントしてテスト実行する準備
Docker Imageのビルド
Dockerfile のあるディレクトリ直下で、以下のコマンドを実行します。
-t の引数は、作成するイメージの名前とタグ名のため、お好みで変更可能です。
command
$ docker build -t gcc-cmake-gtest:24.04 .
コンテナの作成
Google Test で単体試験を実施したいプロジェクトやソースコードのある場所で、以下を実行します。
例では、HOST 側の $(pwd)/src を、コンテナ側の /work にマッピングしています。
また、コンテナを常時残しておく必要が無いため、
試験完了後(コンテナを Exit 後)は、コンテナを削除する設定にしています。
command
$ docker run --rm -it -v "$(pwd)/src:/work" gcc-cmake-gtest:24.04

実行サンプル
C++ サンプル
簡単な関数と、それをテストするためのコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <gtest/gtest.h> // テスト対象の関数 int add(int a, int b) { return a + b; } // テストケース TEST(AdditionTest, HandlesPositiveNumbers) { EXPECT_EQ(add(2, 3), 5); } TEST(AdditionTest, HandlesNegativeNumbers) { EXPECT_EQ(add(-2, -3), -5); } TEST(AdditionTest, HandlesMixedSignNumbers) { EXPECT_EQ(add(-2, 3), 1); } // Google Test のエントリーポイント int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } |
Makefile サンプル
main.cpp のビルドと、Google Test の実行、Gcovr でカバレッジを出力する Makefile です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
CXX = g++ CXXFLAGS = -std=c++17 -Wall -Wextra -g --coverage LDFLAGS = -lgtest -lgtest_main -pthread --coverage TARGET = target SRCS = main.cpp OBJS = $(SRCS:.cpp=.o) all: $(TARGET) $(TARGET): $(OBJS) $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS) $(LDFLAGS) %.o: %.cpp $(CXX) $(CXXFLAGS) -c $< -o $@ clean: rm -f $(TARGET) $(OBJS) *.gcda *.gcno *.gcov test: $(TARGET) ./$(TARGET) coverage: test gcovr -v -b --html-details repo/ -r . .PHONY: all clean test coverage |
実行方法
command
# Google Test のみ実行
$ make test
# Google Test の実行と、Gcovr の出力
$ make coverage
Gcovr 出力結果
実行結果
$ make coverage
g++ -std=c++17 -Wall -Wextra -g --coverage -c main.cpp -o main.o
g++ -std=c++17 -Wall -Wextra -g --coverage -o target main.o -lgtest -lgtest_main -pthread --coverage
./target
(snip)
[ PASSED ] 3 tests.
gcovr -v -b --html-details repo/ -r .
(INFO) Reading coverage data...
(INFO) Writing coverage report...
HTML の出力先である repo/ 内の coverage_details.html をブラウザなどで開きます。

repo/coverage_details.html
main.cpp をクリックすると、関数単位でテストされた行、テストされていない行が表示されます。
おわりに
本記事では、Google Test と Gcovr を使ったテスト環境を Docker コンテナで構築する方法を紹介しました。
カバレッジ測定も簡単に行えるため、コードの品質向上にも役立ちます。
本記事が、テスト環境の構築に悩む方の一助となれば幸いです。
参考
- GoogleTest User’s Guide(公式)
- GoogleTest の GitHub リポジトリ(公式)
- docker build ドキュメント(公式)
- gcovr documentation(公式)
- Qiita:Google Test の導入方法
- Qiita:gcovr のサンプル