・ビルドツール(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