Android 向け 単体テスト UnitTest(JUnit) を作成する



Androidの単体テストは、JUnit をベースとしており、JUnitやCppUnitなどを利用した事がある方にはわかりやすくなってます。Activityをlaunchすることなく テストを行えるのが特徴です。

スポンサードリンク

AndroidManifest.xml の書き方

junitライブラリを使用していることを指定し、「instrumentation」を定義してください。

<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app.tests" android:versionCode="1"
    android:versionName="1.0">
    <application>
       <uses-library android:name="android.test.runner" />
    </application>
    <uses-sdk android:minSdkVersion="3" />

<instrumentation android:name="android.test.InstrumentationTestRunner"
       android:targetPackage="com.sample.app.sampleapp"
       android:label="Tests for My App" />
</manifest>

Android.mk を利用している方(NDKを使用している方など)

Android.mkには、次のように記載してください。「LOCAL_INSTRUMENTATION_FOR」の指定を忘れないでください。

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

# We only want this apk build for tests.
LOCAL_MODULE_TAGS := tests

LOCAL_CERTIFICATE := platform

LOCAL_JAVA_LIBRARIES := android.test.runner

# Include all test java files.
LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_PACKAGE_NAME := SampleJunitTest

LOCAL_INSTRUMENTATION_FOR := TargetTestActivity

include $(BUILD_PACKAGE)

テストを実施するソースコード

作成したアプリのテストを行うためのコードです。全てのメソッドは「test」から始まる必要があります。

Android に特有のオブジェクトをテストするための「AndroidTestCase」の基底クラスは TestCase です。

なお、「AndroidTestCase」を継承したクラス全てのテストを実施されるため、別クラスであっても自動的にテストを行なってくれます。

package com.example.app;

import junit.framework.Assert;
import android.test.AndroidTestCase;

public class SomeTest extends AndroidTestCase {

    @Override
    protected void setUp() throws Exception {
        super.setUp();

        // 最初に実施したい内容
    }

    @Override
    protected void tearDown() throws Exception {
        super.setUp();

        // 最後に実施したい内容
    }

    public void testSomething() throws Throwable {
       Assert.assertTrue(1 + 1 == 2);
    }

    public void testSomethingElse() throws Throwable {
       Assert.assertTrue(1 + 1 == 3);
    }
}

JUnitで用意されているメソッド

テストケースの「成功」「失敗」の評価にはassertメソッドを利用します。

スポンサードリンク

メソッド 内容
assertEquals(arg1, arg2) arg1とarg2が同じ値かどうか判別します。違う場合はFailure(失敗)になります。基本型、オブジェクト型の両方を判別できます。
assertEquals(msg, arg1, arg2) arg1とarg2が同じ値かどうか判別します。値が違う場合はメッセージとしてmsgを表示します。
assertTrue(boolean) 引数がtrueかどうか判別します。falseの場合はFailure(失敗)になります。
assertTrue(String, boolean) 引数がtrueかどうか判別します。falseの場合はメッセージとしてStringの値を表示します。
assertFalse(boolean) 引数がfalseかどうか判別します。trueの場合はFailure(失敗)になります。
assertFalse(String, boolean) 引数がfalseかどうか判別します。trueの場合はメッセージとしてStringの値を表示します。
assertNotNull(Object) 引数がNullでないか判別します。Nullだった場合はFailure(失敗)になります。
assertNotNull(String, Object) 引数がNullでないか判別します。Nullだった場合はメッセージとしてStringの値を表示します。
assertNull(Object) 引数がNullかどうか判別します。Nullでなかった場合はFailure(失敗)になります。
assertNull(String, Object) 引数がNullかどうか判別します。Nullでなかった場合はメッセージとしてStringの値を表示します。
assertSame(Object1, Object2) Object1とObject2が同じオブジェクトを参照しているかどうか判別します。同じオブジェクトでなかった場合はFailure(失敗)になります。
assertSame(String, Object1, Object2)Object1とObject2が同じオブジェクトを参照しているかどうか判別します。同じオブジェクトでなかった場合はメッセージとしてStringの値を表示します。
assertNotSame(Object1, Object2)Object1とObject2が同じオブジェクトを参照していないかどうか判別します。同じオブジェクトだった場合はFailure(失敗)になります。
assertNotSame(String, Object1, Object2)Object1とObject2が同じオブジェクトを参照していないかどうか判別します。同じオブジェクトだった場合はメッセージとしてStringの値を表示します。
fail( ) 強制的にFailure(失敗)になります。
fail(String) 強制的にFailure(失敗)になります。Failure(失敗)だった場合は、メッセージとしてStringの値を表示します。

テストの実施方法

Eclipseを利用する場合

Eclipse を利用して JUnit を起動してください。

コマンドラインで実施する場合

次のコマンドを入力するとテストが開始されます。

adb shell am instrument -w com.example.app.tests/android.test.InstrumentationTestRunner

テスト結果

com.example.app.tests:..
Failure in testSomethingElse:

Test results for InstrumentationTestRunner=...F
Time: 0.02

FAILURES!!!
Tests run: 3,  Failures: 1,  Errors: 0

発生する可能性のあるエラーと対応方法一覧

テスト対象のアプリが存在しない

android.util.AndroidException: INSTRUMENTATION_FAILED: com.example.app.tests/android.test.InstrumentationTestRunnerINSTRUMENTATION_STATUS: id=ActivityManagerService

INSTRUMENTATION_STATUS: Error=Unable to find instrumentation target package: com.sample.app.sampleapp 
INSTRUMENTATION_STATUS_CODE: -1

スポンサードリンク