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


はじめに

先日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

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

テストを導入する

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

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

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

プロジェクトを作ると、最初に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のテストリボンからテスト設定→ビルド後にテストを実行するに設定すると
ソリューションをビルドしたときに自動でテストを検索して実行してくれます。
それではビルドしてみましょう。なお、テスト結果はテストエクスプローラを使うとわかりやすいです。
予想通り全部レッドですね。

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

+       return n;
-       return m;

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

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);
}

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

おわりに

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