Androidアプリ テストの設定と実装方法

2016年03月29日(編集2016年05月08日)
このエントリーをはてなブックマークに追加

Androidアプリのテストは、長い時間をかけて進化してきました。
そのため、ググっても情報が交錯していて、わかりにくいのが実情です。
ここでは、現時点(Android 6.0 (API level 23))でのテストに関する情報をまとめました。
環境はAndroid 6.0 (API level 23) です。

環境

  • Android sdk 23
  • Build Tools, Revision 23.0.2

Androidアプリのテスト

アプリの開発には、いろいろな種類のテストがあります。もし、あなたがアプリの開発をする場合、一般的には以下のようなテストを実施するはずです。

  • 単体テスト
  • 機能テスト
  • 結合テスト

テスト工程の名称は、各プロジェクトにより異なると思います。しかし、最終的にリリースするまでに、複数のテスト工程で合格する必要があります。

androidには、製品の品質を担保するためのテストが用意されています。
このテストは、プログラミングコードで記述します。

テスト内容をコードで記述することで、自動で繰り返しテストを実行できます。そのため、変更や修正に強いアプリがつくれます。
しかし、Androidのテストは試行錯誤の繰り返しで進化してきたため、非常にわかりにくくなっています。

なので、ここではAndroid 6.0 (API level 23)で、テストコードを書くことを想定して説明を行います。

複数の単体テスト

単体テストはクラスやメソッド単位のプログラムのテストです。 メソッドが実装通りに動くか、動作や戻り値が適切かを確認します。
また、単体テストは、ユニットテストとも呼ばれます。

Androidには複数の単体テストが用意されています。それは以下の通りです。

ローカルユニットテストは、文字通りローカルで実行可能なテストです。このテストの実行にはエミュレーターやandroid端末を必要としません。

インストラメンテッドユニットテストは、エミュレーターやandroid端末で実行可能なテストです。このテストの実行には端末を必要とします 。端末なしではテストは実行できません。

androidの単体テストは、この二つのテストを組み合わせてテストコードを実装します。

ローカルユニットテスト(Local Unit Tests)

ローカルユニットテストは、端末やエミュレーターを使わないローカルで完結するテストです。ユーティリティクラスやビジネスロジッククラスをテストするのに使います。
一方で、Activity, Intent, Context等の、端末やエミュレーターが必要となるテストは実装しません。

インストラメンテッドユニットテスト(Instrumented Unit Test)

インストラメンテッドユニットテストでは、アクティビティやsqliteのロジックをテストします。
つまり、端末やエミュレーターを使用するテストです。なのでActivity, Fragment, database等を使うテストを実行します。

ローカルユニットテスト(Local Unit Tests)の準備

ローカルユニットテストの準備方法を説明していきます。まずは必要なライブラリを導入します。ライブラリの導入にはgradleを使います。

{project_folder}/app/build.gradle
android {
    defaultConfig {
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
}

dependencies {
    //  Dependencies for unit tests which reside in the "tests" src folder.
    testCompile 'junit:junit:4.12'
    testCompile 'com.android.support.test:runner:0.4'
    testCompile 'com.android.support.test:rules:0.4'
    testCompile 'org.mockito:mockito-core:1.10.19'
    testCompile 'org.hamcrest:hamcrest-core:1.3'
    testCompile 'com.android.support:support-annotations:23.2.0'
}
        

ローカルユニットテストの設定はtestCompileを指定します。
testCompileで指定したライブラリは、app/src/test/配下に配置したテストコードで利用することができます。

ローカルユニットテスト(Local Unit Tests)の実装

ローカルユニットテスト(Local Unit Tests)はjunit4で実装します。mockitohamcrestも当然利用できます。
以下のように実装します。

{project_folder}/app/src/test/java/com/sample/app/ExampleUnitTest.java
package com.sample.app;

import org.junit.Test;

import static org.junit.Assert.*;

public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}
        

@Testはアノテーションです。Junit4は、アノテーション@Testをメソッドに付加すると、メソッドをテストメソッドとして認識し、テストを実行します。

試しに上記のテストを実行してみましょう。
ターミナルでgradleコマンドを使ってtestを実行します。

{project_folder}
// project_folderに移動
cd {project_folder}

// ローカルユニットテストテスト実行
./gradlew test

// something
:app:test

BUILD SUCCESSFUL

Total time: 23.211 secs
        

正常終了のメッセージ「BUILD SUCCESSFUL」が表示されたら、テスト結果の出力されたhtmlレポートを確認します。デフォルトの出力箇所は、

{project_folder}app/build/reports/tests/debug/index.html

です。

テストの結果がhtmlレポートで確認できました。
次はインストラメンテッドユニットテストを実行します。

インストラメンテッドユニットテスト

関連記事

タグ検索で調べてみよう

Android6.0 Test