読者です 読者をやめる 読者になる 読者になる

こいばな - riskriskと時々鼻メガネ -

正式名称は「どすこい!鼻メガネ会長のいつでも土俵際!」です。ソフトウェア開発に関することを書いています。

Androidのユニットテスト

最近、Androidをやることになったわけで、いままでほぼ触ったことの無い
Javaさんに触れる機会を貰いました。
プログラムとしてはそんなに難しいとは思わないのだけど、パッケージだったり
インポートだったり、Jarだったり、そんなところで色々悩まされています。

で本題ですが

作るからには、ユニットテストをやるってことで色々調べ始めました。
まずビックリしたのがEclipse経由でユニットテストをするのに、なぜかActivityが必要っていう。

そもそもユニットテストするのに、なぜActivityに縛られるのか疑問だけど
そういうもんだと理解することにしました(調べた限り、そういうのしか出てこない・・・)

悔しがってもしょうがないので、テストを実行するところまで。
あと、別にActivityのテストしたいワケじゃないので、Activityに縛られない
Junitを使ったテストについてまとめておこう。

ユニットテスト環境の作り方

Androidのインストールとか

このへんは、探すと山ほど出てくるので。
Eclipse入れて、Android-sdkぶっこんで・・・)

Targetのアプリケーションを作る

あまり気にせず、Target用のアプリケーションを作ります。
Activity自体にあんまり意味はなくて、とりあえずモジュールのユニットテストしたいだけなので。

上部メニューから「ファイル」→「新規作成」→「その他」を選んで

Android アプリケーション・プロジェクト」を選んで
f:id:riskrisk:20140202191806p:plain

さっくさっくと、Activityを作ります。

f:id:riskrisk:20140202191944p:plain

f:id:riskrisk:20140202192051p:plain

出来上がったActivityのサンプルをエミュレータあたりで実行して
なんか立ち上がればOK

実行ボタン押して、「Androidアプリケーション」
f:id:riskrisk:20140202192429p:plain

こんなかんじで、立ち上がるよ。
f:id:riskrisk:20140202193206p:plain

テスト用のアプリを作る

ここからが本番。
前項で作ったアプリケーションに対してテストを作成するよ。

さっきと同じ感じで
上部メニューから「ファイル」→「新規作成」→「その他」を選んで

Android テスト・プロジェクト」を選ぶよ。
f:id:riskrisk:20140202194257p:plain

テストプロジェクトの名前は適当で。

f:id:riskrisk:20140202194620p:plain

対象のアプリケーションにさっき作ったActivityを選択します。
f:id:riskrisk:20140202215415p:plain

で、ここまで出来ると、ほぼテスト環境が完成という。

実際にテストを書いてみる

実際、TargetActivityに書いてあるimportが可能なクラスなら、何でもテスト可能です。
なんでかというと、Testアプリのビルドパスに、TargetActivityが指定されてるから。

f:id:riskrisk:20140202215739p:plain

試しに、テストを書いてみます。

まず、TargetTestを右クリックして、「新規」→「Junitテストケース」を選択
テストクラスを作ります。
f:id:riskrisk:20140202220352p:plain

こんなかんじのコードを。

package com.riskrisk.test;

import junit.framework.TestCase;

import com.riskrisk.Calc;

public class TargetTest extends TestCase {

	public void testPlus() {
		Calc calc = new Calc();
		assertEquals(3, calc.plus(1,2));
	}
}

当然テストしかないから、Calcクラスを作るんで
TargetActivityに、Calcクラスを。

package com.riskrisk;

public class Calc {

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

こんな感じ。

出来上がったら、TargetTest側で、「Android JUnit Test」を実行してみると

f:id:riskrisk:20140202224101p:plain
こんなかんじで失敗するから

コードを修正してみる

public class Calc {

	public int plus(int a, int b) {
		return 3;
	}
}

そうすると、こんな感じでテストが通るってさ。

f:id:riskrisk:20140202224353p:plain

あとでMockの話も少し書こう