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が空になりますが、ご心配なく。
setUpとtearDownはテストの最初と最後に実行される関数です。
とりあえず作ってもらったら楽なのでチェック。
下のメンバー関数は特にチェックしなくてもよいかも。
保存先を聞かれるけどそのままで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を選んでください。
新しいテストの実行の設定が作られました。
名前がUnnamedになっているので、好きな名前に変えてOKです。
Moduleが
テスト範囲が選べます
[All in Module]AndroidTestに入ってるモジュール全部。実行
[All in Package]パッケージを指定して、実行
[Class]クラスをひとつ指定して実行
[Method]メソッドを指定して実行
ここでは全部ということでAll in Moduleを選択しました。
TargetDeviceは
テストを実行するのにも、Androidデバイスが必要なので、
それぞれ実機を使うか、エミュレーターを使うか、ダイアログでその都度選ぶかするか、
などの選択肢です。
いつも実行するときに選択しているものにしておけばよいでしょう。
設定が終わったらOK!
テスト実行!
コンテキストが必要な場合は・・・?
例えばActivityをテストしたい場合や、ファイルの読み書きのテストをしたい場合、
androidのAPIにアクセスするためにcontextを渡さなければいけないので、今回のようにはできません。
ActivityInstrumentationTestCase2というクラスなどを継承して作らなければいけないのですが、
それはまた次回に・・・・
[…] AndroidをUnitTestする […]