Cソースコードのテスト自動化をgoogletestで行う(VSCodeでgoogletestを実行する編)(2/3)

#概要
Cソースコードのテスト自動化をgoogletestで行うの2記事目です。
本記事では、VSCodeで環境構築し、Cソースコードに対して[1記事目](https://qiita.com/denden14/items/bd1d313bf57f806bba9d)でインストールしたgoogletestを用いてテストを実行します。

VSCodeでのプロジェクトの構築、ビルド設定、オブジェクトコードの実行について知りたい方にも役に立てばと思います。

##全体の流れ
1. [googletest導入編](https://qiita.com/denden14/items/bd1d313bf57f806bba9d)
1. [__VSCodeでgoogletestを実行する編__(本記事の内容)](https://qiita.com/denden14/items/9594e7309167e82933e4)
 1. サンプルプログラムの作成
 1. ビルドの設定
 1. 実行
 1. ソースコードの修正
 1. intellisenseの設定
1. テスト自動化(作成予定でしたが、[別記事](https://qiita.com/denden14/items/30cbe6d327a404aaa2a7)で似た内容を記載しました。)
 1. GitHubの導入
 1. Jenkinsサーバーの導入

#VSCodeのプロジェクト作成
#C/C++ for Visual Studio Codeのインストール
VSCodeの拡張機能から、C/C++を検索し、インストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538059/7c4ff8e2-02fb-71ce-6f0f-c69544363c64.png)


##サンプルプログラムの作成
適当なフォルダを作成し、VSCodeのファイルからフォルダーを開くを選択します(今回は"googletestPrj"フォルダで勧めます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538059/f3cfab08-fd14-3ed6-10a1-85d82169de80.png)


テスト用サンプルスクリプトを作成します
__addTest.cc__

```
#include <gtest/gtest.h>
#include "add.h"

TEST(AddTest, onePlusTwoGivesThree){
    EXPECT_EQ(3, add(1,2));
}
```

次に、テスト対象ファイルを作成します
__add.c__

```
#include "add.h"

int add(int i1, int i2){
    return 0;
}
```

__add.h__

```
#ifndef ADD_H_
#define ADD_H_

#ifdef __cplusplus
extern "C" {
#endif
int add(int i1, int i2);

#ifdef __cplusplus
}
#endif

#endif /* ADD_H_*/
```

##ビルドの設定
コマンドパレットを開き(Ctrl + Shift + P)、
__Tasks: Configure Task → テンプレートから tasks.json を生成 → Others 任意の外部コマンドを実行する例__ を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538059/ffd868af-a785-c23f-a970-87a1427cf5ec.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538059/524a041b-27e5-71bd-739d-22b9ae1f1d6c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538059/2d08d246-0ab3-f4e2-38ff-ad5daeec16c3.png)



テンプレートが作成されるので、下記のように修正

- "command" : シェルを実行するコマンド。(g++が無い場合は適宜インストールしてください。)
- "args" : コンパイラに渡す引数
 - "\*.c" "\*.cc" → コンパイル対象。
 - "-g" → デバッグ時にブレイクを貼るため
 - "-pthread" "-lgtest_main" "-lgtest" → googletestとのリンクに必要
- "group" : "kind"属性を"build"にすることで、"Ctrl + Shift + b"押下時にこのtasks.jsonが実行されるようになる

```
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "addTest",
            "type": "shell",
            "command": "g++",
            "args": [
                "add.c",
                "addTest.cc",
                "-g",
                "-pthread",
                "-lgtest_main",
                "-lgtest",
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}
```
__Ctrl + Shift + B__ でビルドを実行すると、a.outが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538059/02be3782-c824-a72e-5a83-96e71d343467.png)


##実行
作成したa.outを実行しましょう。
デバッグの開始(F5)を押し、
__C++(GDB/LLDB)__ を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538059/6fa035b2-6279-db00-8192-b35e0a22d179.png)

テンプレート(launch.json)が作成されるので、下記のように修正

- "program" : 実行するプログラム。今回のファイルパスに修正

```
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 起動",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/a.out",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "gdb の再フォーマットを有効にする",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}
```

実行!!(Ctrl + F5)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538059/448c0b27-6976-45c3-879e-fed4b724fc2c.png)

うまく行けば、ターミナル上で、テストが失敗したことが表示されます。

##ソースコードの修正
__add.c__にバグが潜んでいるので修正しましょう

```
#include "add.h"

int add(int i1, int i2){
    return i1 + i2;
}
```
__Ctrl + Shift + B__ で再度ビルドし、
__Ctrl + F5__ で実行！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538059/15a08d72-6bb4-4818-d832-4cf63194c9b7.png)
無事テストが通りました。

##intellisenseの設定
赤波線があって気持ち悪いので消します。
コマンドパレットを開き(Ctrl + Shift + P)、__C/C++: Edit Configurations(JSON)__を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538059/15939173-1e52-5cc3-7703-1e3154602a7d.png)

c_cpp_properties.jsonが作成されるので下記の様に設定し、intellisenseの設定をします。

```
{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu11",
            "cppStandard": "gnu++14",
            "intelliSenseMode": "gcc-arm"
        }
    ],
    "version": 4
}
```
無事、消えました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538059/c9482259-6b2d-777a-7fa1-3ed122bc3b48.png)