⌨️
macOS で CppUTest を使えるようにする
概要
下記の環境で CppUTest をセットアップした時の備忘録:
- OS: macOS
- シェル: zsh
- パッケージマネージャ: Homebrew
- CPU アーキテクチャ: Intel x86_64
他の OS や CPU アーキテクチャにも対応できるように柔軟な説明を心がける.
この記事で扱わないこと
- CppUTest の具体的な用法
- VSCode 等の IDE との連携のさせ方
CppUTest の典型的な使われ方
まず,CppUTest は C/C++ のためのテストフレームワーク(in C++)である:
CppUTest は,静的ライブラリの形でテスト機能を提供する.したがって,
- ビルド時に適切に静的リンクしてあげる
- 自前のテストコードには CppUTest 側の API 関数を書いてあげる
が正規の使い方である.例えば gcc なら
-I${include_path}
-L${library_path}
-l${library_obj_1} ... -l${library_obj_n}
で
-
include_path
: https://github.com/cpputest/cpputest/tree/master/include 相当のディレクトリ -
library_path
: インストール先のlib
ディレクトリ(後述) -
library_obj_*
:lib
内のlibCppUTest.a
およびlibCppUTestExt.a
をそれぞれ指定してビルドする前提で,テストコード側では
にあるようなマクロを使える.
というわけで,まずビルドを確実に通すための環境設定について述べ,その後ちょっとした確認用のテストコードを紹介する.
環境設定
事前準備
何はともあれ,C++ コンパイラが必要になる.
ここでは macOS 想定なので,clang++ がまともに使えることを確認:
clang++ -v
# => Apple clang version 12.0.5 (clang-1205.0.22.9)
# => Target: x86_64-apple-darwin20.6.0
# => Thread model: posix
# => InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
GNU 仕様の g++
でも機能的に等価かと思いきや,CppUTest に依存するテストコード(後述)をビルドする際に clang++
でないと解決不能なリンクエラーに遭遇する.
インストールから環境変数の設定まで
-
brew で CppUTest をインストール:
brew install cpputest
-
インストール先を
brew --prefix
で確認:brew --prefix cpputest # => /usr/local/opt/cpputest
なお,表示されるディレクトリは筆者の環境ではシンボリックリンクであった:
ls -l $(brew --prefix cpputest) # => lrwxr-xr-x 1 kentarosugimoto admin 22 Mar 25 11:07 /usr/local/opt/cpputest -> ../Cellar/cpputest/4.0
プロジェクトファイルからいつでもここを見に行けるようにしたい.
-
環境変数
CPPUTEST_HOME
の自動設定コマンドを~/.zshrc
等に追記:自動設定コマンドexport CPPUTEST_HOME="$(brew --prefix cpputest)"
-
念の為,インストール先の中身を確認:
exec /bin/zsh -l # 環境変数の更新 tree -L 2 ${CPPUTEST_HOME}
実行結果. ├── AUTHORS ├── COPYING ├── ChangeLog ├── INSTALL_RECEIPT.json ├── NEWS ├── README ├── README.md ├── include │ ├── CppUTest │ └── CppUTestExt └── lib ├── CppUTest ├── libCppUTest.a ├── libCppUTestExt.a └── pkgconfig
例えば Makefile
を使う場合,
CPPFLAGS += -I$(CPPUTEST_HOME)/include
CXXFLAGS += -include $(CPPUTEST_HOME)/include/CppUTest/MemoryLeakDetectorNewMacros.h
CFLAGS += -include $(CPPUTEST_HOME)/include/CppUTest/MemoryLeakDetectorMallocMacros.h
LD_LIBRARIES = -L$(CPPUTEST_HOME)/lib -lCppUTest -lCppUTestExt
といった記述ができるようになる(参考).
動作確認
次のようなソースコードを用意する:
RunAllTests.cpp
#include <CppUTest/CommandLineTestRunner.h>
int main(int ac, char** av)
{
return CommandLineTestRunner::RunAllTests(ac, av);
}
ビルド・実行
ビルド
clang++ -o RunAllTests -I${CPPUTEST_HOME}/include -L${CPPUTEST_HOME}/lib -lCppUTest RunAllTests.cpp
実行
./RunAllTests
期待される実行結果
Errors (ran nothing, 0 tests, 0 ran, 0 checks, 0 ignored, 0 filtered out, 1 ms)
Note: test run failed because no tests were run or ignored. Assuming something went wrong. This often happens because of linking errors or typos in test filter.
その他
brew でインストールした場合,
にあるような便利スクリプトが使えなくなるので,セルフビルドを検討する必要がある.
関連記事
Discussion