最近やっている電卓いじりですが、どうせ気分転換をやるなら新しいことも試そう、と思いたってGoogleTestを勉強しました。
さて、GoogleTestに関するWEBページが多いのはよいのですが、困ったことに自分にとって使いやすい形のサンプルがありません。結局、一緒に使うCMakeを含めて仕様書を読み、自分用のテンプレートを作ってしまいました。
GitHubにtemplate_applicationおよびtemplate_libraryとして公開済みです。以下、template_applicationについて紹介します。
テンプレートの特徴
このテンプレートは次のような特徴を持っています。
- C++11コマンドライン・プログラムのアプリケーション・テンプレート
- CMakeによるコンフィギュレーション、ビルド及びテスト
- コンフィギュレーション中にCMakeが自動的にGoogleTestのソースコードをダウンロードし、ビルドする
- ソースコードはサブディレクトリに格納
- src : アプリケーションのソースコード
- test : テストのソースコード
- ソース・ファイル、テスト・ファイルを追加した場合、再度CMakeのコンフィギュレーションをかけるだけで自動的にビルド対象として認識する
- テストを追加すると、自動的にテスト対象として認識する
- std::thread対応
- マルチプラットホームで検証済み
- Ubuntu 20.04 (GCC)
- Windows 11 (Visual Studio C++ 2022 )
- WSL2 (GCC)
- コマンドラインでも、VS CODEのステータスバーからでもビルド&実行可能
- GitHub Actionsにより、GitHubへのプッシュ時とPull Requestの受付時に自動的にDebug/Releaseコンフィギュレーションでテストが行われる
- ビルドやテストをVisual Studio CODEのステータス・バーから容易に制御できる
アプリケーション・テンプレート、と大上段に振りかぶっていますが中身はC++のHello World程度でしかありません。目的はそちらではなく、小さなプログラムをささっとつくりたいときにCMakeやGoogleTestの設定が面倒だったので予め自分用に用意した、という経緯です。
サンプル・プログラムではstd::threadのテストもしています。C++11ではstd::threadが導入され、スレッド・プログラミングからOS依存性がなくなりました。一方で、当然ですがリンクするライブラリにはOS依存性や開発ツール依存性が残ります。せっかく作ったテンプレートが
「Linuxでしか動かない」
などという体たらくでは、利用者である私がイライラします。ですので、簡単なスレッド・プログラミングを行い、Linux(GCC)とWindows(MSVC)双方で問題なくビルド・実行できることを確認済みです。
このアプリケーションは最初からGoogleTestによるユニット・テストが可能です。srcディレクトリにあるmain.cpp以外のすべてのソース・ファイルはテスト対象とすることができます。また、.github以下の隠しディレクトリの設定により、GitHubリポジトリに格納する場合はGitHubアクションによる自動テストが行われます。テストが走るのは以下の場合です
- developブランチにpushした場合
- mainブランチにpushした場合
- プル・リクエストを受け取った場合
各プラットフォームへのインストール
Ubuntu 20.04へのインストール
これが一番簡単です。以下のコマンドをshellから実行します。
sudo snap install code --classic sudo apt-get install build-essential cmake
VS CODEにはC++ Extention Packをインストールしてください。この拡張機能パッケージはC++のための拡張機能のほかに、CMakeやDoxygen用の拡張機能をインストールします。
Windows 11へのインストール
Windowsは設定がやや面倒です。まず、以下のコマンドをコマンドライン・ウィンドウから実行します。Visual Studio 2022はC++コンパイラを使うためにインストールします。
winget install Microsoft.VisualStudioCode -e winget install Kitware.CMake -e winget install Microsoft.VisualStudio.2022.Community -e winget install Git.Git -e winget install Python.Python.3 -e
VS CODEにはC++ Extention Packをインストールしてください。この拡張機能パッケージはC++のための拡張機能のほかに、CMakeやDoxygen用の拡張機能をインストールします。
面倒なことに、上のインストール・スクリプトを実行してもCMakeのインストールは完了しません。上記コマンド実行後、CMakeをWindowsのメニューから実行してインストールを完了させてください。
また、Visual Studio 2022も上のインストールスクリプトだけではインストールが完了しません。上記コマンド実行後にVisual Studioを実行し、C++ワークロードをインストールしてください。
以上が終わったら、各ツールの実行ファイルが置かれているパスをPATH環境変数に登録してください。
WSL2へのインストール
WSL2で使用する場合の設定は、UbuntuとWindowsの中間程度の面倒くささです。まず、以下のコマンドをWindowsのコマンドライン・ウィンドウから実行します。
winget install Microsoft.VisualStudioCode -e
S CODEにはC++ Extention Packをインストールして下さい。この拡張機能パッケージはC++のための拡張機能のほかに、CMakeやDoxygen用の拡張機能をインストールします。また、この拡張機能パックにはWSLでの開発をWindowsのVS CODEで行うためのリモート開発拡張も含まれています。
次に以下のコマンドをWSLで動作しているUbuntuのshellから実行します。
sudo apt-get install build-essential cmake ca-certificates
上で説明した拡張機能により、WSLで動作するコマンド群はWSLの外のWindowsにインストールされているVS CODE配下で動作させることができます。詳しくはMicrosoftの解説を参照してください。
使い方
template_applicationを適当なディレクトリにgit cloneするかダウンロードしてください。
コマンドラインでの実行
README.mdが置いてあるトップ・ディレクトリから、以下のコマンドを実行します。
mkdir build cd build cmake .. cmake --build .
これでプロジェクトのコンフィギュレーション、Google Testの取得、ビルドが行われます。
開発中にビルドを行う場合には以下のコマンドを実行します。
cmake --build .
テストを行う場合には以下のコマンドを実行します。
ctest
VS CODEからの実行
README.mdがおいてあるトップ・ディレクトリから、以下のコマンドを実行します。
code .
これでVS CODEが起動しますので、CTRL+SHIFT+Pをタイプしてコマンド・パレットを開き、以下のコマンドを実行します。
CMake: Configure
これでプロジェクトのコンフィギュレーションが完了します。あとは、VS CODEのステータス・バーから、ビルド、実行、テストを行うことができます。
ソース・ファイルを追加したい場合
srcディレクトリに拡張子.cppでファイルを追加します。CMakeLists.txtの編集は必要ありません。追加後にcmakeのコンフィギュレーションをかけます。
テスト・ファイルを追加したい場合
testディレクトリに拡張子.cppでファイルを追加します。CMakeLists.txtの編集は必要ありません。追加後にcmakeのコンフィギュレーションをかけます。
カスタム化
プロジェクト・トップのCMakeLists.txtの以下の行を変更すると、プロジェクト名を変更できます。プロジェクト名は実行ファイル名として使用されます。
project("template_application")
まとめ
このテンプレート・アプリケーションを使うことでWindowsでもUbuntuでも、簡単にC++アプリケーションの開発を始めることができます。
このご時世に大規模開発をmain()で始まるようなアプリケーションとして開発することはないと思いますが、ちょっとしたプログラムを書きたいときに便利に使えるはずです。