環境構築から始めるテスト駆動開発 ~Java開発環境を構築する~

## はじめに

これは [環境構築から始めるテスト駆動開発 ~ プログラミング環境の共通基盤を構築する ~](https://qiita.com/k2works/items/19d037814875b3a03eb3) の開発言語セットアップ記事です。Windows 10 Home で共通基盤が構築されていることを前提としています。

<!-- more -->

## インストール

スタートメニューから `Windows PowerShell` を選択します。

![](https://github.com/k2works/k2works.github.io/blob/source/docs/images/asciidoc/tdd_env/pkg-001.png?raw=true)

パッケージ管理ツールをインストールします。

```powershell
> scoop install gradle
```

バージョンを確認しておきます。

```powershell
> gradle -v
Welcome to Gradle 6.8.3!

Here are the highlights of this release:
 - Faster Kotlin DSL script compilation
 - Vendor selection for Java toolchains
 - Convenient execution of tasks in composite builds
 - Consistent dependency resolution

For more details see https://docs.gradle.org/6.8.3/release-notes.html


------------------------------------------------------------
Gradle 6.8.3
------------------------------------------------------------

Build time:   2021-02-22 16:13:28 UTC
Revision:     9e26b4a9ebb910eaa1b8da8ff8575e514bc61c78

Kotlin:       1.4.20
Groovy:       2.5.12
Ant:          Apache Ant(TM) version 1.10.9 compiled on September 27 2020
JVM:          11.0.10 (AdoptOpenJDK 11.0.10+9)
OS:           Windows 10 10.0 amd64
```

## Hello world

### プログラムを作成する

`Projects` フォルダ内に `Java` フォルダを作成してエディタからフォルダを開きます。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/001.png?raw=true)

`新しいターミナルを` を実行してターミナルに以下のコマンドを入力します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/002.png?raw=true)

```powershell
> gradle init --type java-application
```

`Select build script DSL` は `1:Groovy` で `Select test framework` は `4: JUnit Jupiter` を指定して `Project name` と `Source package` はそのままで実行します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/003.png?raw=true)

`src/test/java/AppTest.java` を開きます。
ファイルを開くと画面左下に Java プロジェクト読み込みの確認メッセージが表示されるので `Yes` を押します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/004.png?raw=true)

読み込みが完了したら `Run Test` と表示されるのでそこを押します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/005.png?raw=true)

`アクセスを許可する` を押します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/006.png?raw=true)

サイドメニューの `テスト` から実行結果を確認できます。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/007.png?raw=true)

`AppTest.js` ファイルを以下のコードに書き換えます。

```Java
package Java;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class AppTest {
    @Test
    void 何か便利なもの() {
        assertEquals(true, false);
    }
}
```

`Run Test` を押してテストを実行します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/008.png?raw=true)

テストをパスするようにコードを修正してプログラムを実行します。

```Java
package Java;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class AppTest {
    @Test
    void 何か便利なもの() {
        assertEquals(true, true);
    }
}
```

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/009.png?raw=true)

テスティングフレームワークの動作が確認できたので `helloWorld` メソッドの作成に入ります。まず以下のコードを追加して テストが失敗することを確認します。

```Java
package Java;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class AppTest {
    @Test
    void 何か便利なもの() {
        assertEquals(true, true);
    }

    @Test
    void 簡単な挨拶を返す() {
        assertEquals("Hello from Java", Program.helloWorld());
    }
}
```

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/010.png?raw=true)

`Program` クラスに `helloWorld` メソッドを 追加してテストをパスさせます。

```Java
package Java;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class AppTest {
    @Test
    void 何か便利なもの() {
        assertEquals(true, true);
    }

    @Test
    void 簡単な挨拶を返す() {
        assertEquals("Hello from Java", Program.helloWorld());
    }
}

class Program {
    static String helloWorld() {
        return "Hello from Java";
    }
}
```

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/011.png?raw=true)

指定された名前で挨拶を返すようにします。

```Java
package Java;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class AppTest {
    @Test
    void 何か便利なもの() {
        assertEquals(true, true);
    }

    @Test
    void 簡単な挨拶を返す() {
        assertEquals("Hello from Java", Program.helloWorld());
    }

    @Test
    void 指定された名前で挨拶を返す() {
        assertEquals("Hello from VSCode", Program.helloWorld("VSCode"));
    }
}

class Program {
    static String helloWorld() {
        return "Hello from Java";
    }
}
```

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/012.png?raw=true)

関数に引数を追加します。

```Java
package Java;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class AppTest {
    @Test
    void 何か便利なもの() {
        assertEquals(true, true);
    }

    @Test
    void 簡単な挨拶を返す() {
        assertEquals("Hello from Java", Program.helloWorld());
    }

    @Test
    void 指定された名前で挨拶を返す() {
        assertEquals("Hello from VSCode", Program.helloWorld("VSCode"));
    }
}

class Program {
    static String helloWorld(String name) {
        return String.format("Hello from %s", name);
    }
}
```

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/013.png?raw=true)

`指定された名前で挨拶を返す` テストはパスしましたが今度は `簡単な挨拶を返す` テストが失敗するようになりましたのでメソッドをオーバーロードしてテストをパスするようにします。

```Java
package Java;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class AppTest {
    @Test
    void 何か便利なもの() {
        assertEquals(true, true);
    }

    @Test
    void 簡単な挨拶を返す() {
        assertEquals("Hello from Java", Program.helloWorld());
    }

    @Test
    void 指定された名前で挨拶を返す() {
        assertEquals("Hello from VSCode", Program.helloWorld("VSCode"));
    }
}

class Program {
    static String helloWorld() {
        return "Hello from Java";
    }

    static String helloWorld(String name) {
        return String.format("Hello from %s", name);
    }
}
```

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/014.png?raw=true)

仕上げに不要なテストを削除してテストケースの文言をわかりやすくしておきます。

```Java
package Java;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class AppTest {
    @Test
    void 何も指定していない場合は既定の挨拶を返す() {
        assertEquals("Hello from Java", Program.helloWorld());
    }

    @Test
    void 指定された名前で挨拶を返す() {
        assertEquals("Hello from VSCode", Program.helloWorld("VSCode"));
    }
}

class Program {
    static String helloWorld() {
        return "Hello from Java";
    }

    static String helloWorld(String name) {
        return String.format("Hello from %s", name);
    }
}
```

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/015.png?raw=true)

### プログラムをデバッグする

まず確認したいプログラムの行を左部分を押してブレークポイント（赤丸）を設定します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/016.png?raw=true)

ブレークポイントを設定したら `Debug Test` を押してプログラムの実行します。そうするとブレークポイント部分でプログラムが停止して変数などの情報が確認できるようになります。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/017.png?raw=true)

画面上の実行ボタンを押すと次のブレークポイントに移動します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/018.png?raw=true)

デバッガを終了するには終了ボタンを押します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/019.png?raw=true)

ブレークポイントを再度押すことで解除ができます。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/020.png?raw=true)

### プログラムをリポジトリに保存する

ソース管理を選択して `リポジトリを初期化する` を押します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/021.png?raw=true)

`全ての変更をステージ` を選択します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/022.png?raw=true)

変更内容に `feat: HelloWorld` と入力して `コミット` を押します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/022.png?raw=true)

変更内容は `ソース管理` から確認できます。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/024.png?raw=true)

## GitHub に公開する

続いて、GitHub を使ってレポジトリを外部に公開できるようにしてみましょう。

まず、[GitHub](https://github.com/) でレポジトリを作成します。

ログインしたら画面右上の+マークから `New repository` を選択します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/025.png?raw=true)

レポジトリ名は `hello-java` として `Public` で公開します。 公開したくない場合は `Private` を選択します。
`Add a README file` にもチェックを入れておきます。
最後に `Create repository` を押して公開レポジトリを作成します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/026.png?raw=true)

公開レポジトリが作成されたら VSCode から読み込めるようにするためリンク先の情報を取得します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/027.png?raw=true)

クリップボードのアイコンをクリックするとレポジトリの URL がコピーできます。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/028.png?raw=true)

続いて VSCode に戻り、`表示` メニューから `コマンドパレット` を選択します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/029.png?raw=true)

`clone` と入力して `Git クローン` を選択します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/030.png?raw=true)

リポジトリの URL へ先ほどコピーした公開レポジトリの URL を貼り付けます。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/031.png?raw=true)

公開レポジトリの保存場所を指定する必要があるのでここでは `Projects` フォルダに `GitHub` フォルダを追加してそこに保存することにします。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/032.png?raw=true)

チェックアウトが終わると画面左下に通知が出ますので `開く` を押します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/033.png?raw=true)

準備ができましたので先ほどやった `HelloWorld` プログラムをもう一度作成して先ほどと同様にローカルレポジトリに保存します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/034.png?raw=true)

ローカルレポジトリの内容を GitHub の公開レポジトリに登録します。`表示` メニューから `コマンドパレット` を選択します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/035.png?raw=true)

`push` と入力して `Git プッシュ` を選択します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/035.png?raw=true)

以下の GitHub 認証画面が表示された場合は `Sign in with your browser` を押します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/037.png?raw=true)

`Authorize GitCrendtialManager` を押します。

![](https://github.com/k2works/k2works.github.io/blob/source/docs/images/asciidoc/tdd_env/ruby-win-github-014.png?raw=true)

GitHub アカウントのパスワードを入力します。

![](https://github.com/k2works/k2works.github.io/blob/source/docs/images/asciidoc/tdd_env/ruby-win-github-015.png?raw=true)

![](https://github.com/k2works/k2works.github.io/blob/source/docs/images/asciidoc/tdd_env/ruby-win-github-016.png?raw=true)

認証が完了してローカルレポジトリの内容が公開レポジトリに登録されました。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/038.png?raw=true)

内容が反映されているかをブラウザ画面から確認します。

![](https://github.com/k2works/k2works.github.io/blob/source/blog/source/_posts/1617875568/039.png?raw=true)