・ビルドツール(build.gradle)のバージョンが1.0.0以上の必要がある。
・ビルドタイプが「debug」でしかテストされない。「release」でも行いたい場合は下記を追加する。
android { // ... testBuildType "release" }
・build.gradle(app)
android { defaultConfig { // ... testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"\\ } }
dependencies { // ... // testing libs androidTestCompile 'com.android.support:support-annotations:23.0.0'\\ // runner及びrulesはtestingライブラリより分割された (旧:testing-support-lib)\\ androidTestCompile 'com.android.support.test:runner:0.3'\\ androidTestCompile 'com.android.support.test:rules:0.3'\\ }
パッケージ名(androidTest)ディレクトリにテストコードを作成します。
デフォルトでApplicationTestというクラスが生成されている場所です。
- JUnit 4 で実装されたテストクラスには @RunWith(AndroidJUnit4.class) をつける
- テスト対象メソッドには @Test をつける
- setUp() を Override し、public に変更し @Before をつける
- tearDown() を Override し、public に変更し @After をつける
- 必要に応じて AndroidTestCase.setContext(InstrumentationRegistry.getContext()) や\\InstrumentationTestCase.injectInstrumentation(InstrumentationRegistry.getInstrumentation()) を setUp() で行う
———————————
@RunWith(AndroidJUnit4.class) public class MetricsTest extends AndroidTestCase { @Before public void setUp() throws Exception { super.setUp(); // instrumentation のパッケージContext setContext(InstrumentationRegistry.getContext()); } @Test public void something() throws Exception { ... } @After public void tearDown() throws Exception { super.tearDown(); } }
予測, 実際
assertEquals(expected, actual);
実際, 予測
assertThat(actual, is(expected));
上記は「import static org.hamcrest.CoreMatchers.*;」が必要。
Junit4はこっちを推奨してる?
run > setting (実行 > デバッグ設定)
+を押下
Android Tests
名前を入力
Moduleでappを選択
USBデバイスでテストを実行する場合は、USB Deviceにチェックを入れる
適用 > OK
いつもどおり実行。
APIから値を取得し、その結果によって何らかの振る舞いを行う場合の流れの例
1~5の流れをひとまとめにしてテストするのは難しそう。
別々に考えれば可能だが、どれをテスト対象とするのか決めておく必要がある。
1.リクエスト関数
in:APIの引数など
out:なし
2.実際に接続処理を行うHttpClientやURLConnection. (ライブラリの場合もある)
in:request
out:response
3.コールバック待ちの無名クラス, メンバ変数など
in:APIからの戻り
out:APIからの戻り
4.JSONをパースする関数
in:APIからの戻り
out:なんらかのオブジェクト
5.得た結果を処理するビジネスロジック関数
in:なんらかのオブジェクト
out:実装による
ここをテストする場合は、inをモックに置き換える
@Test public void something() throws Exception { /** * モックの生成 */ SomeClass mockedSome = mock(SomeClass.class); /** * テストしたいビジネスロジックを記述する(対象のコードと同じコード) * 但しそこで取り扱うオブジェクトは、上記のモックに置き換わる * * ※対象のコードを変更した場合は、テストコードも同じ用に修正する必要がある。 * outがある関数を呼び出す場合は、outを検証するだけで良い */ }
Android JUnit 4 形式のテストにする
http://y-anz-m.blogspot.jp/2015/08/androidjunit-4.html
Build High-Quality Apps
https://google.github.io/android-testing-support-library/
Building Instrumented Unit Tests
https://developer.android.com/intl/ja/training/testing/unit-testing/instrumented-unit-tests.html
テスト - Mixi AndroidTraining
http://mixi-inc.github.io/AndroidTraining/fundamentals/2.11.testing.html