AndroidStudioのJunit4備忘録

# はじめに

Androidの生産性と品質向上の為に避けては通れない単体テスト。
そんな単体テストの自動化を行うためのフレームワークJunit。

試しに使ってみようと思いましたが使い方が全く分からない。
取りあえず色んなサイトや記事を見て分かった事を簡単にまとめました。


# 環境

+ Windows7 64bit Professional
+ Android Studio 2.1.3
+ Junit4.12


# srcフォルダ直下にあるandroidTestとtestの違い

srcフォルダの直下を見るとandroidTestとtestのフォルダが存在している。
どちらもtestの単語が入っているので違いが分かり辛い。

![Test.PNG](https://qiita-image-store.s3.amazonaws.com/0/112253/3b3502f1-d8d3-a542-b561-c09728dd4045.png)




違いは以下の通り

+ src/androidTest
	+ AndroidのUIを使ったテストを書くためのフォルダ(**Androidに依存**)
	+ GradleでAndroidJUnitRunnerを設定する必要がある
	+ GradleでandroidTestCompileでテスト用のライブラリを指定する必要がある
	+ Android Instrumentation Test(s)と呼ばれている

+ src/test
	+ API呼出用クラスなど**Androidに依存しない**テストを書くためフォルダ
	+ GradleでtestCompileでテスト用のライブラリを指定する必要がある
	+ Unit Test(s)と呼ばれている



# UnitTestを行う

UnitTestはAndroidに依存しないクラスの単体テストを行う事が出来ます。
Android Studioで新規プロジェクトを立ち上げれば、以下のようにGradleに依存関係が組み込まれているのですぐにでも使うことができます。

```
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:24.2.0'
    testCompile 'junit:junit:4.12'
}
```


[AndroidStudioでUnitTestを行う][1] こちらのサイトをまんま使わせて頂きました。
ここから書かれている内容は自分が分からなかった部分を補足してるだけです。



## 新しいプロジェクトを作る

なんでもいいので新しいプロジェクトを作って下さい。
ちなみに自分はこんな感じにしました。

+ Application name: **UnitTest**
+ Company Domain: **hoge**
+ Min SDK: **API19**
+ **Empty Activity**


## テスト用のクラスを追加します

`app/java/hoge.unittest/`直下にCalculator.javaファイルを追加します。
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/112253/18eb8783-cf4a-3f47-e808-37e04643a580.png)

そして下記のようにメソッドを実装します。

```java
package hoge.unittest;

public class Calculator {

    public int sum(int a, int b) {
        return a + b;
    }

    public int substract(int a,int b){
        return 0;
    }
}
```

## Test Artifact
を変更

Test Artifact項目からテストの種類をUnitTestに変更します。
![Test Artifact.PNG](https://qiita-image-store.s3.amazonaws.com/0/112253/245ea515-eef9-2e84-0690-c4d6f4d6deee.png)

Test Artifactの設定が消えている場合は[こちら][2]を参照して下さい。


## テストクラスを新規作成

Calculatorクラスにカーソルを当てるかクラス内で右クリックで`Go To`から`Test`を選択する(あるいは Shit+Ctrl+T)

`Create New Test`を選択する
![create.png](https://qiita-image-store.s3.amazonaws.com/0/112253/cbaee483-744f-839a-5bd2-e962005cc4c4.png)


テスト項目を作りたいメソッドにチェックを入れる
![CreateTest.PNG](https://qiita-image-store.s3.amazonaws.com/0/112253/b956e836-1cfb-c5bb-01d0-04a7d76142b4.png)



`app/java/hoge.unittest(test)/`直下にCalculatorTest.javaが出来る。
![05.PNG](https://qiita-image-store.s3.amazonaws.com/0/112253/dfe2aef2-6b8a-d2fa-61a4-20c797e7a9d0.png)


## 作成されたクラスにテスト記述

```java
package hoge.unittest;

import org.junit.Before;
import org.junit.Test;
 
import static org.junit.Assert.*;
 
public class CalculatorTest {
 
    private Calculator mCalculator;
 
    @Before
    public void setUp() throws Exception {
        mCalculator = new Calculator();
    }
 
    @Test
    public void testSum() throws Exception {
        //予想：1 + 5 で 6が返ってくるはず
        assertEquals(6, mCalculator.sum(1, 5), 0);
    }
 
    @Test
    public void testSubstract() throws Exception {
        assertEquals(2, mCalculator.substract(5, 3), 0);
    }
}
```

assertEquals はテストメソッドと呼ばれるJunitフレームワークが提供するテスト用メソッドです。


## テスト用メソッド

Junit4で使えるテストメソッドは[GithubのjunitチームのWiki][3]にありますがWikiとはメソッドが羅列してあるだけでほとんど説明がないですね(まぁよく見ればどんなメソッドか何となく分かりますが)

## 代表的なJUnit4のアノテーション

初めてならこっちの方の理解が重要かも

+ @Test
	+ テストメソッドの宣言
	+ 引数を保たないpublicメソッドにする
	+ @Test(expected=Exception.class)で例外がでるテスト
+ @Before
	+ メソッド名は setUp で定義されている
	+ 初期化 メソッド実行前の処理(**メソッド毎に必ず呼ばれる**)
	+ 引数を保たないpublicメソッドにする
+ @After
	+ メソッド名は tearDown で定義されている
	+ 後処理 メソッド実行後の処理(**メソッド毎に必ず呼ばれる**)
	+ 引数を保たないpublicメソッドにする
	+ 必ず行わなければならない後処理を記載する
+ @Ingnore
	+ テスト実行除外
	+ 一時的に実行したくない時に使う


## テスト起動

テストは、CalculatorTestクラスにカーソルを当てるかクラス内で右クリックで`Run CalculatorTest`を選択する(あるいは Shit+Ctrl+F10)


成功時画面
![success.PNG](https://qiita-image-store.s3.amazonaws.com/0/112253/21734392-2711-d93e-f82d-15ca4fc520ec.png)



失敗時画面
![Faild.PNG](https://qiita-image-store.s3.amazonaws.com/0/112253/b452485c-6e30-b50d-8967-19c126250a25.png)




一見面倒ですが、一度テストを作ってしまえば使い回しが聞くので効率は上がると思います。


[1]: http://blog.anysense.co.jp/app/androidunittest/
[2]: http://qiita.com/boohbah/items/4cdcdf41faab26c3c8d2
[3]: https://github.com/junit-team/junit4/wiki/Assertions