Visual StudioでGoogleTestを使ったCMakeプロジェクトがうまく動かなくなったので対処法を探してみた
みなさんこんにちは。イプシロンソフトウェアで代表をしております渡部です。弊社ではプロジェクトによっていろいろプログラミング言語も変えています。C++を使った開発のプロジェクトにおいて、単体テストのフレームワークとしてはGoogleTestを使っておりますが、ちょっと最近トラブったのでその際に調べたことをまとめたいと思います。
あ、本編の前にいつもの宣伝ですが弊社では一緒に働いてくれる仲間を募集しておりまして、もしご興味がありましたらお話だけでも聞きにきていただけると嬉しいです。代表である私自身も元々ソフトウェアエンジニアとしてやってましたので、実際にものづくりができるクリエイター第一主義に掲げた会社運営を心がけています。
プロジェクトの概要
あんまり細かいことは書けないのですが、前提条件としてこんな感じのプロジェクトの話です。
- 開発言語はC++
- CMakeを使ったマルチプラットフォーム開発
- Windowsの開発においてはIDEとしてVisual Studio Professional 2022
- 単体テストにはGoogleTest
CMakeはマルチプラットフォームの開発によく使われるソフトで、CMakeLists.txtファイルを元にそれぞれのプラットフォームでビルドするためのプロジェクトファイルを出力してくれるというものです。例えばWindows向けにビルドするためのVisual Studio向けのプロジェクトファイルを出力したり、macOS向けにビルドするためのXcodeプロジェクトを出力したり、Linux向けにビルドするためのMakefileを出力したり…などなどの機能があります。
Visual Studioは有名な統合開発環境(IDE)ですね。最近ではCMakeのプロジェクトを直接開くことができるようになりました。これがまぁ本当に便利でございましてめちゃめちゃ重宝しています。Intelli Sense (Visual Studioのコード補完)もしっかり機能してくれますしね。
GoogleTestはC++の単体テストフレームワークです。C++のテストフレームワークの中ではだいぶ有名な部類だと思います。Visual Studio 2017以降はGoogleTestで作られたプロジェクトを、Test Adapter for Google Testを使ってIDEのテストエクスプローラに統合することができるようになっています。これもめちゃめちゃ便利でございまして、実行したいテストだけをテストエクスプローラから選んで実行したりデバッグしたりが簡単に行えるようになっています。
まとめると、Visual Studioを使ってCMakeのC++プロジェクトを直接開く → ビルドする → テストエクスプローラから実行したいテストだけ選んで実行、のような流れで開発を進めておりました。だいぶやりやすいですね。
問題発生
さてさて前提条件の説明が終わったところで本題です。つい先日、先述のワークフローが残念ながら崩壊してしまいました。きっかけはVisual Studio 2022を17.5.x系に更新したことによるものです。いつもののようにビルドした結果をテスト実行しようとしたら、なぜか全然テストが実行されません。あれなんでだろうこれ、おかしいなー、と思っていたらテストのログに以下のようなログが。
Test Adapter for Google Testの中でクラッシュしているようなログが出ていますね。Visual Studioが17.4.x系のときではこんなこと無かったのになー、と思いながらいったんTest Adapter for Google Testだけを再インストール。でも結果は変わりませんでした。
調べてみたらTest Adapter for Google TestはGitHubにコードがあったので少し眺めていたのですが、自分が使っているバージョンのコードがちょっと分からない…(2023年3月現在)。打たれているgitのタグと手元のバージョン番号が一致しないんですよね。
いろいろ試す
ビルドした結果の実行ファイル(*.exe)を直接実行すれば正常にテストを実行することができることは分かりました。しかしながらやはりGUIは偉大というかVisual Studioのテストエクスプローラがめちゃめちゃ便利だったので、一度使い出したら手放せない…ということでなんとかテストエクスプローラから実行できないかどうかを試行錯誤することに。もう一回再インストールしてみたりとかGoogleTestのバージョンを上げたりとかいろいろ試してみますがどれもうまくいかず。
ふと、「Visual StudioのCMakeプロジェクトを直接開く機能を使わなければうまく動いてくれたりするんじゃないかな…?」と思い立ちまして、CMakeのプロジェクトを直接開かず、CMakeで一度Visual Studioのプロジェクトファイルを出力させたあとにソリューションファイル(*.sln)をダブルクリックで開いてからビルド、実行…
普通に動いた。
なんかもうあっさりするぐらい普通に動いてなんかもう拍子抜けって感じです。っていうかここまで読んでくれた皆さんも「は?そんなオチかよ。」みたいに思われてますよね、きっと。ごめんなさい。とりあえずまとめますと、以下のパターンでうまく動いてくれないことが分かったので、これからGoogleTestを使ってテスト駆動開発と思っている人はちょっと注意して環境構築するといいかと思います。
- Visual Studio 2022 17.15.x系を使っている
- CMakeのプロジェクトを直接開いている
- Test Adapter for Google Testを使っている
- テストエクスプローラ経由で実行している
逆に言えばこれらの条件のどれかに当てはまらない場合は今回の問題が発生しないと思います。多分。お役に立つようであれば幸いです。ここまで書いてきて思ったけどマジでマニアックな内容でしたね。いったい誰の役に立つんだろう。
追記 (2023年6月20日)
こちらの内容ですがVisual Studio 2022 17.16.3にて対応されているようで、CMakeのプロジェクトをそのまま開いていてもGoogle Testの実行ができるようになっているようでした。
免責事項(お約束)
この記事の内容を実践したことによるいかなる不具合や障害についても株式会社イプシロンソフトウェアは一切の責任を負いません。ご覧になった人の環境やプロジェクトの内容によっては的外れな内容になっている可能性がありますので、実際に実践する前には自身の環境を確認し、公式のドキュメントを参照しながら実行するようにしてください。