Visual StudioとGooleTestの統合(vcpkgを使用)

C/C++

前回の記事でもVisual StudioとGoogleTestを統合して、C++の単体テストを実行しました。


今回はVisual Studioとvcpkgパッケージマネージャを使ったプロジェクト向けにgtestとgmockをvcpkg経由でインストール、プロジェクトの構築をやっていきます。

既にvcpkgは入っている前提のため、必要な場合は以下の記事を参照してください。

テストの準備

gtestとgmockのインストール

vcpkgでgtestの存在を確認

vcpkg search gtest

gtest 1.14.0が見つかりました。これをインストールします。

vcpkgの初期化

プロジェクトでvcpkgを初期化していなければ以下を実行してvcpkg.jsonを作成しておきます。

vcpkg new --application

インストール

下記のコマンドでgtestをインストールします。

vcpkg add port gtest
vcpkg install

vcpkg_installedフォルダができるので、「vcpkg_installed>x64-windows>lib」フォルダを確認して、gtest.libがあるのを確認します。

なぜgmock.libも入っている?

gmockはgtest側にプロジェクトが統合されたため、この手順で両方のライブラリがインストールできるようになりました。

テストプロジェクトの作成

次にテストプロジェクトをする手順です。

プロジェクトテンプレートの選択

vcpkgでgtestを入れる場合、プロジェクトテンプレートは「空のプロジェクト」を使います。

テストの作成

cppファイルを作成

test.cppというファイルを追加してテストコードを書いてみますが、もちろんエラーになります。

プロジェクトの設定を見直す

vcpkgマニフェストモードに変更

構成プロパティ>vcpkg>Use Ccpkg Manifest」を「はい」に変更します。

リンカーを設定

構成プロパティ>リンカー>入力>追加の依存ファイル」を開きます。

以下の4つのパスを追加します。

$(SolutionDir)vcpkg_installed\x64-windows\lib\gtest.lib;
$(SolutionDir)vcpkg_installed\x64-windows\lib\manual-link\gtest_main.lib;
$(SolutionDir)vcpkg_installed\x64-windows\lib\gmock.lib;
$(SolutionDir)vcpkg_installed\x64-windows\lib\manual-link\gmock_main.lib;

テストの動作確認

ビルドして確認

これでエラーが消えることが確認できます。

テストを実行

テストエクスプローラーを起動して、実行してみるとテストが通ることが確認できます。

gmockを使ってMockの機能を試す

Mockを使ったコードの準備

以下のようなテストコードを試してみます。 前回記事と同様のコードです。

#include <gtest/gtest.h>
#include <gmock/gmock.h>
using ::testing::Return;

namespace GoogleTestWithVcpkg
{
	// モック化するための抽象クラス
	class IMyClass
	{
		virtual int sub(int a, int b) = 0;
	};

	// モックの定義
	class MyClassMock : public IMyClass {
	public:
		MOCK_METHOD(int, sub, (int a, int b));
	};

	TEST(Method, TestCase) {
		MyClassMock myClass;

		// モックの挙動を決定
		EXPECT_CALL(myClass, sub, (1, 1))
			.WillOnce(Return(0));

		auto result = myClass.sub(1, 1);
		EXPECT_EQ(result, 0);
	}
}

こちらのコードですが、ビルドしてみると以下のようなエラーを出力します。
「2件の未解決の外部参照」

外部参照エラーを修正

構成プロパティ>C/C++>プリプロセッサ>プリプロセッサの定義」に「GTEST_LINKED_AS_SHARED_LIBRARY」を追加します。

Mockの動作確認

テストの実行

無事にエラーが消えて、テストが成功したことが確認できます。

おわり!

タイトルとURLをコピーしました