⌨️

macOS で CppUTest を使えるようにする

2022/03/25に公開

概要

下記の環境で CppUTest をセットアップした時の備忘録:

  • OS: macOS
    • シェル: zsh
    • パッケージマネージャ: Homebrew
  • CPU アーキテクチャ: Intel x86_64

他の OS や CPU アーキテクチャにも対応できるように柔軟な説明を心がける.

この記事で扱わないこと

  • CppUTest の具体的な用法
  • VSCode 等の IDE との連携のさせ方

CppUTest の典型的な使われ方

まず,CppUTest は C/C++ のためのテストフレームワーク(in C++)である:

https://cpputest.github.io/

CppUTest は,静的ライブラリの形でテスト機能を提供する.したがって,

  • ビルド時に適切に静的リンクしてあげる
  • 自前のテストコードには CppUTest 側の API 関数を書いてあげる

が正規の使い方である.例えば gcc なら

  • -I${include_path}
  • -L${library_path}
  • -l${library_obj_1} ... -l${library_obj_n}

をそれぞれ指定してビルドする前提で,テストコード側では

https://github.com/cpputest/cpputest/blob/master/include/CppUTest/UtestMacros.h

にあるようなマクロを使える.

というわけで,まずビルドを確実に通すための環境設定について述べ,その後ちょっとした確認用のテストコードを紹介する.

環境設定

事前準備

何はともあれ,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++ でないと解決不能なリンクエラーに遭遇する.

インストールから環境変数の設定まで

  1. brew で CppUTest をインストール:

    brew install cpputest
    
  2. インストール先を 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
    

    プロジェクトファイルからいつでもここを見に行けるようにしたい.

  3. 環境変数 CPPUTEST_HOME の自動設定コマンドを ~/.zshrc 等に追記:

    自動設定コマンド
    export CPPUTEST_HOME="$(brew --prefix cpputest)"
    
  4. 念の為,インストール先の中身を確認:

    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 でインストールした場合,

https://github.com/cpputest/cpputest/tree/master/scripts

にあるような便利スクリプトが使えなくなるので,セルフビルドを検討する必要がある.

関連記事

https://qiita.com/naoyoshinori/items/3d6c7a2cc0b050c02873

https://qiita.com/sarakane/items/6e3a775577e8a134bb51

Discussion