AndroidをUnitTestする

Androidのテスト環境について

Unitテストをやりたい場合。
JUnitテストを行うやり方についてのメモ。
AndroidStudioを使ってることを前提とします。

まず、build.gradleのdependenciesですが、
これまでだとEspressoなどを使う必要があったのですが、
androidのsupport packageに追加されているtesting-support-libに統合されたようです。

Testing Support Library

support packageに追加されたtesting-support-libを使ってAndroidのテストをJUnit4で書く

ということなのでdependenciesには
androidTestCompile ‘com.android.support.test:testing-support-lib:0.+’
のみ追加。

それとdefaultConfig
testInstrumentationRunner “android.support.test.runner.AndroidJUnitRunner”
を追加してください。
これはJUnit4を動かすには必要なようです。
もしJUnit3だけであればなくても動くのですが、今回はJUnit4を使ってみるので入れておきます。

 

この状態で実行してみると、つぎのようなエラーが出るかもしれません。

Error:duplicate files during packaging of APK /Users/…/build/apk/app-debug-androidTest-unaligned.apk
Path in archive: LICENSE.txt

下記のようにbuild.gradleにのandroid{ のなかに追加してください
エラーに出てるファイル、もしくはパス名を下記のように付け加えればOK

android {
    ~~  
    packagingOptions {
        exclude 'LICENSE.txt'
    }

環境によっては’META-INF/LICENSE.txt’になるかも。

そうするとこんなかんじになります。↓

 android {
    ~~

    defaultConfig {
           ~~

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }


    packagingOptions {
        exclude 'LICENSE.txt'
    }
}

dependencies {
    ~~

    androidTestCompile 'com.android.support.test:testing-support-lib:0.+'
}

 

UnitTestの書き方

AndroidStudioがいろいろと手伝ってくれます。
テストしたいクラスにカーソルをあわせた状態で[ALT+Enter](デフォルト設定の場合)
ここではScheduleListItemという適当なクラスをテストしてみることにします。ただのプレインオブジェクトです。
キャプチャ
そのままCreate Test

 

ダイアログが出て、ここで好きなテストフレームワークをとオプションが選べます。
testing-support-libで、JUnit4が使えるようになったということでJUnit4にしてみましょう。
JUnit4の場合、クラスの継承はしないのでSuperClassが空になりますが、ご心配なく。
setUptearDownはテストの最初と最後に実行される関数です。
とりあえず作ってもらったら楽なのでチェック。
下のメンバー関数は特にチェックしなくてもよいかも。
キャプチャ2

保存先を聞かれるけどそのままでOKでしょう。
src/androidTest/java/~~/**Test.javaが作られます。

public class ScheduleListItemTest {
	@Before
	public void setUp() throws Exception {

	}

	@After
	public void tearDown() throws Exception {

	}
}

テストを書く

テストを追加したい場合はメンバ関数を以下のように追加して
assert文を書けばOK

	@Test
	public void foo() throws Exception {
             assertEquals("31", day);
	}

JUnit4の使い方についてはここでは詳しく説明しませんが他のサイトで勉強してみてください。
参考:http://d.hatena.ne.jp/megascus/20130622/1371879646

 

assert文を書く場合、static importで
import static junit.framework.Assert.assertEquals;
を追加するといいです。これがないとAssert.assertEquals()のように書かないといけないので。

 

 

かんたんなテストのサンプルを書いてみます。
あんまり良いサンプルではないですが許してください。

import static junit.framework.Assert.assertEquals;

public class ScheduleListItemTest {

	private ScheduleListItem item;
	@Before
	public void setUp() throws Exception {
		item = new ScheduleListItem();
	}

	@After
	public void tearDown() throws Exception {
		//最後になんかする場合はここで。
	}

	@Test
	public void foo(){
		item.set(5, 8, "5/8日のすけじゅーる");
		
		assertEquals(5, item.getMonth());
		assertEquals(8, item.getDay());
		assertEquals("5/8日のすけじゅーる", item.getTitle());
	}
}

最初にsetUp()が実行され、itemがnewされます。
次にfoo()が実行され、各assert文が実行されます。
itemにセットした値が正しく入ってるかチェックしてるって感じです。

 

実行の設定

テストの実行に当たっての設定です。
まず実行ボタンの左のメニューよりEditConfigurationsを選んでください。
キャプチャ3

 

次に+ボタンからAndroid Testsを選択!
キャプチャ4

 

新しいテストの実行の設定が作られました。
キャプチャ5
名前がUnnamedになっているので、好きな名前に変えてOKです。
Moduleになってるので、テストするモジュールを選択してください。

テスト範囲が選べます
[All in Module]AndroidTestに入ってるモジュール全部。実行
[All in Package]パッケージを指定して、実行
[Class]クラスをひとつ指定して実行
[Method]メソッドを指定して実行

ここでは全部ということでAll in Moduleを選択しました。

 

TargetDevice
テストを実行するのにも、Androidデバイスが必要なので、
それぞれ実機を使うか、エミュレーターを使うか、ダイアログでその都度選ぶかするか、
などの選択肢です。
いつも実行するときに選択しているものにしておけばよいでしょう。

設定が終わったらOK

テスト実行!

今作成した実行設定を選んで、RUN!!!
キャプチャ6

こんなかんじでテストが実行されます。
オールグリーン!
キャプチャ7

コンテキストが必要な場合は・・・?

例えばActivityをテストしたい場合や、ファイルの読み書きのテストをしたい場合、
androidのAPIにアクセスするためにcontextを渡さなければいけないので、今回のようにはできません。
ActivityInstrumentationTestCase2というクラスなどを継承して作らなければいけないのですが、
それはまた次回に・・・・


トラックバックURL  -  http://mashi.exciton.jp/archives/69/trackback