テスト駆動開発を勉強するため、M1 Mac miniでGoogle Testの環境を構築してみました。テストコードのビルドのやり方がわかりづらかったので、記事にしてみます。
環境
- M1 Mac mini
ツールインストール
Homebrewを使って cmake, gcc, g++をインストールします。
brew install cmake
brew install gcc
brew install g++
2023.03.29の時点では g++-12、gcc-12 がインストールされました。
ライブラリのビルド
Google Testのライブラリをビルドします。
git clone https://github.com/google/googletest.git
cd googletest
mkdir build
cd build
cmake -DCMAKE_C_COMPILER=/opt/homebrew/bin/gcc-12 -DCMAKE_CXX_COMPILER=/opt/homebrew/bin/g++-12 ..
make
先程インストールしたgcc-12、g++-12をcmakeのオプションで指定します。指定しないとMacにデフォルトで入っているgcc/g++が使われてしまうため、makeで正しくビルドできません。
ツールインストールが正しく実行されていれば、gcc/g++ は /opt/homebrew/bin にインストールされているはずです。
サンプルコードのビルド・実行
Google Testリポジトリに入っているサンプルコードを実行します。Google Testのリポジトリの中の googletest/samples にサンプルコードが入っています。
cd ../googletest/samples
g++-12 -I../../googletest/include/ -L../../build/lib/ sample4.cc sample4_unittest.cc -lgtest -lgtest_main
./a.out
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from Counter
[ RUN ] Counter.Increment
[ OK ] Counter.Increment (0 ms)
[----------] 1 test from Counter (0 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[ PASSED ] 1 test.
コンパイルは g++-12 を使い、ビルドオプションの-Lでビルドしたライブラリを指定、-Iでインクルードするファイルを指定します。
a.outを実行して「PASSED」が出力されたら成功です。あとは適宜 sample4.cc か sample4_unitttest.cc の中身を修正してテスト駆動開発をお楽しみください。
参考:Makefile
以下のようなMakefileを作るとビルドが楽になります。Makefileのフォルダに必要なファイル(*.cc, *.h)を入れて、makeと打つだけでビルドできます。
TARGET = run_sample
SRCDIR = .
SRCS = $(shell find $(SRCDIR) -name "*.cc" -type f | xargs)
OBJS = $(SRCS:.cc=.o)
CFLAGO = -lgtest -lgtest_main
CFLAGC = -Wall -MMD -MP -O3
DEPENDS = $(OBJS:.o=.d)
INC = -I/opt/homebrew/include/
LIB = -L/opt/homebrew/lib/
CC = g++-12
.PHONY: all
all: $(TARGET)
-include $(DEPENDS)
# ターゲットファイル生成 $@:TARGET名 $^:全部のOBJS
$(TARGET): $(OBJS)
$(CC) -o $@ $^ $(LIB) $(CFLAGO)
# オブジェクトファイル生成 $^:全部のSRCS
$(OBJS): $(SRCS)
$(CC) -c $^ $(INC) $(CFLAGC)
# (12).oファイル、実行ファイル、.dファイルを削除
.PHONY: clean
clean:
-rm -f $(TARGET) $(OBJS) $(DEPENDS)