11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Google Test】Visual StudioでC++のユニットテストを書いてみる

Posted at

はじめに

先日Visual Studio 2019 Loanch Eventに行ってきました。MicrosoftのMVPの方々がVSについていろいろ講演をしてくださり、VSや.NETについての知識が深まるとともに開発のモチベが結構上がってとてもよかったです。

そんな経緯があり、今回はVisual Studioについての記事を書いていきたいと思います。

Googleで「c++ テスト」とか検索してみると色々出てきますが、そのほとんどがmakeでプロジェクトをビルドしていました。自分はC++の開発でVSを使っているので、自分なりに方法を探ってみたところ割と簡単にできたので、備忘録的にその方法をまとめてみようと思います。

なお、今回の記事の環境は以下の通りです

  • Windows 10
  • Visual Studio 2019

プロジェクトを作る

それではプロジェクトを作っていきましょう。今回はC++コンソールアプリケーションで作成したライブラリをGoogleTestで単体テストしてみる想定でやっていきますよ。

コンソールアプリでは、main.cppというメインプログラムからLibrary.hというヘッダーファイルを参照しようと思います。まずはヘッダーファイルのコードから見てみましょう。

Library.h
#pragma once

int euclid(int n, int m) {
	if (n < m) {
		int tmp = n;
		n = m;
		m = tmp;
	}
	if (m == 0)
		return m;
	return euclid(m, n % m);
}

実際なんでも良いのですが、ユークリッドの互除法によって2整数の最大公約数を求める関数を作りました。この関数をメインプログラムから呼び出します。

main.cpp
#include <iostream>

#include "Library.h"

using namespace std;

int main()
{
	int n, m;

	cin >> n;
	cin >> m;

	cout << "result: " << euclid(n, m) << endl;
}

実行すると、こんな感じになります。

25
15
result: 0

あれ、なんか変ですね。
この互除法の関数をテストしてみましょう。

テストを導入する

ソリューションに新しいプロジェクトを追加します。
image.png

プロジェクトの種類はGoogle Testです。
テキトーな名前で作りましょう。

ソリューションの構成は以下の通りです
image.png

プロジェクトを作ると、最初にtest.cppというファイルが出てくると思うので、それを編集していきます。結果的にできたコードがこちら。

test.cpp
#include "pch.h"
#include "gtest/gtest.h"
#include "../qiita google test sample/Library.h"

TEST(EuclidTest, Reverse) {
	EXPECT_EQ(euclid(25, 15), 5);
	EXPECT_EQ(euclid(21, 56), 7);
}

TEST(EuclidTest, Minus) {
	EXPECT_EQ(euclid(-1, 3), -1);
}

ここでVSのテストリボンからテスト設定→ビルド後にテストを実行するに設定すると
ソリューションをビルドしたときに自動でテストを検索して実行してくれます。
それではビルドしてみましょう。なお、テスト結果はテストエクスプローラを使うとわかりやすいです。
予想通り全部レッドですね。
image.png

ここで、Library.hの一行が間違いだったことに気が付きました!

+		return n;
-		return m;

ですね。
これでビルドしなおすと、一つのケースだけグリーンになりました。
この関数では負の値が来たときは-1と返すように定義したいので、そのコードを加えましょう。

image.png

Library.cpp
#pragma once

int euclid(int n, int m) {
        // add
	if (n < 0 || m < 0)
		return -1;
	if (n < m) {
		int tmp = n;
		n = m;
		m = tmp;
	}
	if (m == 0)
		return n;
	return euclid(m, n % m);
}

すると、見事グリーンになりました!

image.png

おわりに

今回はC++で単体テストを行うという内容でした。
自分自身テストに詳しくないので、これを機にちょっと勉強してみようと思います。
最後までご覧いただきありがとうございました。

11
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?